diff --git a/CDisplayTable.cs b/CDisplayTable.cs deleted file mode 100644 index 5f28270..0000000 --- a/CDisplayTable.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Classes/CSQLiteDB.cs b/Cell-by-Cell and DB/CSQLiteDB.cs similarity index 100% rename from Classes/CSQLiteDB.cs rename to Cell-by-Cell and DB/CSQLiteDB.cs diff --git a/Cell-by-Cell and DB/FormForModelsHistory.Designer.cs b/Cell-by-Cell and DB/FormForModelsHistory.Designer.cs new file mode 100644 index 0000000..7bcd752 --- /dev/null +++ b/Cell-by-Cell and DB/FormForModelsHistory.Designer.cs @@ -0,0 +1,213 @@ +namespace HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms +{ + partial class FormForModelsHistory + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForModelsHistory)); + this.listViewForClassifHistory = new System.Windows.Forms.ListView(); + this.columnHeaderModelName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderNumFolds = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderMeanError = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonOk = new System.Windows.Forms.Button(); + this.richTextBoxModel = new System.Windows.Forms.RichTextBox(); + this.tabControl = new System.Windows.Forms.TabControl(); + this.tabPageModel = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.richTextBoxCV = new System.Windows.Forms.RichTextBox(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl.SuspendLayout(); + this.tabPageModel.SuspendLayout(); + this.tabPage2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // listViewForClassifHistory + // + this.listViewForClassifHistory.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.listViewForClassifHistory.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderModelName, + this.columnHeaderNumFolds, + this.columnHeaderMeanError}); + this.listViewForClassifHistory.FullRowSelect = true; + this.listViewForClassifHistory.GridLines = true; + this.listViewForClassifHistory.Location = new System.Drawing.Point(3, 3); + this.listViewForClassifHistory.MultiSelect = false; + this.listViewForClassifHistory.Name = "listViewForClassifHistory"; + this.listViewForClassifHistory.Size = new System.Drawing.Size(287, 426); + this.listViewForClassifHistory.TabIndex = 10; + this.listViewForClassifHistory.UseCompatibleStateImageBehavior = false; + this.listViewForClassifHistory.View = System.Windows.Forms.View.Details; + this.listViewForClassifHistory.SelectedIndexChanged += new System.EventHandler(this.listViewForCellPopulations_SelectedIndexChanged); + this.listViewForClassifHistory.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listViewForCellPopulations_MouseDown); + // + // columnHeaderModelName + // + this.columnHeaderModelName.Text = "Name"; + this.columnHeaderModelName.Width = 101; + // + // columnHeaderNumFolds + // + this.columnHeaderNumFolds.Text = "CV Num. Folds"; + this.columnHeaderNumFolds.Width = 84; + // + // columnHeaderMeanError + // + this.columnHeaderMeanError.Text = "Mean Error"; + this.columnHeaderMeanError.Width = 94; + // + // buttonOk + // + this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOk.Location = new System.Drawing.Point(488, 437); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(106, 23); + this.buttonOk.TabIndex = 11; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); + // + // richTextBoxModel + // + this.richTextBoxModel.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.richTextBoxModel.Location = new System.Drawing.Point(3, 3); + this.richTextBoxModel.Name = "richTextBoxModel"; + this.richTextBoxModel.Size = new System.Drawing.Size(274, 394); + this.richTextBoxModel.TabIndex = 12; + this.richTextBoxModel.Text = ""; + // + // tabControl + // + this.tabControl.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.tabControl.Controls.Add(this.tabPageModel); + this.tabControl.Controls.Add(this.tabPage2); + this.tabControl.Location = new System.Drawing.Point(3, 3); + this.tabControl.Name = "tabControl"; + this.tabControl.SelectedIndex = 0; + this.tabControl.Size = new System.Drawing.Size(288, 426); + this.tabControl.TabIndex = 13; + // + // tabPageModel + // + this.tabPageModel.Controls.Add(this.richTextBoxModel); + this.tabPageModel.Location = new System.Drawing.Point(4, 22); + this.tabPageModel.Name = "tabPageModel"; + this.tabPageModel.Padding = new System.Windows.Forms.Padding(3); + this.tabPageModel.Size = new System.Drawing.Size(280, 400); + this.tabPageModel.TabIndex = 0; + this.tabPageModel.Text = "Model"; + this.tabPageModel.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.richTextBoxCV); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(280, 400); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Cross-validation"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // richTextBoxCV + // + this.richTextBoxCV.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.richTextBoxCV.Location = new System.Drawing.Point(3, 3); + this.richTextBoxCV.Name = "richTextBoxCV"; + this.richTextBoxCV.Size = new System.Drawing.Size(274, 394); + this.richTextBoxCV.TabIndex = 13; + this.richTextBoxCV.Text = ""; + // + // splitContainer + // + this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(3, 4); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.listViewForClassifHistory); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.tabControl); + this.splitContainer.Size = new System.Drawing.Size(591, 432); + this.splitContainer.SplitterDistance = 293; + this.splitContainer.TabIndex = 14; + // + // FormForModelsHistory + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(599, 463); + this.ControlBox = false; + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.buttonOk); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForModelsHistory"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Models History"; + this.tabControl.ResumeLayout(false); + this.tabPageModel.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.ListView listViewForClassifHistory; + private System.Windows.Forms.ColumnHeader columnHeaderModelName; + private System.Windows.Forms.ColumnHeader columnHeaderNumFolds; + private System.Windows.Forms.ColumnHeader columnHeaderMeanError; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.RichTextBox richTextBoxModel; + private System.Windows.Forms.TabControl tabControl; + private System.Windows.Forms.TabPage tabPageModel; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.RichTextBox richTextBoxCV; + private System.Windows.Forms.SplitContainer splitContainer; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/FormForModelsHistory.cs b/Cell-by-Cell and DB/FormForModelsHistory.cs new file mode 100644 index 0000000..2f7c1d5 --- /dev/null +++ b/Cell-by-Cell and DB/FormForModelsHistory.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.TMP_ToBeRemoved; +using HCSAnalyzer.Classes; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.Classes.Machine_Learning; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms +{ + public partial class FormForModelsHistory : Form + { + public FormForModelsHistory() + { + InitializeComponent(); + + //ToolTip MytoolTip = new ToolTip(); + + //// Set up the delays for the ToolTip. + //MytoolTip.AutoPopDelay = 5000; + //MytoolTip.InitialDelay = 1000; + //MytoolTip.ReshowDelay = 500; + + //MytoolTip.ShowAlways = true; + + //// Set up the ToolTip text for the Button and Checkbox. + //MytoolTip.SetToolTip(this.listViewForClassifHistory, "Test"); + //toolTip1.SetToolTip(this.checkBoxShiftRowEffect, "Step: " + GlobalInfo.OptionsWindow.numericUpDownGenerateScreenRowEffectShift.Value); + this.listViewForClassifHistory.ShowItemToolTips = true; + this.Visible = false; + + } + + private void listViewForCellPopulations_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + //Point locationOnForm = listViewForCellPopulations.FindForm().PointToClient(Control.MousePosition); + ListViewItem IdxItem = listViewForClassifHistory.GetItemAt(e.X, e.Y); + + ContextMenuStrip contextMenuStripPicker = new ContextMenuStrip(); + + //ToolStripMenuItem AddItem = new ToolStripMenuItem("Add"); + //// AddItem.Click += new System.EventHandler(this.AddItem); + //contextMenuStripPicker.Items.Add(AddItem); + + + //ToolStripMenuItem LoadItem = new ToolStripMenuItem("Load"); + //// LoadItem.Click += new System.EventHandler(this.LoadItem); + //contextMenuStripPicker.Items.Add(LoadItem); + + if (IdxItem != null) + { + // ToolStripMenuItem EditItem = new ToolStripMenuItem(IdxItem.Text+" -> Display Info"); + // EditItem.Click += new System.EventHandler(this.DisplayInfoItem); + // contextMenuStripPicker.Items.Add(EditItem); + + //ToolStripMenuItem SaveItem = new ToolStripMenuItem("Save " + IdxItem.Text); + //// SaveItem.Click += new System.EventHandler(this.SaveItem); + //contextMenuStripPicker.Items.Add(SaveItem); + + //ToolStripMenuItem DeleteItem = new ToolStripMenuItem("Delete " + IdxItem.Text); + //// DeleteItem.Click += new System.EventHandler(this.DeleteItem); + //contextMenuStripPicker.Items.Add(DeleteItem); + // contextMenuStripPicker.Items.Add(new ToolStripSeparator()); + } + + if (listViewForClassifHistory.Items.Count > 0) + { + ToolStripMenuItem DisplayGraphItem = new ToolStripMenuItem("Display Graph"); + DisplayGraphItem.Click += new System.EventHandler(this.DisplayGraphItem); + contextMenuStripPicker.Items.Add(DisplayGraphItem); + + if (listViewForClassifHistory.Items.Count > 1) + { + ToolStripMenuItem IdentifyBestItem = new ToolStripMenuItem("Identify Best"); + IdentifyBestItem.Click += new System.EventHandler(this.IdentifyBestItem); + contextMenuStripPicker.Items.Add(IdentifyBestItem); + } + contextMenuStripPicker.Items.Add(new ToolStripSeparator()); + + + + ToolStripMenuItem ClearItem = new ToolStripMenuItem("Clear"); + ClearItem.Click += new System.EventHandler(this.ClearItems); + contextMenuStripPicker.Items.Add(ClearItem); + + + + } + + + //ToolStripMenuItem NewTypeItem = new ToolStripMenuItem("New Cell Type"); + //// NewTypeItem.Click += new System.EventHandler(this.NewTypeItem); + //contextMenuStripPicker.Items.Add(NewTypeItem); + + contextMenuStripPicker.Show(Control.MousePosition); + } + } + + + void IdentifyBestItem(object sender, EventArgs e) + { + + double MinError = double.Parse(listViewForClassifHistory.Items[0].SubItems[2].Text); + int IdxBest = 0; + + for (int IdxItem = 1; IdxItem < listViewForClassifHistory.Items.Count; IdxItem++) + { + double TmpError = double.Parse(listViewForClassifHistory.Items[IdxItem].SubItems[2].Text); + if (TmpError < MinError) + { + MinError = TmpError; + IdxBest = IdxItem; + } + } + + listViewForClassifHistory.FocusedItem = listViewForClassifHistory.Items[IdxBest]; + listViewForClassifHistory.Items[IdxBest].Selected = true; + + UpdateInfo(); + } + + + void DisplayGraphItem(object sender, EventArgs e) + { + FormTMP TMPWin = new FormTMP(); + Panel Pan = new Panel(); + Pan.Show(); + + cExtendedList ListValue = new cExtendedList(); + for (int Idx = 0; Idx < this.listViewForClassifHistory.Items.Count; Idx++) + { + // this.listViewForCellPopulations.Items[Idx]; + ListValue.Add(double.Parse(this.listViewForClassifHistory.Items[Idx].SubItems[2].Text)); + } + + // ListValue.Name = this.dt.Columns[e.ColumnIndex].ColumnName; + + cPanelHisto PanelHisto = new cPanelHisto(ListValue, eGraphType.LINE, eOrientation.HORIZONTAL); + TMPWin.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + TMPWin.Show(); + + } + + void DisplayInfoItem(object sender, EventArgs e) + { + // cCellPopulation SelectedCellPop = (cCellPopulation)listViewForCellPopulations.FocusedItem.Tag; + + } + + private void ClearItems(object sender, EventArgs e) + { + int NumItems = this.listViewForClassifHistory.Items.Count; + for (int IdxItem = 0; IdxItem < NumItems; IdxItem++) + { + this.listViewForClassifHistory.Items[0].Remove(); + } + + this.richTextBoxCV.Clear(); + this.richTextBoxModel.Clear(); + } + + + private void buttonOk_Click(object sender, EventArgs e) + { + this.Visible = false; + } + + private void listViewForCellPopulations_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewForClassifHistory.FocusedItem == null) return; + UpdateInfo(); + } + + void UpdateInfo() + { + cClusteringObject SelectedCellModel = (cClusteringObject)listViewForClassifHistory.FocusedItem.Tag; + richTextBoxModel.Clear(); + richTextBoxModel.AppendText(SelectedCellModel.Model.ToString()); + + richTextBoxCV.Clear(); + richTextBoxCV.AppendText(SelectedCellModel.Evaluation.toSummaryString()); + richTextBoxCV.AppendText(SelectedCellModel.Evaluation.toClassDetailsString()); + + } + + + + } +} diff --git a/Forms/3D/FormFor3DVizuOptions.resx b/Cell-by-Cell and DB/FormForModelsHistory.resx similarity index 100% rename from Forms/3D/FormFor3DVizuOptions.resx rename to Cell-by-Cell and DB/FormForModelsHistory.resx diff --git a/Forms/FormForPlateDimensions.Designer.cs b/Cell-by-Cell and DB/FormForPlateDimensions.Designer.cs similarity index 98% rename from Forms/FormForPlateDimensions.Designer.cs rename to Cell-by-Cell and DB/FormForPlateDimensions.Designer.cs index 30e11bd..5d62ab5 100644 --- a/Forms/FormForPlateDimensions.Designer.cs +++ b/Cell-by-Cell and DB/FormForPlateDimensions.Designer.cs @@ -49,7 +49,7 @@ private void InitializeComponent() // buttonOk // this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOk.Location = new System.Drawing.Point(39, 275); + this.buttonOk.Location = new System.Drawing.Point(39, 268); this.buttonOk.Name = "buttonOk"; this.buttonOk.Size = new System.Drawing.Size(124, 32); this.buttonOk.TabIndex = 3; @@ -193,7 +193,7 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.radioButtonDataHDDB); this.groupBox1.Location = new System.Drawing.Point(9, 178); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(185, 91); + this.groupBox1.Size = new System.Drawing.Size(185, 84); this.groupBox1.TabIndex = 9; this.groupBox1.TabStop = false; this.groupBox1.Text = "Data Access"; @@ -202,7 +202,7 @@ private void InitializeComponent() // this.radioButtonDataMemory.AutoSize = true; this.radioButtonDataMemory.Checked = true; - this.radioButtonDataMemory.Location = new System.Drawing.Point(61, 53); + this.radioButtonDataMemory.Location = new System.Drawing.Point(61, 47); this.radioButtonDataMemory.Name = "radioButtonDataMemory"; this.radioButtonDataMemory.Size = new System.Drawing.Size(62, 17); this.radioButtonDataMemory.TabIndex = 9; @@ -214,7 +214,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(202, 317); + this.ClientSize = new System.Drawing.Size(202, 311); this.Controls.Add(this.groupBox1); this.Controls.Add(this.checkBoxAddCellNumber); this.Controls.Add(this.checkBoxIsOmitFirstColumn); diff --git a/Forms/FormForPlateDimensions.cs b/Cell-by-Cell and DB/FormForPlateDimensions.cs similarity index 100% rename from Forms/FormForPlateDimensions.cs rename to Cell-by-Cell and DB/FormForPlateDimensions.cs diff --git a/Forms/FormForPlateDimensions.resx b/Cell-by-Cell and DB/FormForPlateDimensions.resx similarity index 100% rename from Forms/FormForPlateDimensions.resx rename to Cell-by-Cell and DB/FormForPlateDimensions.resx diff --git a/Forms/FormsForGraphsDisplay/FormForPointSize.Designer.cs b/Cell-by-Cell and DB/FormForPointSize.Designer.cs similarity index 78% rename from Forms/FormsForGraphsDisplay/FormForPointSize.Designer.cs rename to Cell-by-Cell and DB/FormForPointSize.Designer.cs index 00c71b7..485c6ca 100644 --- a/Forms/FormsForGraphsDisplay/FormForPointSize.Designer.cs +++ b/Cell-by-Cell and DB/FormForPointSize.Designer.cs @@ -31,14 +31,14 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForPointSize)); this.buttonApply = new System.Windows.Forms.Button(); this.trackBarPointSize = new System.Windows.Forms.TrackBar(); - this.label1 = new System.Windows.Forms.Label(); + this.labelForPointSize = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.trackBarPointSize)).BeginInit(); this.SuspendLayout(); // // buttonApply // this.buttonApply.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonApply.Location = new System.Drawing.Point(69, 107); + this.buttonApply.Location = new System.Drawing.Point(69, 68); this.buttonApply.Name = "buttonApply"; this.buttonApply.Size = new System.Drawing.Size(102, 28); this.buttonApply.TabIndex = 0; @@ -47,30 +47,32 @@ private void InitializeComponent() // // trackBarPointSize // - this.trackBarPointSize.Location = new System.Drawing.Point(12, 47); + this.trackBarPointSize.Location = new System.Drawing.Point(12, 12); this.trackBarPointSize.Maximum = 100; this.trackBarPointSize.Minimum = 1; this.trackBarPointSize.Name = "trackBarPointSize"; - this.trackBarPointSize.Size = new System.Drawing.Size(216, 45); + this.trackBarPointSize.Size = new System.Drawing.Size(163, 45); this.trackBarPointSize.TabIndex = 1; - this.trackBarPointSize.Value = 4; + this.trackBarPointSize.TickStyle = System.Windows.Forms.TickStyle.Both; + this.trackBarPointSize.Value = 8; this.trackBarPointSize.ValueChanged += new System.EventHandler(this.trackBarPointSize_ValueChanged); // - // label1 + // labelForPointSize // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(118, 19); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(13, 13); - this.label1.TabIndex = 2; - this.label1.Text = "0"; + this.labelForPointSize.AutoSize = true; + this.labelForPointSize.Location = new System.Drawing.Point(195, 26); + this.labelForPointSize.Name = "labelForPointSize"; + this.labelForPointSize.Size = new System.Drawing.Size(13, 13); + this.labelForPointSize.TabIndex = 2; + this.labelForPointSize.Text = "0"; + this.labelForPointSize.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // FormForPointSize // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(240, 154); - this.Controls.Add(this.label1); + this.ClientSize = new System.Drawing.Size(240, 104); + this.Controls.Add(this.labelForPointSize); this.Controls.Add(this.trackBarPointSize); this.Controls.Add(this.buttonApply); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; @@ -86,7 +88,7 @@ private void InitializeComponent() #endregion private System.Windows.Forms.Button buttonApply; - private System.Windows.Forms.Label label1; public System.Windows.Forms.TrackBar trackBarPointSize; + public System.Windows.Forms.Label labelForPointSize; } } \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormForPointSize.cs b/Cell-by-Cell and DB/FormForPointSize.cs similarity index 86% rename from Forms/FormsForGraphsDisplay/FormForPointSize.cs rename to Cell-by-Cell and DB/FormForPointSize.cs index f8dee00..d105571 100644 --- a/Forms/FormsForGraphsDisplay/FormForPointSize.cs +++ b/Cell-by-Cell and DB/FormForPointSize.cs @@ -18,7 +18,7 @@ public FormForPointSize() private void trackBarPointSize_ValueChanged(object sender, EventArgs e) { - this.label1.Text = trackBarPointSize.Value.ToString(); + this.labelForPointSize.Text = trackBarPointSize.Value.ToString(); } } } diff --git a/Forms/FormsForGraphsDisplay/FormForPointSize.resx b/Cell-by-Cell and DB/FormForPointSize.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForPointSize.resx rename to Cell-by-Cell and DB/FormForPointSize.resx diff --git a/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.Designer.cs b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.Designer.cs new file mode 100644 index 0000000..f40b9f6 --- /dev/null +++ b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.Designer.cs @@ -0,0 +1,618 @@ +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + partial class FormForSingleCellsDisplay + { + /// + /// 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(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForSingleCellsDisplay)); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.chartForPoints = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.contextMenuStripForSingleCell = new System.Windows.Forms.ContextMenuStrip(this.components); + this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pointSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.colorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.markerBorderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.mINEAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.descriptorsAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.correlationMatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.comboBoxAxeY = new System.Windows.Forms.ComboBox(); + this.comboBoxAxeX = new System.Windows.Forms.ComboBox(); + this.buttonStartCluster = new System.Windows.Forms.Button(); + this.splitContainerForCellByCellAnalysis = new System.Windows.Forms.SplitContainer(); + this.splitContainerHorizontal = new System.Windows.Forms.SplitContainer(); + this.splitContainerVertical = new System.Windows.Forms.SplitContainer(); + this.buttonCollapseHorizontal = new System.Windows.Forms.Button(); + this.buttonCollapseVertical = new System.Windows.Forms.Button(); + this.splitContainerForResults = new System.Windows.Forms.SplitContainer(); + this.richTextBoxForResults = new System.Windows.Forms.RichTextBox(); + this.contextMenuStripForRichTextBox = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cleanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panelForGraphicalResults = new System.Windows.Forms.Panel(); + this.buttonTraining = new System.Windows.Forms.Button(); + this.toolTipForTraining = new System.Windows.Forms.ToolTip(this.components); + this.buttonClassify = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.classificationModelsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.historyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkBoxIsVolumeConstant = new System.Windows.Forms.CheckBox(); + this.label6 = new System.Windows.Forms.Label(); + this.comboBoxVolume = new System.Windows.Forms.ComboBox(); + this.splitContainerForParam = new System.Windows.Forms.SplitContainer(); + ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).BeginInit(); + this.contextMenuStripForSingleCell.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForCellByCellAnalysis)).BeginInit(); + this.splitContainerForCellByCellAnalysis.Panel1.SuspendLayout(); + this.splitContainerForCellByCellAnalysis.Panel2.SuspendLayout(); + this.splitContainerForCellByCellAnalysis.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHorizontal)).BeginInit(); + this.splitContainerHorizontal.Panel2.SuspendLayout(); + this.splitContainerHorizontal.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerVertical)).BeginInit(); + this.splitContainerVertical.Panel1.SuspendLayout(); + this.splitContainerVertical.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForResults)).BeginInit(); + this.splitContainerForResults.Panel1.SuspendLayout(); + this.splitContainerForResults.Panel2.SuspendLayout(); + this.splitContainerForResults.SuspendLayout(); + this.contextMenuStripForRichTextBox.SuspendLayout(); + this.menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForParam)).BeginInit(); + this.splitContainerForParam.Panel1.SuspendLayout(); + this.splitContainerForParam.Panel2.SuspendLayout(); + this.splitContainerForParam.SuspendLayout(); + this.SuspendLayout(); + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(37, 31); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 13); + this.label2.TabIndex = 8; + this.label2.Text = "Axis Y"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(37, 5); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(36, 13); + this.label1.TabIndex = 9; + this.label1.Text = "Axis X"; + // + // chartForPoints + // + this.chartForPoints.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))); + chartArea1.AxisX.MajorGrid.Enabled = false; + chartArea1.AxisY.MajorGrid.Enabled = false; + chartArea1.Name = "ChartArea1"; + this.chartForPoints.ChartAreas.Add(chartArea1); + this.chartForPoints.ContextMenuStrip = this.contextMenuStripForSingleCell; + this.chartForPoints.Location = new System.Drawing.Point(3, 3); + this.chartForPoints.Name = "chartForPoints"; + series1.ChartArea = "ChartArea1"; + series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; + series1.MarkerBorderColor = System.Drawing.Color.Black; + series1.MarkerColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); + series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; + series1.Name = "SeriesPts"; + this.chartForPoints.Series.Add(series1); + this.chartForPoints.Size = new System.Drawing.Size(361, 329); + this.chartForPoints.TabIndex = 5; + this.chartForPoints.Text = "chart1"; + this.chartForPoints.Resize += new System.EventHandler(this.chartForPoints_Resize); + // + // contextMenuStripForSingleCell + // + this.contextMenuStripForSingleCell.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayToolStripMenuItem, + this.toolStripSeparator1, + this.mINEAnalysisToolStripMenuItem, + this.descriptorsAnalysisToolStripMenuItem}); + this.contextMenuStripForSingleCell.Name = "contextMenuStripForSingleCell"; + this.contextMenuStripForSingleCell.Size = new System.Drawing.Size(180, 76); + // + // displayToolStripMenuItem + // + this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.pointSizeToolStripMenuItem, + this.colorsToolStripMenuItem, + this.markerBorderToolStripMenuItem}); + this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; + this.displayToolStripMenuItem.Size = new System.Drawing.Size(179, 22); + this.displayToolStripMenuItem.Text = "Display"; + // + // pointSizeToolStripMenuItem + // + this.pointSizeToolStripMenuItem.Name = "pointSizeToolStripMenuItem"; + this.pointSizeToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.pointSizeToolStripMenuItem.Text = "Point Size"; + this.pointSizeToolStripMenuItem.Click += new System.EventHandler(this.pointSizeToolStripMenuItem_Click); + // + // colorsToolStripMenuItem + // + this.colorsToolStripMenuItem.Name = "colorsToolStripMenuItem"; + this.colorsToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.colorsToolStripMenuItem.Text = "Colors"; + this.colorsToolStripMenuItem.Click += new System.EventHandler(this.colorsToolStripMenuItem_Click); + // + // markerBorderToolStripMenuItem + // + this.markerBorderToolStripMenuItem.Checked = true; + this.markerBorderToolStripMenuItem.CheckOnClick = true; + this.markerBorderToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.markerBorderToolStripMenuItem.Name = "markerBorderToolStripMenuItem"; + this.markerBorderToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.markerBorderToolStripMenuItem.Text = "Marker Border"; + this.markerBorderToolStripMenuItem.Click += new System.EventHandler(this.markerBorderToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(176, 6); + // + // mINEAnalysisToolStripMenuItem + // + this.mINEAnalysisToolStripMenuItem.Enabled = false; + this.mINEAnalysisToolStripMenuItem.Name = "mINEAnalysisToolStripMenuItem"; + this.mINEAnalysisToolStripMenuItem.Size = new System.Drawing.Size(179, 22); + this.mINEAnalysisToolStripMenuItem.Text = "MINE analysis"; + this.mINEAnalysisToolStripMenuItem.Click += new System.EventHandler(this.mINEAnalysisToolStripMenuItem_Click); + // + // descriptorsAnalysisToolStripMenuItem + // + this.descriptorsAnalysisToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.correlationMatrixToolStripMenuItem}); + this.descriptorsAnalysisToolStripMenuItem.Name = "descriptorsAnalysisToolStripMenuItem"; + this.descriptorsAnalysisToolStripMenuItem.Size = new System.Drawing.Size(179, 22); + this.descriptorsAnalysisToolStripMenuItem.Text = "Descriptors Analysis"; + // + // correlationMatrixToolStripMenuItem + // + this.correlationMatrixToolStripMenuItem.Name = "correlationMatrixToolStripMenuItem"; + this.correlationMatrixToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.correlationMatrixToolStripMenuItem.Text = "Correlation Matrix"; + this.correlationMatrixToolStripMenuItem.Click += new System.EventHandler(this.correlationMatrixToolStripMenuItem_Click); + // + // comboBoxAxeY + // + this.comboBoxAxeY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxAxeY.FormattingEnabled = true; + this.comboBoxAxeY.Location = new System.Drawing.Point(95, 28); + this.comboBoxAxeY.Name = "comboBoxAxeY"; + this.comboBoxAxeY.Size = new System.Drawing.Size(167, 21); + this.comboBoxAxeY.TabIndex = 7; + this.comboBoxAxeY.SelectedIndexChanged += new System.EventHandler(this.comboBoxAxeY_SelectedIndexChanged); + // + // comboBoxAxeX + // + this.comboBoxAxeX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxAxeX.FormattingEnabled = true; + this.comboBoxAxeX.Location = new System.Drawing.Point(95, 2); + this.comboBoxAxeX.Name = "comboBoxAxeX"; + this.comboBoxAxeX.Size = new System.Drawing.Size(167, 21); + this.comboBoxAxeX.TabIndex = 6; + this.comboBoxAxeX.SelectedIndexChanged += new System.EventHandler(this.comboBoxAxeX_SelectedIndexChanged); + // + // buttonStartCluster + // + this.buttonStartCluster.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonStartCluster.Location = new System.Drawing.Point(16, 32); + this.buttonStartCluster.Name = "buttonStartCluster"; + this.buttonStartCluster.Size = new System.Drawing.Size(79, 39); + this.buttonStartCluster.TabIndex = 10; + this.buttonStartCluster.Text = "Cluster"; + this.toolTipForTraining.SetToolTip(this.buttonStartCluster, "Perform automated clustering of the data"); + this.buttonStartCluster.UseVisualStyleBackColor = true; + this.buttonStartCluster.Click += new System.EventHandler(this.buttonStartCluster_Click); + // + // splitContainerForCellByCellAnalysis + // + this.splitContainerForCellByCellAnalysis.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.splitContainerForCellByCellAnalysis.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.splitContainerForCellByCellAnalysis.Location = new System.Drawing.Point(3, 27); + this.splitContainerForCellByCellAnalysis.Name = "splitContainerForCellByCellAnalysis"; + // + // splitContainerForCellByCellAnalysis.Panel1 + // + this.splitContainerForCellByCellAnalysis.Panel1.Controls.Add(this.splitContainerHorizontal); + // + // splitContainerForCellByCellAnalysis.Panel2 + // + this.splitContainerForCellByCellAnalysis.Panel2.Controls.Add(this.splitContainerForResults); + this.splitContainerForCellByCellAnalysis.Size = new System.Drawing.Size(834, 385); + this.splitContainerForCellByCellAnalysis.SplitterDistance = 564; + this.splitContainerForCellByCellAnalysis.TabIndex = 11; + // + // splitContainerHorizontal + // + this.splitContainerHorizontal.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.splitContainerHorizontal.BackColor = System.Drawing.SystemColors.Window; + this.splitContainerHorizontal.Location = new System.Drawing.Point(3, 1); + this.splitContainerHorizontal.Name = "splitContainerHorizontal"; + // + // splitContainerHorizontal.Panel2 + // + this.splitContainerHorizontal.Panel2.Controls.Add(this.splitContainerVertical); + this.splitContainerHorizontal.Size = new System.Drawing.Size(556, 381); + this.splitContainerHorizontal.SplitterDistance = 185; + this.splitContainerHorizontal.TabIndex = 8; + // + // splitContainerVertical + // + this.splitContainerVertical.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainerVertical.Location = new System.Drawing.Point(0, 0); + this.splitContainerVertical.Name = "splitContainerVertical"; + this.splitContainerVertical.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerVertical.Panel1 + // + this.splitContainerVertical.Panel1.Controls.Add(this.buttonCollapseHorizontal); + this.splitContainerVertical.Panel1.Controls.Add(this.buttonCollapseVertical); + this.splitContainerVertical.Panel1.Controls.Add(this.chartForPoints); + this.splitContainerVertical.Size = new System.Drawing.Size(367, 381); + this.splitContainerVertical.SplitterDistance = 335; + this.splitContainerVertical.TabIndex = 0; + // + // buttonCollapseHorizontal + // + this.buttonCollapseHorizontal.BackColor = System.Drawing.SystemColors.Window; + this.buttonCollapseHorizontal.BackgroundImage = global::HCSAnalyzer.Properties.Resources.Arrow; + this.buttonCollapseHorizontal.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonCollapseHorizontal.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonCollapseHorizontal.ForeColor = System.Drawing.SystemColors.Window; + this.buttonCollapseHorizontal.Location = new System.Drawing.Point(3, 3); + this.buttonCollapseHorizontal.Margin = new System.Windows.Forms.Padding(0); + this.buttonCollapseHorizontal.Name = "buttonCollapseHorizontal"; + this.buttonCollapseHorizontal.Size = new System.Drawing.Size(27, 23); + this.buttonCollapseHorizontal.TabIndex = 6; + this.buttonCollapseHorizontal.UseVisualStyleBackColor = false; + this.buttonCollapseHorizontal.Click += new System.EventHandler(this.buttonCollapseHorizontal_Click); + // + // buttonCollapseVertical + // + this.buttonCollapseVertical.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCollapseVertical.BackColor = System.Drawing.SystemColors.Window; + this.buttonCollapseVertical.BackgroundImage = global::HCSAnalyzer.Properties.Resources.Arrow; + this.buttonCollapseVertical.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonCollapseVertical.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonCollapseVertical.ForeColor = System.Drawing.SystemColors.Window; + this.buttonCollapseVertical.Location = new System.Drawing.Point(337, 309); + this.buttonCollapseVertical.Margin = new System.Windows.Forms.Padding(0); + this.buttonCollapseVertical.Name = "buttonCollapseVertical"; + this.buttonCollapseVertical.Size = new System.Drawing.Size(27, 23); + this.buttonCollapseVertical.TabIndex = 7; + this.buttonCollapseVertical.UseVisualStyleBackColor = false; + this.buttonCollapseVertical.Click += new System.EventHandler(this.buttonCollapseVertical_Click); + // + // splitContainerForResults + // + this.splitContainerForResults.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.splitContainerForResults.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.splitContainerForResults.Location = new System.Drawing.Point(3, 3); + this.splitContainerForResults.Name = "splitContainerForResults"; + this.splitContainerForResults.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerForResults.Panel1 + // + this.splitContainerForResults.Panel1.Controls.Add(this.richTextBoxForResults); + // + // splitContainerForResults.Panel2 + // + this.splitContainerForResults.Panel2.Controls.Add(this.panelForGraphicalResults); + this.splitContainerForResults.Size = new System.Drawing.Size(258, 377); + this.splitContainerForResults.SplitterDistance = 185; + this.splitContainerForResults.TabIndex = 2; + // + // richTextBoxForResults + // + this.richTextBoxForResults.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.richTextBoxForResults.ContextMenuStrip = this.contextMenuStripForRichTextBox; + this.richTextBoxForResults.Location = new System.Drawing.Point(3, 3); + this.richTextBoxForResults.Name = "richTextBoxForResults"; + this.richTextBoxForResults.ReadOnly = true; + this.richTextBoxForResults.Size = new System.Drawing.Size(250, 177); + this.richTextBoxForResults.TabIndex = 0; + this.richTextBoxForResults.Text = ""; + // + // contextMenuStripForRichTextBox + // + this.contextMenuStripForRichTextBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cleanToolStripMenuItem}); + this.contextMenuStripForRichTextBox.Name = "contextMenuStripForRichTextBox"; + this.contextMenuStripForRichTextBox.Size = new System.Drawing.Size(102, 26); + // + // cleanToolStripMenuItem + // + this.cleanToolStripMenuItem.Name = "cleanToolStripMenuItem"; + this.cleanToolStripMenuItem.Size = new System.Drawing.Size(101, 22); + this.cleanToolStripMenuItem.Text = "Clear"; + this.cleanToolStripMenuItem.Click += new System.EventHandler(this.cleanToolStripMenuItem_Click); + // + // panelForGraphicalResults + // + this.panelForGraphicalResults.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.panelForGraphicalResults.AutoScroll = true; + this.panelForGraphicalResults.Location = new System.Drawing.Point(3, 3); + this.panelForGraphicalResults.Name = "panelForGraphicalResults"; + this.panelForGraphicalResults.Size = new System.Drawing.Size(250, 180); + this.panelForGraphicalResults.TabIndex = 1; + // + // buttonTraining + // + this.buttonTraining.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonTraining.Location = new System.Drawing.Point(116, 33); + this.buttonTraining.Name = "buttonTraining"; + this.buttonTraining.Size = new System.Drawing.Size(79, 39); + this.buttonTraining.TabIndex = 13; + this.buttonTraining.Text = "Training"; + this.toolTipForTraining.SetToolTip(this.buttonTraining, "Generate a training model based on the clustering"); + this.buttonTraining.UseVisualStyleBackColor = true; + this.buttonTraining.Click += new System.EventHandler(this.buttonTraining_Click); + // + // buttonClassify + // + this.buttonClassify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonClassify.Enabled = false; + this.buttonClassify.Location = new System.Drawing.Point(218, 32); + this.buttonClassify.Name = "buttonClassify"; + this.buttonClassify.Size = new System.Drawing.Size(79, 39); + this.buttonClassify.TabIndex = 14; + this.buttonClassify.Text = "Classify"; + this.toolTipForTraining.SetToolTip(this.buttonClassify, "Classify every cell from the entire screening"); + this.buttonClassify.UseVisualStyleBackColor = true; + this.buttonClassify.Click += new System.EventHandler(this.buttonClassify_Click); + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 31); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(13, 13); + this.label3.TabIndex = 15; + this.label3.Text = "1"; + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(101, 32); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(13, 13); + this.label4.TabIndex = 15; + this.label4.Text = "2"; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(203, 32); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(13, 13); + this.label5.TabIndex = 15; + this.label5.Text = "3"; + // + // menuStrip + // + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.classificationModelsToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(840, 24); + this.menuStrip.TabIndex = 16; + this.menuStrip.Text = "menuStrip1"; + // + // classificationModelsToolStripMenuItem + // + this.classificationModelsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.historyToolStripMenuItem}); + this.classificationModelsToolStripMenuItem.Name = "classificationModelsToolStripMenuItem"; + this.classificationModelsToolStripMenuItem.Size = new System.Drawing.Size(125, 20); + this.classificationModelsToolStripMenuItem.Text = "Model Optimization"; + // + // historyToolStripMenuItem + // + this.historyToolStripMenuItem.Name = "historyToolStripMenuItem"; + this.historyToolStripMenuItem.Size = new System.Drawing.Size(112, 22); + this.historyToolStripMenuItem.Text = "History"; + this.historyToolStripMenuItem.Click += new System.EventHandler(this.historyToolStripMenuItem_Click); + // + // checkBoxIsVolumeConstant + // + this.checkBoxIsVolumeConstant.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.checkBoxIsVolumeConstant.AutoSize = true; + this.checkBoxIsVolumeConstant.Checked = true; + this.checkBoxIsVolumeConstant.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxIsVolumeConstant.Location = new System.Drawing.Point(22, 56); + this.checkBoxIsVolumeConstant.Name = "checkBoxIsVolumeConstant"; + this.checkBoxIsVolumeConstant.Size = new System.Drawing.Size(68, 17); + this.checkBoxIsVolumeConstant.TabIndex = 19; + this.checkBoxIsVolumeConstant.Text = "Constant"; + this.checkBoxIsVolumeConstant.UseVisualStyleBackColor = true; + this.checkBoxIsVolumeConstant.CheckedChanged += new System.EventHandler(this.checkBoxIsVolumeConstant_CheckedChanged); + // + // label6 + // + this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(599, 477); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(29, 13); + this.label6.TabIndex = 18; + this.label6.Text = "Area"; + // + // comboBoxVolume + // + this.comboBoxVolume.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxVolume.Enabled = false; + this.comboBoxVolume.FormattingEnabled = true; + this.comboBoxVolume.Location = new System.Drawing.Point(96, 53); + this.comboBoxVolume.Name = "comboBoxVolume"; + this.comboBoxVolume.Size = new System.Drawing.Size(166, 21); + this.comboBoxVolume.TabIndex = 17; + this.comboBoxVolume.SelectedIndexChanged += new System.EventHandler(this.comboBoxVolume_SelectedIndexChanged); + // + // splitContainerForParam + // + this.splitContainerForParam.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainerForParam.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.splitContainerForParam.Location = new System.Drawing.Point(3, 416); + this.splitContainerForParam.Name = "splitContainerForParam"; + // + // splitContainerForParam.Panel1 + // + this.splitContainerForParam.Panel1.Controls.Add(this.buttonClassify); + this.splitContainerForParam.Panel1.Controls.Add(this.label5); + this.splitContainerForParam.Panel1.Controls.Add(this.buttonTraining); + this.splitContainerForParam.Panel1.Controls.Add(this.label4); + this.splitContainerForParam.Panel1.Controls.Add(this.buttonStartCluster); + this.splitContainerForParam.Panel1.Controls.Add(this.label3); + this.splitContainerForParam.Panel1MinSize = 300; + // + // splitContainerForParam.Panel2 + // + this.splitContainerForParam.Panel2.Controls.Add(this.comboBoxAxeX); + this.splitContainerForParam.Panel2.Controls.Add(this.comboBoxAxeY); + this.splitContainerForParam.Panel2.Controls.Add(this.label1); + this.splitContainerForParam.Panel2.Controls.Add(this.checkBoxIsVolumeConstant); + this.splitContainerForParam.Panel2.Controls.Add(this.label2); + this.splitContainerForParam.Panel2.Controls.Add(this.comboBoxVolume); + this.splitContainerForParam.Size = new System.Drawing.Size(834, 80); + this.splitContainerForParam.SplitterDistance = 561; + this.splitContainerForParam.TabIndex = 20; + // + // FormForSingleCellsDisplay + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(840, 498); + this.Controls.Add(this.splitContainerForParam); + this.Controls.Add(this.label6); + this.Controls.Add(this.menuStrip); + this.Controls.Add(this.splitContainerForCellByCellAnalysis); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormForSingleCellsDisplay"; + this.Text = "Single cell analysis"; + ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).EndInit(); + this.contextMenuStripForSingleCell.ResumeLayout(false); + this.splitContainerForCellByCellAnalysis.Panel1.ResumeLayout(false); + this.splitContainerForCellByCellAnalysis.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForCellByCellAnalysis)).EndInit(); + this.splitContainerForCellByCellAnalysis.ResumeLayout(false); + this.splitContainerHorizontal.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHorizontal)).EndInit(); + this.splitContainerHorizontal.ResumeLayout(false); + this.splitContainerVertical.Panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerVertical)).EndInit(); + this.splitContainerVertical.ResumeLayout(false); + this.splitContainerForResults.Panel1.ResumeLayout(false); + this.splitContainerForResults.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForResults)).EndInit(); + this.splitContainerForResults.ResumeLayout(false); + this.contextMenuStripForRichTextBox.ResumeLayout(false); + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + this.splitContainerForParam.Panel1.ResumeLayout(false); + this.splitContainerForParam.Panel1.PerformLayout(); + this.splitContainerForParam.Panel2.ResumeLayout(false); + this.splitContainerForParam.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForParam)).EndInit(); + this.splitContainerForParam.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.DataVisualization.Charting.Chart chartForPoints; + public System.Windows.Forms.ComboBox comboBoxAxeY; + public System.Windows.Forms.ComboBox comboBoxAxeX; + private System.Windows.Forms.Button buttonStartCluster; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForSingleCell; + private System.Windows.Forms.ToolStripMenuItem mINEAnalysisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pointSizeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + public System.Windows.Forms.SplitContainer splitContainerForCellByCellAnalysis; + public System.Windows.Forms.RichTextBox richTextBoxForResults; + private System.Windows.Forms.SplitContainer splitContainerForResults; + private System.Windows.Forms.Panel panelForGraphicalResults; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForRichTextBox; + private System.Windows.Forms.ToolStripMenuItem cleanToolStripMenuItem; + private System.Windows.Forms.Button buttonTraining; + private System.Windows.Forms.ToolTip toolTipForTraining; + private System.Windows.Forms.ToolStripMenuItem colorsToolStripMenuItem; + private System.Windows.Forms.Button buttonClassify; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem classificationModelsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem historyToolStripMenuItem; + private System.Windows.Forms.CheckBox checkBoxIsVolumeConstant; + private System.Windows.Forms.Label label6; + public System.Windows.Forms.ComboBox comboBoxVolume; + private System.Windows.Forms.Button buttonCollapseHorizontal; + private System.Windows.Forms.Button buttonCollapseVertical; + private System.Windows.Forms.SplitContainer splitContainerHorizontal; + private System.Windows.Forms.SplitContainer splitContainerVertical; + private System.Windows.Forms.ToolStripMenuItem markerBorderToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainerForParam; + private System.Windows.Forms.ToolStripMenuItem descriptorsAnalysisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem correlationMatrixToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.cs b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.cs new file mode 100644 index 0000000..ef1c621 --- /dev/null +++ b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.cs @@ -0,0 +1,554 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; +using weka.core; +using weka.clusterers; +using weka.classifiers; +using LibPlateAnalysis; +using HCSAnalyzer.Forms.IO; +using System.Threading.Tasks; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions; +using HCSAnalyzer.Forms.FormsForOptions; +using HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo; +using Microsoft.Msagl.GraphViewerGdi; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo; +using weka.classifiers.trees; +using weka.classifiers.lazy; +using weka.classifiers.functions; +using weka.classifiers.functions.supportVector; +using weka.classifiers.rules; +using weka.classifiers.bayes; +using HCSAnalyzer.Classes.Machine_Learning; +using HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.Base_Classes.Data; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + public partial class FormForSingleCellsDisplay : Form + { + private DataTable dt; + private cGlobalInfo GlobalInfo; + cMachineLearning MachineLearning; + FormForModelsHistory WindowForModelHistory = new FormForModelsHistory(); + ToolTip ToolTipForX = new ToolTip(); + ToolTip ToolTipForY = new ToolTip(); + ToolTip ToolTipForVolume = new ToolTip(); + + public FormForSingleCellsDisplay(DataTable dt, cGlobalInfo GlobalInfo, cExtendedList ListClasses) + { + InitializeComponent(); + + markerBorderToolStripMenuItem.Checked = IsDisplayBorder; + + this.dt = dt; + this.GlobalInfo = GlobalInfo; + + #region initialize histograms display + splitContainerHorizontal.Panel1Collapsed = true; + splitContainerVertical.Panel2Collapsed = true; + + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerVertical.Panel2Collapsed) + ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + else + ImageOriginal.RotateFlip(RotateFlipType.Rotate90FlipNone); + + buttonCollapseVertical.BackgroundImage = ImageOriginal; + #endregion + + MachineLearning = new cMachineLearning(GlobalInfo); + + MachineLearning.Classes.AddRange(ListClasses); + + WindowForModelHistory.Show(); + WindowForModelHistory.Visible = false; + + ToolTipForX.AutoPopDelay = ToolTipForY.AutoPopDelay = 5000; + ToolTipForX.InitialDelay = ToolTipForY.InitialDelay = 500; + ToolTipForX.ReshowDelay = ToolTipForY.ReshowDelay = 500; + ToolTipForX.ShowAlways = ToolTipForY.ShowAlways = true; + ToolTipForX.SetToolTip(comboBoxAxeX, comboBoxAxeX.Text); + ToolTipForY.SetToolTip(comboBoxAxeY, comboBoxAxeY.Text); + ToolTipForVolume.SetToolTip(comboBoxVolume, comboBoxVolume.Text); + } + + public FormForSingleCellsDisplay() + { + InitializeComponent(); + } + + private void ReDraw() + { + cExtendedList ListX = new cExtendedList(); + cExtendedList ListY = new cExtendedList(); + + if (this.comboBoxAxeY.SelectedIndex == -1) return; + if (this.comboBoxVolume.SelectedIndex == -1) return; + + cExtendedList ListVolumes = new cExtendedList(); + + for (int j = 0; j < dt.Rows.Count; j++) + { + ListX.Add(double.Parse(dt.Rows[j][this.comboBoxAxeX.SelectedIndex].ToString())); + ListY.Add(double.Parse(dt.Rows[j][this.comboBoxAxeY.SelectedIndex].ToString())); + ListVolumes.Add(double.Parse(dt.Rows[j][this.comboBoxVolume.SelectedIndex].ToString())); + } + + this.chartForPoints.ChartAreas[0].AxisX.Title = this.comboBoxAxeX.SelectedItem.ToString(); + this.chartForPoints.ChartAreas[0].AxisY.Title = this.comboBoxAxeY.SelectedItem.ToString(); + this.chartForPoints.Series[0].Points.DataBindXY(ListX, ListY); + + this.chartForPoints.ChartAreas[0].AxisX.Minimum = ListX.Min(); + this.chartForPoints.ChartAreas[0].AxisX.Maximum = ListX.Max(); + + this.chartForPoints.ChartAreas[0].AxisY.Minimum = ListY.Min(); + this.chartForPoints.ChartAreas[0].AxisY.Maximum = ListY.Max(); + + //for (int j = 0; j < dt.Rows.Count; j++) + // this.chartForPoints.Series[0].Points[j].Tag = dataGridViewForTable.Rows[j];//dt.Rows[j]; + + this.chartForPoints.ChartAreas[0].AxisX.LabelStyle.Format = "N2"; + this.chartForPoints.ChartAreas[0].AxisY.LabelStyle.Format = "N2"; + + byte[][] LUT = GlobalInfo.LUT; + + int BorderSize = 1; + if (!IsDisplayBorder) BorderSize = 0; + + if (MachineLearning.Classes.Count > 0) + { + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + { + //int ConvertedValue = (int)(((Classes[j] - 0) * (LUT[0].Length - 1)) / (eval.getNumClusters() - 0)); + // this.chartForPoints.Series[0].Points[j].MarkerColor = GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay; + this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay); + this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize; + } + if (checkBoxIsVolumeConstant.Checked) + { + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + this.chartForPoints.Series[0].Points[j].MarkerSize = WindowPtSize.trackBarPointSize.Value; + } + + if (SecondListClassesForValidation != null) + { + // int NumBadAssociation = 0; + + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + { + int ClassificationClass = (int)SecondListClassesForValidation[j]; + this.chartForPoints.Series[0].Points[j].MarkerBorderColor = GlobalInfo.ListCellularPhenotypes[ClassificationClass].ColourForDisplay; + this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize * (this.chartForPoints.Series[0].Points[j].MarkerSize / 3); + + //if (SecondListClassesForValidation[j] != Classes[j]) + // NumBadAssociation++; + } + // this.richTextBoxForResults.AppendText(NumBadAssociation + " bad associations"); + } + } + else + { + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + { + //int ConvertedValue = (int)(((Classes[j] - 0) * (LUT[0].Length - 1)) / (eval.getNumClusters() - 0)); + + int WellClass = 0; // int.Parse(dt.Rows[j][dt.Columns.Count - 1].ToString()); + + //this.chartForPoints.Series[0].Points[j].MarkerColor = ; + this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListWellClasses[WellClass].ColourForDisplay); + this.chartForPoints.Series[0].Points[j].MarkerSize = WindowPtSize.trackBarPointSize.Value; + } + + if (checkBoxIsVolumeConstant.Checked) + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + this.chartForPoints.Series[0].Points[j].MarkerSize = WindowPtSize.trackBarPointSize.Value; + } + //this.chartForPoints.ChartAreas[0].CursorX.IsUserEnabled = false; + //this.chartForPoints.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + //this.chartForPoints.ChartAreas[0].CursorY.IsUserEnabled = false; + //this.chartForPoints.ChartAreas[0].CursorY.IsUserSelectionEnabled = true; + + if (!checkBoxIsVolumeConstant.Checked) + { + double MaxVolume = ListVolumes.Max(); + double MinVolume = ListVolumes.Min(); + + for (int j = 0; j < dt.Rows.Count; j++) + { + int MarkerArea = (int)((50 * (ListVolumes[j] - MinVolume)) / (MaxVolume - MinVolume)); + this.chartForPoints.Series[0].Points[j].MarkerSize = MarkerArea + 3; + } + } + } + + private void comboBoxAxeX_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + + if (comboBoxAxeX.Text == "") + ToolTipForX.SetToolTip(comboBoxAxeX, comboBoxAxeX.Items[0].ToString()); + else + ToolTipForX.SetToolTip(comboBoxAxeX, comboBoxAxeX.Text); + + if (splitContainerVertical.Panel2Collapsed) return; + RedrawHistoHorizontal(); + } + + private void comboBoxAxeY_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + if (comboBoxAxeY.Text == "") + ToolTipForY.SetToolTip(comboBoxAxeY, comboBoxAxeY.Items[0].ToString()); + else + ToolTipForY.SetToolTip(comboBoxAxeY, comboBoxAxeY.Text); + + RedrawHistoVertical(); + } + + private void RedrawHistoVertical() + { + cExtendedList ListValue = new cExtendedList(); + for (int Idx = 0; Idx < this.dt.Rows.Count; Idx++) + ListValue.Add(double.Parse(this.dt.Rows[Idx][comboBoxAxeY.SelectedIndex].ToString())); + + cPanelHisto PanelHisto = new cPanelHisto(ListValue, eGraphType.HISTOGRAM, eOrientation.VERTICAL); + PanelHisto.WindowForPanelHisto.UserEnable = false; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BackColor = Color.White; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Size = new System.Drawing.Size(splitContainerHorizontal.Panel1.Width, splitContainerVertical.Panel1.Height); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Location = new Point(0, 0); + + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BorderStyle = BorderStyle.None; + + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Minimum = chartForPoints.ChartAreas[0].AxisY.Minimum; + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Maximum = chartForPoints.ChartAreas[0].AxisY.Maximum; + + splitContainerHorizontal.Panel1.Controls.Clear(); + splitContainerHorizontal.Panel1.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + + } + + private void RedrawHistoHorizontal() + { + cExtendedList ListValue = new cExtendedList(); + for (int Idx = 0; Idx < this.dt.Rows.Count; Idx++) + ListValue.Add(double.Parse(this.dt.Rows[Idx][comboBoxAxeX.SelectedIndex].ToString())); + + cPanelHisto PanelHisto = new cPanelHisto(ListValue, eGraphType.HISTOGRAM, eOrientation.HORIZONTAL); + PanelHisto.WindowForPanelHisto.UserEnable = false; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Size = new System.Drawing.Size(splitContainerVertical.Panel2.Width - 23, splitContainerVertical.Panel2.Height); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BackColor = Color.White; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Location = new Point(23, 0); + + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BorderStyle = BorderStyle.None; + + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Minimum = chartForPoints.ChartAreas[0].AxisX.Minimum; + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Maximum = chartForPoints.ChartAreas[0].AxisX.Maximum; + + splitContainerVertical.Panel2.Controls.Clear(); + splitContainerVertical.Panel2.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + } + + double[] SecondListClassesForValidation = null; + + FormForPointSize WindowPtSize = new FormForPointSize(); + + private void buttonStartCluster_Click(object sender, EventArgs e) + { + this.Cursor = Cursors.WaitCursor; + // -------------------------- Clustering ------------------------------- + + cParamAlgo ParaAlgo = MachineLearning.AskAndGetClusteringAlgo(); + if (ParaAlgo == null) + { + this.Cursor = Cursors.Default; + return; + } + + + + MachineLearning.SelectedClusterer = MachineLearning.BuildClusterer(ParaAlgo, dt); + + //if (MachineLearning.SelectedClusterer == null) + //{ + // MessageBox.Show("Clustering failed !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // this.Cursor = Cursors.Default; + // return; + //} + + if (MachineLearning.SelectedClusterer.numberOfClusters() > GlobalInfo.ListCellularPhenotypes.Count) + { + MessageBox.Show("Number of identifed clusters (" + MachineLearning.SelectedClusterer.numberOfClusters() + ") not handled by the application !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + this.Cursor = Cursors.Default; + return; + } + SecondListClassesForValidation = null; + + if (MachineLearning.SelectedClusterer != null) + { + double[] Assign = MachineLearning.EvaluteAndDisplayClusterer(this.richTextBoxForResults, + this.panelForGraphicalResults, + MachineLearning.CreateInstancesWithoutClass(dt)).getClusterAssignments(); + + MachineLearning.Classes = new cExtendedList(); + MachineLearning.Classes.AddRange(Assign); + + } + buttonTraining.Enabled = true; + ReDraw(); + this.Cursor = Cursors.Default; + + } + + private void buttonTraining_Click(object sender, EventArgs e) + { + // ----------------------- Training ------------------------------ + //if (MessageBox.Show("Do you want perform a j48 training process ?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != System.Windows.Forms.DialogResult.Yes) return; + + //InstancesList = GlobalInfo.CurrentScreen.CellBasedClassification.CreateInstancesWithoutClass(dt); + + weka.classifiers.Evaluation ModelEvaluation = null; + + Instances InstancesList = GlobalInfo.CurrentScreen.CellBasedClassification.CreateInstancesWithoutClass(dt); + + FormForClassificationInfo WinClassifInfo = MachineLearning.AskAndGetClassifAlgo(); + if (WinClassifInfo == null) + { + this.Cursor = Cursors.Default; + return; + } + + MachineLearning.PerformTraining(WinClassifInfo, + InstancesList, + MachineLearning.NumberOfClusters, + this.richTextBoxForResults, + this.panelForGraphicalResults, + out ModelEvaluation, true); + + if (MachineLearning.CurrentClassifier == null) return; + + #region Add Object to history (if the model has been cross validated) + if (ModelEvaluation != null) + { + cClusteringObject NewObjectFOrHistory = new cClusteringObject(MachineLearning.CurrentClassifier, ModelEvaluation, (int)WinClassifInfo.numericUpDownFoldNumber.Value); + + List ListNamesForItem = new List(); + ListNamesForItem.Add(WinClassifInfo.GetSelectedAlgoAndParameters().Name); + ListNamesForItem.Add(NewObjectFOrHistory.FoldNumber.ToString()); + ListNamesForItem.Add(NewObjectFOrHistory.Evaluation.meanAbsoluteError().ToString()); + ListViewItem NewItem = new ListViewItem(ListNamesForItem.ToArray()); + + NewItem.Tag = NewObjectFOrHistory; + WindowForModelHistory.listViewForClassifHistory.Items.Add(NewItem); + NewItem.ToolTipText = MachineLearning.CurrentClassifier.ToString(); + } + #endregion + + //Instances ListInstancesTOClassify = ListInstances; + SecondListClassesForValidation = new double[InstancesList.numInstances()]; + //// ListInstances.setClassIndex(ListInstances.numAttributes() - 1); + for (int i = 0; i < InstancesList.numInstances(); i++) + { + SecondListClassesForValidation[i] = MachineLearning.CurrentClassifier.classifyInstance(InstancesList.instance(i)); + } + + buttonClassify.Enabled = true; + ReDraw(); + + this.Cursor = Cursors.Default; + } + + private void buttonClassify_Click(object sender, EventArgs e) + { + // FormForCellbyCellClassif WindowFormForCellbyCellClassif = new FormForCellbyCellClassif(); + + // if (WindowFormForCellbyCellClassif.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + MachineLearning.PerformClassification(); + } + + private void mINEAnalysisToolStripMenuItem_Click(object sender, EventArgs e) + { + //GlobalInfo.WindowHCSAnalyzer.DisplayMINE(ExtractCellsValuesList(true)); + } + + private cExtendedTable ExtractCellsValuesList(bool SelectedDescriptorsOnly) + { + int NumDesc = dt.Columns.Count; + + if (SelectedDescriptorsOnly) + { + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + cExtendedTable ListValueDesc = new cExtendedTable(); + + //new List[GlobalInfo.CurrentScreen.ListDescriptors.GetListNameActives().Count]; + + for (int i = 0; i < GlobalInfo.CurrentScreen.ListDescriptors.GetListNameActives().Count; i++) + ListValueDesc[i] = new cExtendedList(); + + // loop on all the plate + for (int RowIdx = 0; RowIdx < dt.Rows.Count; RowIdx++) + { + int Idx = 0; + for (int ColIdx = 0; ColIdx < dt.Columns.Count; ColIdx++) + if (GlobalInfo.CurrentScreen.ListDescriptors[ColIdx].IsActive()) + { + ListValueDesc[Idx++].Add((double)dt.Rows[RowIdx][ColIdx]); + } + } + return ListValueDesc; + } + + else + { + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + cExtendedTable ListValueDesc = new cExtendedTable(); + + for (int i = 0; i < NumDesc; i++) ListValueDesc.Add(new cExtendedList()); + for (int i = 0; i < NumDesc; i++) ListValueDesc[i].Name = dt.Columns[i].ColumnName; + + // loop on all the plate + for (int RowIdx = 0; RowIdx < dt.Rows.Count; RowIdx++) + { + for (int ColIdx = 0; ColIdx < dt.Columns.Count; ColIdx++) + ListValueDesc[ColIdx].Add((double)dt.Rows[RowIdx][ColIdx]); + } + return ListValueDesc; + } + } + + private void pointSizeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.chartForPoints.Series[0].Points.Count == 0) return; + int CurrentMarkerSize = this.chartForPoints.Series[0].Points[0].MarkerSize; + WindowPtSize.labelForPointSize.Text = CurrentMarkerSize.ToString(); + + WindowPtSize.trackBarPointSize.Value = CurrentMarkerSize; + + if (WindowPtSize.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + foreach (var item in this.chartForPoints.Series[0].Points) + item.MarkerSize = WindowPtSize.trackBarPointSize.Value; + } + WindowPtSize.Visible = false; + } + + private void cleanToolStripMenuItem_Click(object sender, EventArgs e) + { + richTextBoxForResults.Clear(); + } + + private void colorsToolStripMenuItem_Click(object sender, EventArgs e) + { + cListOptions ListOptions = new cListOptions(GlobalInfo); + + FormForGlobalInfoOptions WindowForOptions = new FormForGlobalInfoOptions(ListOptions); + WindowForOptions.SelectOption("Cellular Phenotypes"); + if (WindowForOptions.ShowDialog() == System.Windows.Forms.DialogResult.OK) + ReDraw(); + } + + private void historyToolStripMenuItem_Click(object sender, EventArgs e) + { + WindowForModelHistory.Visible = true; + } + + private void checkBoxIsVolumeConstant_CheckedChanged(object sender, EventArgs e) + { + comboBoxVolume.Enabled = !checkBoxIsVolumeConstant.Checked; + ReDraw(); + } + + private void comboBoxVolume_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + + if (comboBoxVolume.Text == "") + ToolTipForVolume.SetToolTip(comboBoxVolume, comboBoxVolume.Items[0].ToString()); + else + ToolTipForVolume.SetToolTip(comboBoxVolume, comboBoxVolume.Text); + + } + + private void buttonCollapseVertical_Click(object sender, EventArgs e) + { + splitContainerVertical.Panel2Collapsed = !splitContainerVertical.Panel2Collapsed; + + if ((!splitContainerVertical.Panel2Collapsed) && (splitContainerVertical.Panel2.Controls.Count == 0)) + { + RedrawHistoHorizontal(); + } + + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerVertical.Panel2Collapsed) + { + ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + } + else + { + ImageOriginal.RotateFlip(RotateFlipType.Rotate90FlipNone); + } + buttonCollapseVertical.BackgroundImage = ImageOriginal; + } + + private void buttonCollapseHorizontal_Click(object sender, EventArgs e) + { + splitContainerHorizontal.Panel1Collapsed = !splitContainerHorizontal.Panel1Collapsed; + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerHorizontal.Panel1Collapsed) + { + // ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + } + else + { + ImageOriginal.RotateFlip(RotateFlipType.RotateNoneFlipX); + } + buttonCollapseHorizontal.BackgroundImage = ImageOriginal; + } + + private void chartForPoints_Resize(object sender, EventArgs e) + { + if (splitContainerHorizontal.Panel1.Controls.Count == 0) return; + splitContainerHorizontal.Panel1.Controls[0].Size = new System.Drawing.Size(splitContainerHorizontal.Panel1.Width, splitContainerVertical.Panel1.Height); + + } + + bool IsDisplayBorder = true; + + private void markerBorderToolStripMenuItem_Click(object sender, EventArgs e) + { + IsDisplayBorder = markerBorderToolStripMenuItem.Checked; + ReDraw(); + } + + private void correlationMatrixToolStripMenuItem_Click(object sender, EventArgs e) + { + cFeedBackMessage MessageReturned; + + // cExtendedTable CurrentData = ExtractCellsValuesList(false); + + cExtendedTable CurrentData = new cExtendedTable(this.dt); + + cDisplayCorrelationMatrix ComputeAndDisplay_SingleCorrelationMatrix = new cDisplayCorrelationMatrix(); + ComputeAndDisplay_SingleCorrelationMatrix.Set_Data(CurrentData); + ComputeAndDisplay_SingleCorrelationMatrix.Run(); + } + + + } + + + + +} diff --git a/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.resx b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.resx new file mode 100644 index 0000000..ae66e5c --- /dev/null +++ b/Cell-by-Cell and DB/FormForSingleCellsDisplayForProcess.resx @@ -0,0 +1,1799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 469, 17 + + + 237, 17 + + + 621, 17 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayTable.Designer.cs b/Cell-by-Cell and DB/FormToDisplayDataTable.Designer.cs similarity index 63% rename from Forms/FormsForGraphsDisplay/FormToDisplayTable.Designer.cs rename to Cell-by-Cell and DB/FormToDisplayDataTable.Designer.cs index fcf713c..9c1a146 100644 --- a/Forms/FormsForGraphsDisplay/FormToDisplayTable.Designer.cs +++ b/Cell-by-Cell and DB/FormToDisplayDataTable.Designer.cs @@ -1,6 +1,6 @@ namespace HCSAnalyzer.Forms.FormsForGraphsDisplay { - partial class FormToDisplayTable + partial class cDisplayScatter2D { /// /// Required designer variable. @@ -31,7 +31,7 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormToDisplayTable)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(cDisplayScatter2D)); this.dataGridViewForTable = new System.Windows.Forms.DataGridView(); this.chartForPoints = new System.Windows.Forms.DataVisualization.Charting.Chart(); this.contextMenuStripForGraph = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -40,11 +40,15 @@ private void InitializeComponent() this.comboBoxAxeX = new System.Windows.Forms.ComboBox(); this.comboBoxAxeY = new System.Windows.Forms.ComboBox(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); + this.splitContainerHorizontal = new System.Windows.Forms.SplitContainer(); + this.splitContainerVertical = new System.Windows.Forms.SplitContainer(); + this.buttonCollapseHorizontal = new System.Windows.Forms.Button(); + this.buttonCollapseVertical = new System.Windows.Forms.Button(); + this.checkBoxIsVolumeConstant = new System.Windows.Forms.CheckBox(); this.label3 = new System.Windows.Forms.Label(); this.comboBoxVolume = new System.Windows.Forms.ComboBox(); - this.checkBoxIsVolumeConstant = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForTable)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).BeginInit(); this.contextMenuStripForGraph.SuspendLayout(); @@ -52,29 +56,35 @@ private void InitializeComponent() this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHorizontal)).BeginInit(); + this.splitContainerHorizontal.Panel2.SuspendLayout(); + this.splitContainerHorizontal.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerVertical)).BeginInit(); + this.splitContainerVertical.Panel1.SuspendLayout(); + this.splitContainerVertical.SuspendLayout(); this.SuspendLayout(); // // dataGridViewForTable // - this.dataGridViewForTable.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.dataGridViewForTable.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.dataGridViewForTable.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridViewForTable.Location = new System.Drawing.Point(3, 3); this.dataGridViewForTable.Name = "dataGridViewForTable"; - this.dataGridViewForTable.Size = new System.Drawing.Size(457, 568); + this.dataGridViewForTable.Size = new System.Drawing.Size(464, 584); this.dataGridViewForTable.TabIndex = 0; + this.dataGridViewForTable.RowHeaderMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridViewForTable_RowHeaderMouseDoubleClick); // // chartForPoints // - this.chartForPoints.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.chartForPoints.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))); chartArea1.AxisX.MajorGrid.Enabled = false; chartArea1.AxisY.MajorGrid.Enabled = false; chartArea1.Name = "ChartArea1"; this.chartForPoints.ChartAreas.Add(chartArea1); - this.chartForPoints.ContextMenuStrip = this.contextMenuStripForGraph; this.chartForPoints.Location = new System.Drawing.Point(3, 3); this.chartForPoints.Name = "chartForPoints"; series1.ChartArea = "ChartArea1"; @@ -85,9 +95,11 @@ private void InitializeComponent() series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; series1.Name = "SeriesPts"; this.chartForPoints.Series.Add(series1); - this.chartForPoints.Size = new System.Drawing.Size(470, 489); + this.chartForPoints.Size = new System.Drawing.Size(399, 429); this.chartForPoints.TabIndex = 1; this.chartForPoints.Text = "chart1"; + this.chartForPoints.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.chartForPoints_MouseDoubleClick); + this.chartForPoints.Resize += new System.EventHandler(this.chartForPoints_Resize); // // contextMenuStripForGraph // @@ -102,20 +114,20 @@ private void InitializeComponent() this.applyClassificationModelToolStripMenuItem.Name = "applyClassificationModelToolStripMenuItem"; this.applyClassificationModelToolStripMenuItem.Size = new System.Drawing.Size(215, 22); this.applyClassificationModelToolStripMenuItem.Text = "Apply Classification Model"; - this.applyClassificationModelToolStripMenuItem.Click += new System.EventHandler(this.applyClassificationModelToolStripMenuItem_Click); + // // showClassificationTreeToolStripMenuItem // this.showClassificationTreeToolStripMenuItem.Name = "showClassificationTreeToolStripMenuItem"; this.showClassificationTreeToolStripMenuItem.Size = new System.Drawing.Size(215, 22); this.showClassificationTreeToolStripMenuItem.Text = "Show Classification Tree"; - this.showClassificationTreeToolStripMenuItem.Click += new System.EventHandler(this.showClassificationTreeToolStripMenuItem_Click); + // // comboBoxAxeX // this.comboBoxAxeX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxAxeX.FormattingEnabled = true; - this.comboBoxAxeX.Location = new System.Drawing.Point(351, 498); + this.comboBoxAxeX.Location = new System.Drawing.Point(360, 514); this.comboBoxAxeX.Name = "comboBoxAxeX"; this.comboBoxAxeX.Size = new System.Drawing.Size(121, 21); this.comboBoxAxeX.TabIndex = 2; @@ -125,7 +137,7 @@ private void InitializeComponent() // this.comboBoxAxeY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxAxeY.FormattingEnabled = true; - this.comboBoxAxeY.Location = new System.Drawing.Point(351, 525); + this.comboBoxAxeY.Location = new System.Drawing.Point(360, 541); this.comboBoxAxeY.Name = "comboBoxAxeY"; this.comboBoxAxeY.Size = new System.Drawing.Size(121, 21); this.comboBoxAxeY.TabIndex = 3; @@ -133,10 +145,10 @@ private void InitializeComponent() // // splitContainer1 // - this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(12, 12); + this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(4, 3); this.splitContainer1.Name = "splitContainer1"; // // splitContainer1.Panel1 @@ -145,81 +157,145 @@ private void InitializeComponent() // // splitContainer1.Panel2 // + this.splitContainer1.Panel2.Controls.Add(this.splitContainerHorizontal); this.splitContainer1.Panel2.Controls.Add(this.checkBoxIsVolumeConstant); this.splitContainer1.Panel2.Controls.Add(this.label3); this.splitContainer1.Panel2.Controls.Add(this.comboBoxVolume); this.splitContainer1.Panel2.Controls.Add(this.label2); this.splitContainer1.Panel2.Controls.Add(this.label1); - this.splitContainer1.Panel2.Controls.Add(this.chartForPoints); this.splitContainer1.Panel2.Controls.Add(this.comboBoxAxeY); this.splitContainer1.Panel2.Controls.Add(this.comboBoxAxeX); - this.splitContainer1.Size = new System.Drawing.Size(943, 574); - this.splitContainer1.SplitterDistance = 463; + this.splitContainer1.Size = new System.Drawing.Size(959, 590); + this.splitContainer1.SplitterDistance = 470; this.splitContainer1.TabIndex = 4; // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(300, 528); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(36, 13); - this.label2.TabIndex = 4; - this.label2.Text = "Axis Y"; + // splitContainerHorizontal + // + this.splitContainerHorizontal.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.splitContainerHorizontal.BackColor = System.Drawing.SystemColors.Window; + this.splitContainerHorizontal.Location = new System.Drawing.Point(3, 3); + this.splitContainerHorizontal.Name = "splitContainerHorizontal"; + // + // splitContainerHorizontal.Panel2 + // + this.splitContainerHorizontal.Panel2.Controls.Add(this.splitContainerVertical); + this.splitContainerHorizontal.Size = new System.Drawing.Size(478, 505); + this.splitContainerHorizontal.SplitterDistance = 69; + this.splitContainerHorizontal.TabIndex = 8; + // + // splitContainerVertical + // + this.splitContainerVertical.BackColor = System.Drawing.SystemColors.Window; + this.splitContainerVertical.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainerVertical.Location = new System.Drawing.Point(0, 0); + this.splitContainerVertical.Name = "splitContainerVertical"; + this.splitContainerVertical.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerVertical.Panel1 + // + this.splitContainerVertical.Panel1.Controls.Add(this.buttonCollapseHorizontal); + this.splitContainerVertical.Panel1.Controls.Add(this.buttonCollapseVertical); + this.splitContainerVertical.Panel1.Controls.Add(this.chartForPoints); + this.splitContainerVertical.Size = new System.Drawing.Size(405, 505); + this.splitContainerVertical.SplitterDistance = 435; + this.splitContainerVertical.TabIndex = 0; + // + // buttonCollapseHorizontal + // + this.buttonCollapseHorizontal.BackColor = System.Drawing.SystemColors.Window; + this.buttonCollapseHorizontal.BackgroundImage = global::HCSAnalyzer.Properties.Resources.Arrow; + this.buttonCollapseHorizontal.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonCollapseHorizontal.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonCollapseHorizontal.ForeColor = System.Drawing.SystemColors.Window; + this.buttonCollapseHorizontal.Location = new System.Drawing.Point(3, 3); + this.buttonCollapseHorizontal.Margin = new System.Windows.Forms.Padding(0); + this.buttonCollapseHorizontal.Name = "buttonCollapseHorizontal"; + this.buttonCollapseHorizontal.Size = new System.Drawing.Size(27, 23); + this.buttonCollapseHorizontal.TabIndex = 4; + this.buttonCollapseHorizontal.UseVisualStyleBackColor = false; + this.buttonCollapseHorizontal.Click += new System.EventHandler(this.buttonCollapseHorizontal_Click); + // + // buttonCollapseVertical + // + this.buttonCollapseVertical.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCollapseVertical.BackColor = System.Drawing.SystemColors.Window; + this.buttonCollapseVertical.BackgroundImage = global::HCSAnalyzer.Properties.Resources.Arrow; + this.buttonCollapseVertical.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.buttonCollapseVertical.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonCollapseVertical.ForeColor = System.Drawing.SystemColors.Window; + this.buttonCollapseVertical.Location = new System.Drawing.Point(375, 409); + this.buttonCollapseVertical.Margin = new System.Windows.Forms.Padding(0); + this.buttonCollapseVertical.Name = "buttonCollapseVertical"; + this.buttonCollapseVertical.Size = new System.Drawing.Size(27, 23); + this.buttonCollapseVertical.TabIndex = 2; + this.buttonCollapseVertical.UseVisualStyleBackColor = false; + this.buttonCollapseVertical.Click += new System.EventHandler(this.buttonCollapseVertical_Click); // - // label1 + // checkBoxIsVolumeConstant // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(300, 501); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(36, 13); - this.label1.TabIndex = 4; - this.label1.Text = "Axis X"; + this.checkBoxIsVolumeConstant.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.checkBoxIsVolumeConstant.AutoSize = true; + this.checkBoxIsVolumeConstant.Checked = true; + this.checkBoxIsVolumeConstant.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxIsVolumeConstant.Location = new System.Drawing.Point(290, 570); + this.checkBoxIsVolumeConstant.Name = "checkBoxIsVolumeConstant"; + this.checkBoxIsVolumeConstant.Size = new System.Drawing.Size(68, 17); + this.checkBoxIsVolumeConstant.TabIndex = 7; + this.checkBoxIsVolumeConstant.Text = "Constant"; + this.checkBoxIsVolumeConstant.UseVisualStyleBackColor = true; + this.checkBoxIsVolumeConstant.CheckedChanged += new System.EventHandler(this.checkBoxIsVolumeConstant_CheckedChanged); // // label3 // this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(220, 555); + this.label3.Location = new System.Drawing.Point(252, 571); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(42, 13); + this.label3.Size = new System.Drawing.Size(29, 13); this.label3.TabIndex = 6; - this.label3.Text = "Volume"; + this.label3.Text = "Area"; // // comboBoxVolume // this.comboBoxVolume.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.comboBoxVolume.Enabled = false; this.comboBoxVolume.FormattingEnabled = true; - this.comboBoxVolume.Location = new System.Drawing.Point(351, 552); + this.comboBoxVolume.Location = new System.Drawing.Point(360, 568); this.comboBoxVolume.Name = "comboBoxVolume"; this.comboBoxVolume.Size = new System.Drawing.Size(121, 21); this.comboBoxVolume.TabIndex = 5; this.comboBoxVolume.SelectedIndexChanged += new System.EventHandler(this.comboBoxVolume_SelectedIndexChanged); // - // checkBoxIsVolumeConstant + // label2 // - this.checkBoxIsVolumeConstant.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.checkBoxIsVolumeConstant.AutoSize = true; - this.checkBoxIsVolumeConstant.Checked = true; - this.checkBoxIsVolumeConstant.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxIsVolumeConstant.Location = new System.Drawing.Point(281, 554); - this.checkBoxIsVolumeConstant.Name = "checkBoxIsVolumeConstant"; - this.checkBoxIsVolumeConstant.Size = new System.Drawing.Size(68, 17); - this.checkBoxIsVolumeConstant.TabIndex = 7; - this.checkBoxIsVolumeConstant.Text = "Constant"; - this.checkBoxIsVolumeConstant.UseVisualStyleBackColor = true; - this.checkBoxIsVolumeConstant.CheckedChanged += new System.EventHandler(this.checkBoxIsVolumeConstant_CheckedChanged); + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(309, 544); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Axis Y"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(309, 517); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(36, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Axis X"; // - // FormToDisplayTable + // FormToDisplayDataTable // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(967, 598); this.Controls.Add(this.splitContainer1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormToDisplayTable"; + this.Name = "FormToDisplayDataTable"; this.Text = "FormToDisplayTable"; ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForTable)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).EndInit(); @@ -229,6 +305,12 @@ private void InitializeComponent() this.splitContainer1.Panel2.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); + this.splitContainerHorizontal.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerHorizontal)).EndInit(); + this.splitContainerHorizontal.ResumeLayout(false); + this.splitContainerVertical.Panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerVertical)).EndInit(); + this.splitContainerVertical.ResumeLayout(false); this.ResumeLayout(false); } @@ -248,6 +330,10 @@ private void InitializeComponent() private System.Windows.Forms.Label label3; public System.Windows.Forms.ComboBox comboBoxVolume; private System.Windows.Forms.CheckBox checkBoxIsVolumeConstant; + private System.Windows.Forms.SplitContainer splitContainerHorizontal; + private System.Windows.Forms.SplitContainer splitContainerVertical; + private System.Windows.Forms.Button buttonCollapseVertical; + private System.Windows.Forms.Button buttonCollapseHorizontal; } diff --git a/Cell-by-Cell and DB/FormToDisplayDataTable.cs b/Cell-by-Cell and DB/FormToDisplayDataTable.cs new file mode 100644 index 0000000..95c6dca --- /dev/null +++ b/Cell-by-Cell and DB/FormToDisplayDataTable.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; +using weka.core; +using System.Windows.Forms.DataVisualization.Charting; +using HCSAnalyzer.TMP_ToBeRemoved; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + public partial class cDisplayScatter2D : Form + { + private DataTable dt; + cGlobalInfo GlobalInfo; + + public cDisplayScatter2D(DataTable dt, cGlobalInfo GlobalInfo) + { + InitializeComponent(); + + #region initialize histograms display + splitContainerHorizontal.Panel1Collapsed = true; + splitContainerVertical.Panel2Collapsed = true; + + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerVertical.Panel2Collapsed) + ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + else + ImageOriginal.RotateFlip(RotateFlipType.Rotate90FlipNone); + + buttonCollapseVertical.BackgroundImage = ImageOriginal; + #endregion + + this.chartForPoints.BorderlineColor = Color.Black; + this.dt = dt; + this.dataGridViewForTable.DataSource = dt; + this.GlobalInfo = GlobalInfo; + + + } + + public cDisplayScatter2D(List MyData) + { + InitializeComponent(); + + #region initialize histograms display + splitContainerHorizontal.Panel1Collapsed = true; + splitContainerVertical.Panel2Collapsed = true; + + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerVertical.Panel2Collapsed) + ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + else + ImageOriginal.RotateFlip(RotateFlipType.Rotate90FlipNone); + + buttonCollapseVertical.BackgroundImage = ImageOriginal; + #endregion + + this.chartForPoints.BorderlineColor = Color.Black; + + this.GlobalInfo = null; + + + this.dt = createDataTable(MyData); + this.dataGridViewForTable.DataSource = dt; + + foreach (var item in MyData) + { + this.comboBoxAxeX.Items.Add(item.Name); + this.comboBoxAxeY.Items.Add(item.Name); + this.comboBoxVolume.Items.Add(item.Name); + } + + this.comboBoxAxeX.SelectedIndex = 0; + this.comboBoxAxeY.SelectedIndex = 0; + this.comboBoxVolume.SelectedIndex = 0; + + } + + DataTable createDataTable(List MyData) + { + DataTable CurrentTable = new DataTable(); + + int IdxCol = 0; + foreach (cExtendedList item in MyData) + { + DataColumn NewCol = null; + if (item.Name != null) + NewCol = new DataColumn(MyData[IdxCol++].Name, typeof(double)); + else + NewCol = new DataColumn("Column " + IdxCol++, typeof(double)); + + CurrentTable.Columns.Add(NewCol); + } + + for (int Idx = 0; Idx < MyData[0].Count; Idx++) + { + CurrentTable.Rows.Add(); + + for (int IdxColumn = 0; IdxColumn < MyData.Count; IdxColumn++) + { + CurrentTable.Rows[CurrentTable.Rows.Count - 1][IdxColumn] = MyData[IdxColumn][Idx]; + } + } + + //DataGridView NewDataGridView = new DataGridView(); + //NewDataGridView.DataSource = CurrentTable; + + // FormToDisplayDataTable FDT = new FormToDisplayDataTable(CurrentTable, null); + // FDT.Show(); + + return CurrentTable; + } + + + private void ReDraw() + { + cExtendedList ListX = new cExtendedList(); + cExtendedList ListY = new cExtendedList(); + + if (this.comboBoxAxeY.SelectedIndex == -1) return; + if (this.comboBoxVolume.SelectedIndex == -1) return; + + cExtendedList ListVolumes = new cExtendedList(); + + for (int j = 0; j < dt.Rows.Count; j++) + { + ListX.Add(double.Parse(dt.Rows[j][this.comboBoxAxeX.SelectedIndex].ToString())); + ListY.Add(double.Parse(dt.Rows[j][this.comboBoxAxeY.SelectedIndex].ToString())); + ListVolumes.Add(double.Parse(dt.Rows[j][this.comboBoxVolume.SelectedIndex].ToString())); + } + + this.chartForPoints.ChartAreas[0].AxisX.Title = this.comboBoxAxeX.SelectedItem.ToString(); + this.chartForPoints.ChartAreas[0].AxisY.Title = this.comboBoxAxeY.SelectedItem.ToString(); + this.chartForPoints.Series[0].Points.DataBindXY(ListX, ListY); + + this.chartForPoints.ChartAreas[0].AxisX.Minimum = ListX.Min(); + this.chartForPoints.ChartAreas[0].AxisX.Maximum = ListX.Max(); + + this.chartForPoints.ChartAreas[0].AxisY.Minimum = ListY.Min(); + this.chartForPoints.ChartAreas[0].AxisY.Maximum = ListY.Max(); + + if (!checkBoxIsVolumeConstant.Checked) + { + double MaxVolume = ListVolumes.Max(); + double MinVolume = ListVolumes.Min(); + + for (int j = 0; j < dt.Rows.Count; j++) + { + int MarkerArea = (int)((45* (ListVolumes[j] - MinVolume)) / (MaxVolume - MinVolume))+3; + this.chartForPoints.Series[0].Points[j].MarkerSize = MarkerArea; + Color C = this.chartForPoints.Series[0].Points[j].Color;// = + } + } + + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + { + //int ConvertedValue = (int)(((Classes[j] - 0) * (LUT[0].Length - 1)) / (eval.getNumClusters() - 0)); + // this.chartForPoints.Series[0].Points[j].MarkerColor = GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay; + this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, Color.OrangeRed ); + } + + if (checkBoxIsVolumeConstant.Checked) + { + for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + this.chartForPoints.Series[0].Points[j].MarkerSize = 10; + } + + + for (int j = 0; j < dt.Rows.Count; j++) + this.chartForPoints.Series[0].Points[j].Tag = dataGridViewForTable.Rows[j];//dt.Rows[j]; + + this.chartForPoints.ChartAreas[0].AxisX.LabelStyle.Format = "N2"; + this.chartForPoints.ChartAreas[0].AxisY.LabelStyle.Format = "N2"; + + } + + private void comboBoxAxeX_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + if (splitContainerVertical.Panel2Collapsed) return; + RedrawHistoHorizontal(); + } + + private void comboBoxAxeY_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + RedrawHistoVertical(); + } + + private void RedrawHistoVertical() + { + cExtendedList ListValue = new cExtendedList(); + for (int Idx = 0; Idx < this.dt.Rows.Count; Idx++) + ListValue.Add(double.Parse(this.dt.Rows[Idx][comboBoxAxeY.SelectedIndex].ToString())); + + cPanelHisto PanelHisto = new cPanelHisto(ListValue, eGraphType.HISTOGRAM, eOrientation.VERTICAL); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BackColor = Color.White; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Size = new System.Drawing.Size(splitContainerHorizontal.Panel1.Width, splitContainerVertical.Panel1.Height); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Location = new Point(0, 0); + + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BorderStyle = BorderStyle.None; + + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Minimum = chartForPoints.ChartAreas[0].AxisY.Minimum; + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Maximum = chartForPoints.ChartAreas[0].AxisY.Maximum; + + splitContainerHorizontal.Panel1.Controls.Clear(); + splitContainerHorizontal.Panel1.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + + } + + private void RedrawHistoHorizontal() + { + cExtendedList ListValue = new cExtendedList(); + for (int Idx = 0; Idx < this.dt.Rows.Count; Idx++) + ListValue.Add(double.Parse(this.dt.Rows[Idx][comboBoxAxeX.SelectedIndex].ToString())); + + cPanelHisto PanelHisto = new cPanelHisto(ListValue, eGraphType.HISTOGRAM, eOrientation.HORIZONTAL); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Size = new System.Drawing.Size(splitContainerVertical.Panel2.Width - 23, splitContainerVertical.Panel2.Height); + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BackColor = Color.White; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Location = new Point(23, 0); + + PanelHisto.WindowForPanelHisto.panelForGraphContainer.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + PanelHisto.WindowForPanelHisto.panelForGraphContainer.BorderStyle = BorderStyle.None; + + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Minimum = chartForPoints.ChartAreas[0].AxisX.Minimum; + PanelHisto.WindowForPanelHisto.CurrentChartArea.AxisX.Maximum = chartForPoints.ChartAreas[0].AxisX.Maximum; + + splitContainerVertical.Panel2.Controls.Clear(); + splitContainerVertical.Panel2.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + } + + private void comboBoxVolume_SelectedIndexChanged(object sender, EventArgs e) + { + ReDraw(); + } + + //private void showClassificationTreeToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // if (GlobalInfo.CurrentScreen.CellBasedClassification.J48Model == null) return; + // GlobalInfo.CurrentScreen.CellBasedClassification.DisplayTree(GlobalInfo).Show(); + //} + + //private void applyClassificationModelToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // return; + + // Instances ListInstancesTOClassify = GlobalInfo.CurrentScreen.CellBasedClassification.CreateInstancesWithoutClass(dt); + + // FastVector attVals = new FastVector(); + // for (int i = 0; i < GlobalInfo.CurrentScreen.CellBasedClassification.NumClasses; i++) + // attVals.addElement(i.ToString()); + + // ListInstancesTOClassify.insertAttributeAt(new weka.core.Attribute("Class", attVals), ListInstancesTOClassify.numAttributes()); + // ListInstancesTOClassify.setClassIndex(ListInstancesTOClassify.numAttributes() - 1); + + // List ListIdx = new List(); + // int Max = int.MinValue; + // int Min = int.MaxValue; + + // for (int i = 0; i < ListInstancesTOClassify.numInstances(); i++) + // { + // Instance InstToProcess = ListInstancesTOClassify.instance(i); + // int Value =(int)GlobalInfo.CurrentScreen.CellBasedClassification.J48Model.classifyInstance(InstToProcess); + // if (Value > Max) Max = Value; + // if (Value < Min) Min = Value; + + // ListIdx.Add(Value); + // } + + // byte[][] LUT = GlobalInfo.LUT; + + // for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) + // { + // int ConvertedValue = (int)(((ListIdx[j] - Min) * (LUT[0].Length - 1)) / (Max - Min)); + // this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); + // } + //} + + private void checkBoxIsVolumeConstant_CheckedChanged(object sender, EventArgs e) + { + comboBoxVolume.Enabled = !checkBoxIsVolumeConstant.Checked; + ReDraw(); + } + + private void chartForPoints_MouseDoubleClick(object sender, MouseEventArgs e) + { + HitTestResult Res = this.chartForPoints.HitTest(e.X, e.Y, ChartElementType.DataPoint); + if (Res.Series == null) return; + + DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + + DataGridViewRow DR = (DataGridViewRow)Res.Series.Points[Res.PointIndex].Tag; + if (DR.Index == -1) return; + dataGridViewForTable.CurrentRow.Selected = false; + // dataGridViewForTable.SelectedRows.SelectedRows.Clear(); + DR.Selected = true; + + dataGridViewForTable.FirstDisplayedScrollingRowIndex = DR.Index; + + + // + //DR. + + /*cWell WellToTransfer = (cWell)(PtToTransfer.Tag); + if (WellToTransfer == null) return; + + List ListNewItemForClass = new List(); + for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedClass(); i++) + { + ToolStripItem ChangeClassItem = new ToolStripMenuItem("Class " + i); + if (i == WellToTransfer.GetClass()) ChangeClassItem.ForeColor = Color.Gray; + ChangeClassItem.Click += new System.EventHandler(this.ChangeClass); + ListNewItemForClass.Add(ChangeClassItem); + } + if (Res.Series.Points[Res.PointIndex].Tag.GetType().Name.ToString() != "cWell") return; + + WellToTransfer.BuildAndisplaySimpleContextMenu(ListNewItemForClass.ToArray()); + */ + } + + private void dataGridViewForTable_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) + { + if ((e.ColumnIndex == -1) || (e.RowIndex == -1)) return; + } + + private void buttonCollapseVertical_Click(object sender, EventArgs e) + { + splitContainerVertical.Panel2Collapsed = !splitContainerVertical.Panel2Collapsed; + + if ((!splitContainerVertical.Panel2Collapsed) && (splitContainerVertical.Panel2.Controls.Count == 0)) + { + RedrawHistoHorizontal(); + } + + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerVertical.Panel2Collapsed) + { + ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + } + else + { + ImageOriginal.RotateFlip(RotateFlipType.Rotate90FlipNone); + } + buttonCollapseVertical.BackgroundImage = ImageOriginal; + } + + private void buttonCollapseHorizontal_Click(object sender, EventArgs e) + { + splitContainerHorizontal.Panel1Collapsed = !splitContainerHorizontal.Panel1Collapsed; + System.Drawing.Image ImageOriginal = (System.Drawing.Image)(Properties.Resources.Arrow); + if (splitContainerHorizontal.Panel1Collapsed) + { + // ImageOriginal.RotateFlip(RotateFlipType.Rotate270FlipNone); + } + else + { + ImageOriginal.RotateFlip(RotateFlipType.RotateNoneFlipX); + } + buttonCollapseHorizontal.BackgroundImage = ImageOriginal; + } + + private void chartForPoints_Resize(object sender, EventArgs e) + { + if (splitContainerHorizontal.Panel1.Controls.Count == 0) return; + splitContainerHorizontal.Panel1.Controls[0].Size = new System.Drawing.Size(splitContainerHorizontal.Panel1.Width, splitContainerVertical.Panel1.Height); + } + } +} diff --git a/Cell-by-Cell and DB/FormToDisplayDataTable.resx b/Cell-by-Cell and DB/FormToDisplayDataTable.resx new file mode 100644 index 0000000..556ed3a --- /dev/null +++ b/Cell-by-Cell and DB/FormToDisplayDataTable.resx @@ -0,0 +1,1793 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 82 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Classes/cCell.cs b/Cell-by-Cell and DB/Simulator/Classes/cCell.cs new file mode 100644 index 0000000..2178cb2 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Classes/cCell.cs @@ -0,0 +1,468 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Classes; +using System.Drawing; +using HCSAnalyzer.Simulator.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Simulator.Classes +{ + [Serializable] + public class cCellPopulation : List + { + public string Name; + public string Information; + + /// + /// Variables for changing parameter within the plates + /// + public cListVariables AssociatedVariables; + + public cCellPopulation(string Name) + { + this.Name = Name; + } + + public cExtendedList GetVolumes() + { + cExtendedList ToReturn = new cExtendedList(); + foreach (var Cell in this) + { + ToReturn.Add(Cell.GetVolume()); + } + return ToReturn; + } + + public void AddNewCell() + { + //cCell NewCell = new cCell(this[0].Type, + } + + } + + /// + /// Define the cell velocity + /// + /// + [Serializable] + public class cVelocity + { + cPoint3D Displacement = new cPoint3D(0, 0, 0); + public double Speed = 1; + public double Weight_Left; + public double Weight_Right; + public double Weight_Top; + public double Weight_Bottom; + public double Weight_Front; + public double Weight_Back; + + + public cVelocity(double[] DisplacementWeights) + { + this.Weight_Left = DisplacementWeights[0]; + this.Weight_Right = DisplacementWeights[1]; + + this.Weight_Front = DisplacementWeights[2]; + this.Weight_Back = DisplacementWeights[3]; + + this.Weight_Top = DisplacementWeights[4]; + this.Weight_Bottom = DisplacementWeights[5]; + } + + public cVelocity(double Front, double Back, double Left, double Right, double Top, double Bottom) + { + this.Weight_Left =Left; + this.Weight_Right = Right; + + this.Weight_Top = Top; + this.Weight_Bottom = Bottom; + + this.Weight_Front = Front; + this.Weight_Back = Back; + } + + public cVelocity() + { + this.Weight_Left = 1; + this.Weight_Right = 1; + + this.Weight_Front = 1; + this.Weight_Back = 1; + + this.Weight_Top = 0; + this.Weight_Bottom = 0; + } + + public cPoint3D GetDisplacement(Random RND) + { + this.Displacement.X = this.Speed*(this.Weight_Right * RND.NextDouble() - this.Weight_Left * RND.NextDouble()); + this.Displacement.Y = this.Speed*(this.Weight_Front * RND.NextDouble() - this.Weight_Back * RND.NextDouble()); + this.Displacement.Z = this.Speed*(this.Weight_Top * RND.NextDouble() - this.Weight_Bottom * RND.NextDouble()); + + return Displacement; + } + + + } + + + /// + /// Define the cell cycle + /// + [Serializable] + public class cCellCycleStage + { + public string Name; + // public List + /// Define the cell cycle + /// + [Serializable] + public class cCellCycle + { + public List ListStages; + + public cCellCycle(List ListStages) + { + this.ListStages.AddRange(ListStages); + } + + //public + + public cCellCycle() + { + // // this.ListProba = new List(); + // //// List ListVolumeOverTime = new List(); + // // for (int t = 0; t < 20; t++) + // // ListProba.Add(5); + // // for (int t = 0; t < 60; t++) + // // ListProba.Add(1); + // // for (int t = 0; t < 20; t++) + // // ListProba.Add(3); + + } + } + + //public enum eCellType { REGULAR, CANCER, SCENESCENT, APOPTOTIC, NECROTIC}; + + public class cListCellType : List + { + public cCellType FindType(string Name) + { + foreach (cCellType item in this) + { + if (item.Name == Name) return item; + } + return null; + } + + public int FindIdxType(cCellType Type) + { + int Idx = -1; + foreach (cCellType item in this) + { + Idx++; + if (item == Type) return Idx; + } + return Idx; + + } + } + + [Serializable] + public class cTransitionValue + { + public cCellType DestType; + public double Value; + + public cTransitionValue(cCellType DestCellType, double Value) + { + this.Value = Value; + this.DestType = DestCellType; + } + } + + [Serializable] + public class cListTransition : List + { + public cTransitionValue FindTransitionFromDestination(string DestTransitionName) + { + foreach (cTransitionValue item in this) + { + if (item.DestType.Name == DestTransitionName) return item; + } + + return null; + } + + } + + [Serializable] + public class cCellType + { + public cCellCycle Cycle { get; private set; } + public Color TypeColor; + + public int CurrentType; + private List CycleProba = new List(); + public cListTransition ListInitialTransitions = new cListTransition(); + public cVelocity Velocity; + + public string Name { get; private set; } + + public void SetCellCyle(cCellCycle NewCycle) + { + this.Cycle = NewCycle; + } + + public cCellType(int CellType, FormForSimuGenerator Parent) + { + this.CurrentType = CellType; + + // for(int i=0;i<100;i++) CycleProba.Add(i); + + switch (CellType) + { + case 0: + this.TypeColor = Color.LightGreen; + this.Name = "Regular"; + this.Cycle = new cCellCycle(); + this.Velocity = new cVelocity(); + this.ListInitialTransitions.Add(new cTransitionValue(this,1)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Cancer"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Scenescent"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Apoptotic"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Necrotic"), 0)); + this.Velocity.Speed = 20; + break; + + case 1: + this.TypeColor = Color.Blue; + this.Name = "Cancer"; + this.Cycle = new cCellCycle(); + this.Velocity = new cVelocity(new double[] { 1, 1, 1, 1, 1, 1 }); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Regular"),0)); + this.ListInitialTransitions.Add(new cTransitionValue(this, 1)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Scenescent"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Apoptotic"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Necrotic"), 0.0)); + this.Velocity.Speed = 40; + break; + + case 2: + this.TypeColor = Color.Yellow; + this.Name = "Scenescent"; + this.Cycle = new cCellCycle(); + this.Velocity = new cVelocity(new double[] { 1, 0.95, 1, 1, 1, 1 }); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Regular"),0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Cancer"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(this, 1)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Apoptotic"), 0.0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Necrotic"), 0)); + this.Velocity.Speed = 10; + break; + + case 3: + this.TypeColor = Color.Red; + this.Name = "Apoptotic"; + this.Cycle = new cCellCycle(); + this.Velocity = new cVelocity(new double[] { 0, 0, 0, 0, 0, 0.1}); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Regular"),0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Cancer"), 0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Scenescent"), 0)); + this.ListInitialTransitions.Add(new cTransitionValue(this, 0.1)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Necrotic"), 0.0)); + this.Velocity.Speed = 1; + break; + + case 4: + this.TypeColor = Color.Wheat; + this.Name = "Necrotic"; + this.Cycle = new cCellCycle(); + this.Velocity = new cVelocity(new double[] { 0, 0, 0, 0, 0, 0.1}); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Regular"),0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Cancer"), 0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Scenescent"), 0)); + this.ListInitialTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType("Apoptotic"), 0)); + this.ListInitialTransitions.Add(new cTransitionValue(this, 1)); + + this.Velocity.Speed = 1; + break; + + } + + } + + + public cCellType(string Name, cVelocity Velocity, Color Color, cCellCycle NewCycle, List NewListInitialTransitions) + { + this.Velocity = Velocity; + this.Name = Name; + this.TypeColor = Color; + this.Cycle = NewCycle; + this.ListInitialTransitions.AddRange(NewListInitialTransitions); + } + + + + } + + + public class cInfoCell + { + cCell Cell; + + public cInfoCell(cCell Cell) + { + this.Cell = Cell; + } + + public double GetDistPath() + { + double Dist = 0; + for(int Mem=0;Mem PreviousStates = new List(); + + public bool MemoryOn = false; + + public cCell(cCellType intialCellType, cPoint3D InitialPosition, double CurrentCyclePos) + { + BasicInit(intialCellType, InitialPosition); + this.CurrentCyclePos = CurrentCyclePos; + } + + + + + + public cCell(cCell CellToCopy) + { + this.CentroidPosition = new cPoint3D(CellToCopy.CentroidPosition.X, + CellToCopy.CentroidPosition.Y, + CellToCopy.CentroidPosition.Z); + this.CurrentCyclePos = CellToCopy.CurrentCyclePos; + } + + + + void BasicInit(cCellType intialCellType, cPoint3D InitialPosition) + { + this.CentroidPosition = new cPoint3D(InitialPosition.X, InitialPosition.Y, InitialPosition.Z); + //this.InitialVolume = InitialVolume; + this.Type = intialCellType; + //this.CurrentListProbaTransitions = this.Type.ListInitialTransitions; + // InitProba(intialCellType); + } + + public c3DSphere Get3DObj() + { + return new c3DSphere(this.CentroidPosition,Math.Sqrt(this.GetVolume()), this.Type.TypeColor , 8); + } + + public double GetVolume() + { + double VolumeToReturn = InitialVolume;// *Type.Cycle.ListProba[((int)CurrentCyclePos) % Type.Cycle.ListProba.Count]; + return VolumeToReturn; + } + + // public cExtendedList CurrentListProbaTransitions = new cExtendedList(); + + //void InitProba(cCellType intialCellType) + //{ + // //switch (intialCellType.Name) + // // { + // // case "regular": + // // this.ListProbaCellType = new cExtendedList { 1, 0, 0, 0, 0}; + // // break; + // // case 1: // cancer + // // this.ListProbaCellType = new cExtendedList { 0, 1, 0, 0, 0}; + // // break; + // // case 2: // scenescent + // // this.ListProbaCellType = new cExtendedList { 0, 0, 1, 0, 0}; + // // break; + // // case 3: // apoptotic + // // this.ListProbaCellType = new cExtendedList { 0, 0, 0, 1, 0}; + // // break; + // // case 4: // necrotic + // // this.ListProbaCellType = new cExtendedList { 0, 0, 0, 0, 1}; + // // break; + // // } + //} + + void ChangeType(cCellType NewType) + { + this.Type = NewType; + } + + public void RunSingleTick(Random RND, FormForSimuGenerator Parent) + { + if (MemoryOn) + { + cCell CopyCell = new cCell(this); + + this.PreviousStates.Add(CopyCell); + } + + double RNDForCellState = RND.NextDouble(); + + List Cumulated = new List(); + Cumulated.Add(this.Type.ListInitialTransitions[0].Value); + for (int Idx = 1; Idx < this.Type.ListInitialTransitions.Count; Idx++) + { + if (RNDForCellState <= Cumulated[Idx - 1]) + { + if((Idx-1)!=this.Type.CurrentType) + this.ChangeType(Parent.ListCellTypes[Idx - 1]); + //this.Type = new cCellType(Idx-1); + //this.Type = eCellType[0]; + break; + } + Cumulated.Add(Cumulated[Idx - 1] + this.Type.ListInitialTransitions[Idx].Value); + } + + cPoint3D CurrentMvt = this.Type.Velocity.GetDisplacement(RND); + if ((CurrentMvt.X + this.CentroidPosition.X < 0) || (CurrentMvt.X + this.CentroidPosition.X >= Parent.NewWorld.Dimensions.X)) + CurrentMvt.X = 0; + if ((CurrentMvt.Y + this.CentroidPosition.Y < 0) || (CurrentMvt.Y + this.CentroidPosition.Y >= Parent.NewWorld.Dimensions.Y)) + CurrentMvt.Y = 0; + if ((CurrentMvt.Z + this.CentroidPosition.Z < 0) || (CurrentMvt.Z + this.CentroidPosition.Z >= Parent.NewWorld.Dimensions.Z)) + CurrentMvt.Z = 0; + + this.CentroidPosition += CurrentMvt; + CurrentCyclePos++; + } + + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Classes/cClassForVariable.cs b/Cell-by-Cell and DB/Simulator/Classes/cClassForVariable.cs new file mode 100644 index 0000000..d3d92f7 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Classes/cClassForVariable.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Simulator.Classes +{ + + [Serializable] + public class cClassForRandomParam + { + public double Min = 0; + public double Max = 1; + + } + + [Serializable] + public class cListVariables : List + { + public cListVariables(List ListVar) + { + foreach (cClassForVariable item in ListVar) + { + this.Add(item); + } + } + + public cClassForVariable FindVariable(string Name) + { + foreach (cClassForVariable item in this) + if (item.Name == Name) return item; + + return null; + } + } + + [Serializable] + public class cClassForVariable + { + public string Name; + public bool IsConstant = true; + public bool IsVariableAlongColumns = false; + public bool IsVariableAlongRows = false; + public bool IsVariableRandom = false; + public double Increment = 1.0f; + + public double Cst_Value; + + public cClassForVariable(string Name, double Value) + { + this.Cst_Value = Value; + this.Name = Name; + } + + public cClassForRandomParam RandomInfo = new cClassForRandomParam(); + } +} diff --git a/Cell-by-Cell and DB/Simulator/Classes/cSimulator.cs b/Cell-by-Cell and DB/Simulator/Classes/cSimulator.cs new file mode 100644 index 0000000..b1cd04d --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Classes/cSimulator.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Simulator.Classes +{ + class cSimulator + { + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Classes/cWorld.cs b/Cell-by-Cell and DB/Simulator/Classes/cWorld.cs new file mode 100644 index 0000000..9883fdf --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Classes/cWorld.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Simulator.Forms; + +namespace HCSAnalyzer.Simulator.Classes +{ + public class cWorld + { + public cPoint3D Dimensions { get; private set; } + public cCellPopulation ListCells = new cCellPopulation("Complete Cell Population"); + public Random RND = new Random(); + //List CellNumber = new List(); + //List CellPosition = new List(); + + FormForSimuGenerator Parent; + public cWorld(cPoint3D Dimensions, FormForSimuGenerator Parent) + { + this.Dimensions = new cPoint3D(Dimensions.X, Dimensions.Y, Dimensions.Z); + this.Parent = Parent; + } + + public void RunSimu(int TickNumber) + { + //CellNumber.Clear(); + + for (int Tick = 0; Tick < TickNumber; Tick++) + { + //CellNumber.Add(ListCells.Count); + + for(int IdxCell=0;IdxCell + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFor3DVisu)); + this.renderWindowControlFor3D = new Kitware.VTK.RenderWindowControl(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.buttonDisplayVolumes = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // renderWindowControlFor3D + // + this.renderWindowControlFor3D.AddTestActors = false; + this.renderWindowControlFor3D.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.renderWindowControlFor3D.Location = new System.Drawing.Point(12, 12); + this.renderWindowControlFor3D.Name = "renderWindowControlFor3D"; + this.renderWindowControlFor3D.Size = new System.Drawing.Size(745, 535); + this.renderWindowControlFor3D.TabIndex = 1; + this.renderWindowControlFor3D.TestText = null; + this.renderWindowControlFor3D.Load += new System.EventHandler(this.renderWindowControlFor3D_Load); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.buttonDisplayVolumes); + this.groupBox1.Location = new System.Drawing.Point(763, 8); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(152, 543); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Info"; + // + // buttonDisplayVolumes + // + this.buttonDisplayVolumes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDisplayVolumes.Location = new System.Drawing.Point(25, 31); + this.buttonDisplayVolumes.Name = "buttonDisplayVolumes"; + this.buttonDisplayVolumes.Size = new System.Drawing.Size(106, 23); + this.buttonDisplayVolumes.TabIndex = 0; + this.buttonDisplayVolumes.Text = "Display Volumes"; + this.buttonDisplayVolumes.UseVisualStyleBackColor = true; + this.buttonDisplayVolumes.Click += new System.EventHandler(this.buttonDisplayVolumes_Click); + // + // FormFor3DVisu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(926, 559); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.renderWindowControlFor3D); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormFor3DVisu"; + this.Text = "Simulation 3D Display"; + this.groupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public Kitware.VTK.RenderWindowControl renderWindowControlFor3D; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button buttonDisplayVolumes; + + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormFor3DVisu.cs b/Cell-by-Cell and DB/Simulator/Forms/FormFor3DVisu.cs new file mode 100644 index 0000000..b51bed9 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormFor3DVisu.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes._3D; +using LibPlateAnalysis; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; + +namespace HCSAnalyzer.Simulator.Forms +{ + public partial class FormFor3DVisu : Form + { + c3DWorld CurrentWorld; + cScreening CompleteScreening; + //cWorld NewWorld; + FormForSimuGenerator Parent; + + public FormFor3DVisu(cScreening CompleteScreening, FormForSimuGenerator Parent) + { + InitializeComponent(); + this.CompleteScreening = CompleteScreening; + //this.NewWorld = NewWorld; + this.Parent = Parent; + } + + private void renderWindowControlFor3D_Load(object sender, EventArgs e) + { + Display3D(); + } + + private void Display3D() + { + + + int[] ListPos = new int[3]; + ListPos[0] = 0; + ListPos[1] = 0; + ListPos[2] = 0; + + if (CurrentWorld == null) + { + CurrentWorld = new c3DWorld(Parent.NewWorld.Dimensions, new cPoint3D(1,1,1), this.renderWindowControlFor3D, ListPos, CompleteScreening); + } + CurrentWorld.ren1.RemoveAllViewProps(); + foreach (var CurrentCell in Parent.NewWorld.ListCells) + { + c3DSphere CurrentSphere = CurrentCell.Get3DObj(); + + if (Parent.ListClusteringAlgo.GetListParams("3D").GetListValuesParam().ListCheckValues.Get("checkBoxDisplayText").Value) + CurrentSphere.AddText(CurrentCell.Type.Name,CurrentWorld,2,CurrentCell.Type.TypeColor); + + if (Parent.ListClusteringAlgo.GetListParams("3D").GetListValuesParam().ListCheckValues.Get("checkBoxDisplayCellPath").Value) + { + for (int Memory = 0; Memory < CurrentCell.PreviousStates.Count-1; Memory++) + { + c3DLine NewLineForMemory = new c3DLine(CurrentCell.PreviousStates[Memory].CentroidPosition,CurrentCell.PreviousStates[Memory + 1].CentroidPosition); + NewLineForMemory.Colour = CurrentCell.Type.TypeColor; + CurrentWorld.AddGeometric3DObject(NewLineForMemory); + } + + c3DLine NewLineForMemoryFinal = new c3DLine(CurrentCell.PreviousStates[CurrentCell.PreviousStates.Count - 1].CentroidPosition, + CurrentCell.CentroidPosition); + NewLineForMemoryFinal.Colour = CurrentCell.Type.TypeColor; + CurrentWorld.AddGeometric3DObject(NewLineForMemoryFinal); + + } + + + CurrentWorld.AddGeometric3DObject(CurrentSphere); + // CurrentSphere.Colour = CurrentCell.Type.TypeColor; + + } + + + CurrentWorld.DisplayBottom(Color.White); + + CurrentWorld.Render(); + + + } + + private void buttonDisplayVolumes_Click(object sender, EventArgs e) + { + cWindowToDisplayHisto WindowToDisplayHisto = new cWindowToDisplayHisto(CompleteScreening, Parent.NewWorld.ListCells.GetVolumes()); + WindowToDisplayHisto.Show(); + } + + } +} diff --git a/Forms/ClusteringForms/FormForEMInfo.resx b/Cell-by-Cell and DB/Simulator/Forms/FormFor3DVisu.resx similarity index 100% rename from Forms/ClusteringForms/FormForEMInfo.resx rename to Cell-by-Cell and DB/Simulator/Forms/FormFor3DVisu.resx diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.Designer.cs new file mode 100644 index 0000000..b875f0a --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.Designer.cs @@ -0,0 +1,84 @@ +namespace HCSAnalyzer.Simulator.Forms +{ + partial class FormForCellTypeRelationships + { + /// + /// 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(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForCellTypeRelationships)); + this.panel = new System.Windows.Forms.Panel(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.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.panel.Location = new System.Drawing.Point(12, 12); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(480, 387); + this.panel.TabIndex = 0; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.refreshToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(153, 48); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // FormForCellTypeRelationships + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(504, 411); + this.Controls.Add(this.panel); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormForCellTypeRelationships"; + this.Text = "Cell Type Relationships"; + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.cs new file mode 100644 index 0000000..a5a3f82 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Microsoft.Msagl.GraphViewerGdi; +using HCSAnalyzer.Simulator.Classes; + +namespace HCSAnalyzer.Simulator.Forms +{ + public partial class FormForCellTypeRelationships : Form + { + FormForSimuGenerator Parent; + GViewer GraphView; + Microsoft.Msagl.Drawing.Graph graph; + + public FormForCellTypeRelationships(FormForSimuGenerator Parent) + { + InitializeComponent(); + this.Parent = Parent; + + GraphView = new GViewer(); + graph = new Microsoft.Msagl.Drawing.Graph("graph"); + GraphView.Size = new System.Drawing.Size(panel.Width, panel.Height); + GraphView.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + + RefreshDisplay(); + + } + + + + void RefreshDisplay() + { + + + foreach (cCellType item in Parent.ListCellTypes) + { + Microsoft.Msagl.Drawing.Node NewNode = new Microsoft.Msagl.Drawing.Node(item.Name); + NewNode.Label.FontColor = new Microsoft.Msagl.Drawing.Color(item.TypeColor.R, item.TypeColor.G, item.TypeColor.B); + + NewNode.Attr.FillColor = Microsoft.Msagl.Drawing.Color.DimGray; + NewNode.Attr.Shape = Microsoft.Msagl.Drawing.Shape.Ellipse; + graph.AddNode(NewNode); + } + + + + foreach (cCellType item in Parent.ListCellTypes) + { + foreach (cTransitionValue Transitions in item.ListInitialTransitions) + { + if (Transitions.Value == 0) continue; + Microsoft.Msagl.Drawing.Edge Currentedge = new Microsoft.Msagl.Drawing.Edge(item.Name, Transitions.Value.ToString(), Transitions.DestType.Name); + //Currentedge.Label.FontSize = Transitions.Value; + //Currentedge.LabelText = ; + graph.Edges.Add(Currentedge); + } + + + } + + GraphView.Graph = graph; + + GraphView.Dock = System.Windows.Forms.DockStyle.Fill; + + this.panel.Controls.Add(GraphView); + + + } + + private void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayTable.resx b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.resx similarity index 99% rename from Forms/FormsForGraphsDisplay/FormToDisplayTable.resx rename to Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.resx index ec2cd0b..bb8e796 100644 --- a/Forms/FormsForGraphsDisplay/FormToDisplayTable.resx +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForCellTypeRelationships.resx @@ -117,7 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.Designer.cs new file mode 100644 index 0000000..ef0bd3d --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.Designer.cs @@ -0,0 +1,471 @@ +namespace HCSAnalyzer.Simulator.Forms +{ + partial class FormForInfoSingleCellPopInit_Simulator + { + /// + /// 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(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForInfoSingleCellPopInit_Simulator)); + this.buttonOK = new System.Windows.Forms.Button(); + this.labelForCellNumber = new System.Windows.Forms.Label(); + this.numericUpDownInitialCellNumber = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.comboBoxCellType = new System.Windows.Forms.ComboBox(); + this.textBoxName = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBoxCellPos = new System.Windows.Forms.GroupBox(); + this.panelManualPos = new System.Windows.Forms.Panel(); + this.labelZ = new System.Windows.Forms.Label(); + this.numericUpDownManualZ = new System.Windows.Forms.NumericUpDown(); + this.labelY = new System.Windows.Forms.Label(); + this.numericUpDownManualY = new System.Windows.Forms.NumericUpDown(); + this.labelX = new System.Windows.Forms.Label(); + this.numericUpDownManualX = new System.Windows.Forms.NumericUpDown(); + this.radioButtonPosRandom = new System.Windows.Forms.RadioButton(); + this.radioButtonPosManual = new System.Windows.Forms.RadioButton(); + this.contextMenuStripForManual = new System.Windows.Forms.ContextMenuStrip(this.components); + this.worldCenterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.randomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.radioButtonPosWorldCenter = new System.Windows.Forms.RadioButton(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.groupBoxForVolume = new System.Windows.Forms.GroupBox(); + this.radioButtonVolumeFixed = new System.Windows.Forms.RadioButton(); + this.radioButtonVolumeRandom = new System.Windows.Forms.RadioButton(); + this.numericUpDownInitialVolumeManual = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.richTextBoxDescription = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInitialCellNumber)).BeginInit(); + this.groupBoxCellPos.SuspendLayout(); + this.panelManualPos.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualZ)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualY)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualX)).BeginInit(); + this.contextMenuStripForManual.SuspendLayout(); + this.groupBoxForVolume.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInitialVolumeManual)).BeginInit(); + this.SuspendLayout(); + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(315, 358); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 0; + this.buttonOK.Text = "Ok"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // labelForCellNumber + // + this.labelForCellNumber.AutoSize = true; + this.labelForCellNumber.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelForCellNumber.Location = new System.Drawing.Point(197, 16); + this.labelForCellNumber.Name = "labelForCellNumber"; + this.labelForCellNumber.Size = new System.Drawing.Size(64, 13); + this.labelForCellNumber.TabIndex = 11; + this.labelForCellNumber.Text = "Cell Number"; + this.toolTip.SetToolTip(this.labelForCellNumber, "Click to tansform this constant into a variable"); + this.labelForCellNumber.Click += new System.EventHandler(this.labelForCellNumber_Click); + // + // numericUpDownInitialCellNumber + // + this.numericUpDownInitialCellNumber.Location = new System.Drawing.Point(284, 13); + this.numericUpDownInitialCellNumber.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownInitialCellNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownInitialCellNumber.Name = "numericUpDownInitialCellNumber"; + this.numericUpDownInitialCellNumber.Size = new System.Drawing.Size(100, 20); + this.numericUpDownInitialCellNumber.TabIndex = 10; + this.numericUpDownInitialCellNumber.Value = new decimal(new int[] { + 300, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(197, 47); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(51, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Cell Type"; + // + // comboBoxCellType + // + this.comboBoxCellType.FormattingEnabled = true; + this.comboBoxCellType.Items.AddRange(new object[] { + "Regular", + "Cancer", + "Scenecent", + "Apoptotic", + "Necrotic"}); + this.comboBoxCellType.Location = new System.Drawing.Point(284, 43); + this.comboBoxCellType.Name = "comboBoxCellType"; + this.comboBoxCellType.Size = new System.Drawing.Size(100, 21); + this.comboBoxCellType.TabIndex = 8; + // + // textBoxName + // + this.textBoxName.Location = new System.Drawing.Point(55, 14); + this.textBoxName.Name = "textBoxName"; + this.textBoxName.Size = new System.Drawing.Size(116, 20); + this.textBoxName.TabIndex = 12; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(14, 17); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 9; + this.label1.Text = "Name"; + // + // groupBoxCellPos + // + this.groupBoxCellPos.Controls.Add(this.panelManualPos); + this.groupBoxCellPos.Controls.Add(this.radioButtonPosRandom); + this.groupBoxCellPos.Controls.Add(this.radioButtonPosManual); + this.groupBoxCellPos.Controls.Add(this.radioButtonPosWorldCenter); + this.groupBoxCellPos.Location = new System.Drawing.Point(188, 74); + this.groupBoxCellPos.Name = "groupBoxCellPos"; + this.groupBoxCellPos.Size = new System.Drawing.Size(200, 191); + this.groupBoxCellPos.TabIndex = 13; + this.groupBoxCellPos.TabStop = false; + this.groupBoxCellPos.Text = "Position"; + // + // panelManualPos + // + this.panelManualPos.Controls.Add(this.labelZ); + this.panelManualPos.Controls.Add(this.numericUpDownManualZ); + this.panelManualPos.Controls.Add(this.labelY); + this.panelManualPos.Controls.Add(this.numericUpDownManualY); + this.panelManualPos.Controls.Add(this.labelX); + this.panelManualPos.Controls.Add(this.numericUpDownManualX); + this.panelManualPos.Enabled = false; + this.panelManualPos.Location = new System.Drawing.Point(42, 91); + this.panelManualPos.Name = "panelManualPos"; + this.panelManualPos.Size = new System.Drawing.Size(108, 88); + this.panelManualPos.TabIndex = 3; + // + // labelZ + // + this.labelZ.AutoSize = true; + this.labelZ.Location = new System.Drawing.Point(6, 62); + this.labelZ.Name = "labelZ"; + this.labelZ.Size = new System.Drawing.Size(14, 13); + this.labelZ.TabIndex = 19; + this.labelZ.Text = "Z"; + this.toolTip.SetToolTip(this.labelZ, "Click to tansform this constant into a variable"); + this.labelZ.Click += new System.EventHandler(this.labelZ_Click); + // + // numericUpDownManualZ + // + this.numericUpDownManualZ.DecimalPlaces = 1; + this.numericUpDownManualZ.Location = new System.Drawing.Point(22, 59); + this.numericUpDownManualZ.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownManualZ.Minimum = new decimal(new int[] { + 10000000, + 0, + 0, + -2147483648}); + this.numericUpDownManualZ.Name = "numericUpDownManualZ"; + this.numericUpDownManualZ.Size = new System.Drawing.Size(74, 20); + this.numericUpDownManualZ.TabIndex = 18; + // + // labelY + // + this.labelY.AutoSize = true; + this.labelY.Location = new System.Drawing.Point(7, 36); + this.labelY.Name = "labelY"; + this.labelY.Size = new System.Drawing.Size(14, 13); + this.labelY.TabIndex = 17; + this.labelY.Text = "Y"; + this.toolTip.SetToolTip(this.labelY, "Click to tansform this constant into a variable"); + this.labelY.Click += new System.EventHandler(this.labelY_Click); + // + // numericUpDownManualY + // + this.numericUpDownManualY.DecimalPlaces = 1; + this.numericUpDownManualY.Location = new System.Drawing.Point(22, 33); + this.numericUpDownManualY.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownManualY.Minimum = new decimal(new int[] { + 10000000, + 0, + 0, + -2147483648}); + this.numericUpDownManualY.Name = "numericUpDownManualY"; + this.numericUpDownManualY.Size = new System.Drawing.Size(74, 20); + this.numericUpDownManualY.TabIndex = 16; + // + // labelX + // + this.labelX.AutoSize = true; + this.labelX.Location = new System.Drawing.Point(7, 10); + this.labelX.Name = "labelX"; + this.labelX.Size = new System.Drawing.Size(14, 13); + this.labelX.TabIndex = 15; + this.labelX.Text = "X"; + this.toolTip.SetToolTip(this.labelX, "Click to tansform this constant into a variable"); + this.labelX.Click += new System.EventHandler(this.labelX_Click); + // + // numericUpDownManualX + // + this.numericUpDownManualX.DecimalPlaces = 1; + this.numericUpDownManualX.Location = new System.Drawing.Point(22, 7); + this.numericUpDownManualX.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownManualX.Minimum = new decimal(new int[] { + 10000000, + 0, + 0, + -2147483648}); + this.numericUpDownManualX.Name = "numericUpDownManualX"; + this.numericUpDownManualX.Size = new System.Drawing.Size(74, 20); + this.numericUpDownManualX.TabIndex = 14; + // + // radioButtonPosRandom + // + this.radioButtonPosRandom.AutoSize = true; + this.radioButtonPosRandom.Location = new System.Drawing.Point(12, 44); + this.radioButtonPosRandom.Name = "radioButtonPosRandom"; + this.radioButtonPosRandom.Size = new System.Drawing.Size(65, 17); + this.radioButtonPosRandom.TabIndex = 2; + this.radioButtonPosRandom.Text = "Random"; + this.radioButtonPosRandom.UseVisualStyleBackColor = true; + this.radioButtonPosRandom.CheckedChanged += new System.EventHandler(this.radioButtonPosRandom_CheckedChanged); + // + // radioButtonPosManual + // + this.radioButtonPosManual.AutoSize = true; + this.radioButtonPosManual.ContextMenuStrip = this.contextMenuStripForManual; + this.radioButtonPosManual.Location = new System.Drawing.Point(12, 68); + this.radioButtonPosManual.Name = "radioButtonPosManual"; + this.radioButtonPosManual.Size = new System.Drawing.Size(88, 17); + this.radioButtonPosManual.TabIndex = 1; + this.radioButtonPosManual.Text = "Fixed Manual"; + this.radioButtonPosManual.UseVisualStyleBackColor = true; + this.radioButtonPosManual.CheckedChanged += new System.EventHandler(this.radioButtonPosManual_CheckedChanged); + // + // contextMenuStripForManual + // + this.contextMenuStripForManual.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.worldCenterToolStripMenuItem, + this.randomToolStripMenuItem}); + this.contextMenuStripForManual.Name = "contextMenuStripForManual"; + this.contextMenuStripForManual.Size = new System.Drawing.Size(143, 48); + // + // worldCenterToolStripMenuItem + // + this.worldCenterToolStripMenuItem.Name = "worldCenterToolStripMenuItem"; + this.worldCenterToolStripMenuItem.Size = new System.Drawing.Size(142, 22); + this.worldCenterToolStripMenuItem.Text = "World center"; + this.worldCenterToolStripMenuItem.Click += new System.EventHandler(this.worldCenterToolStripMenuItem_Click); + // + // randomToolStripMenuItem + // + this.randomToolStripMenuItem.Name = "randomToolStripMenuItem"; + this.randomToolStripMenuItem.Size = new System.Drawing.Size(142, 22); + this.randomToolStripMenuItem.Text = "Random"; + this.randomToolStripMenuItem.Click += new System.EventHandler(this.randomToolStripMenuItem_Click); + // + // radioButtonPosWorldCenter + // + this.radioButtonPosWorldCenter.AutoSize = true; + this.radioButtonPosWorldCenter.Checked = true; + this.radioButtonPosWorldCenter.Location = new System.Drawing.Point(12, 21); + this.radioButtonPosWorldCenter.Name = "radioButtonPosWorldCenter"; + this.radioButtonPosWorldCenter.Size = new System.Drawing.Size(124, 17); + this.radioButtonPosWorldCenter.TabIndex = 0; + this.radioButtonPosWorldCenter.TabStop = true; + this.radioButtonPosWorldCenter.Text = "Current World Center"; + this.radioButtonPosWorldCenter.UseVisualStyleBackColor = true; + this.radioButtonPosWorldCenter.CheckedChanged += new System.EventHandler(this.radioButtonPosWorldCenter_CheckedChanged); + // + // groupBoxForVolume + // + this.groupBoxForVolume.Controls.Add(this.radioButtonVolumeFixed); + this.groupBoxForVolume.Controls.Add(this.radioButtonVolumeRandom); + this.groupBoxForVolume.Controls.Add(this.numericUpDownInitialVolumeManual); + this.groupBoxForVolume.Location = new System.Drawing.Point(188, 271); + this.groupBoxForVolume.Name = "groupBoxForVolume"; + this.groupBoxForVolume.Size = new System.Drawing.Size(200, 81); + this.groupBoxForVolume.TabIndex = 14; + this.groupBoxForVolume.TabStop = false; + this.groupBoxForVolume.Text = "Initial Volume"; + // + // radioButtonVolumeFixed + // + this.radioButtonVolumeFixed.AutoSize = true; + this.radioButtonVolumeFixed.Checked = true; + this.radioButtonVolumeFixed.Location = new System.Drawing.Point(31, 47); + this.radioButtonVolumeFixed.Name = "radioButtonVolumeFixed"; + this.radioButtonVolumeFixed.Size = new System.Drawing.Size(50, 17); + this.radioButtonVolumeFixed.TabIndex = 16; + this.radioButtonVolumeFixed.TabStop = true; + this.radioButtonVolumeFixed.Text = "Fixed"; + this.radioButtonVolumeFixed.UseVisualStyleBackColor = true; + this.radioButtonVolumeFixed.CheckedChanged += new System.EventHandler(this.radioButtonVolumeFixed_CheckedChanged); + this.radioButtonVolumeFixed.MouseDown += new System.Windows.Forms.MouseEventHandler(this.radioButtonVolumeFixed_MouseDown); + // + // radioButtonVolumeRandom + // + this.radioButtonVolumeRandom.AutoSize = true; + this.radioButtonVolumeRandom.Location = new System.Drawing.Point(31, 22); + this.radioButtonVolumeRandom.Name = "radioButtonVolumeRandom"; + this.radioButtonVolumeRandom.Size = new System.Drawing.Size(65, 17); + this.radioButtonVolumeRandom.TabIndex = 15; + this.radioButtonVolumeRandom.Text = "Random"; + this.radioButtonVolumeRandom.UseVisualStyleBackColor = true; + this.radioButtonVolumeRandom.CheckedChanged += new System.EventHandler(this.radioButtonVolumeRandom_CheckedChanged); + this.radioButtonVolumeRandom.MouseClick += new System.Windows.Forms.MouseEventHandler(this.radioButtonVolumeRandom_MouseClick); + // + // numericUpDownInitialVolumeManual + // + this.numericUpDownInitialVolumeManual.DecimalPlaces = 1; + this.numericUpDownInitialVolumeManual.Location = new System.Drawing.Point(87, 47); + this.numericUpDownInitialVolumeManual.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownInitialVolumeManual.Name = "numericUpDownInitialVolumeManual"; + this.numericUpDownInitialVolumeManual.Size = new System.Drawing.Size(84, 20); + this.numericUpDownInitialVolumeManual.TabIndex = 14; + this.numericUpDownInitialVolumeManual.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(14, 47); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(60, 13); + this.label3.TabIndex = 15; + this.label3.Text = "Description"; + // + // richTextBoxDescription + // + this.richTextBoxDescription.Location = new System.Drawing.Point(17, 74); + this.richTextBoxDescription.Name = "richTextBoxDescription"; + this.richTextBoxDescription.Size = new System.Drawing.Size(154, 277); + this.richTextBoxDescription.TabIndex = 16; + this.richTextBoxDescription.Text = ""; + // + // FormForInfoSingleCellPopInit_Simulator + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(402, 388); + this.Controls.Add(this.richTextBoxDescription); + this.Controls.Add(this.label3); + this.Controls.Add(this.groupBoxForVolume); + this.Controls.Add(this.textBoxName); + this.Controls.Add(this.groupBoxCellPos); + this.Controls.Add(this.label1); + this.Controls.Add(this.labelForCellNumber); + this.Controls.Add(this.numericUpDownInitialCellNumber); + this.Controls.Add(this.label2); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.comboBoxCellType); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForInfoSingleCellPopInit_Simulator"; + this.Text = "Cell population initialization"; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInitialCellNumber)).EndInit(); + this.groupBoxCellPos.ResumeLayout(false); + this.groupBoxCellPos.PerformLayout(); + this.panelManualPos.ResumeLayout(false); + this.panelManualPos.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualZ)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualY)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualX)).EndInit(); + this.contextMenuStripForManual.ResumeLayout(false); + this.groupBoxForVolume.ResumeLayout(false); + this.groupBoxForVolume.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownInitialVolumeManual)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label labelForCellNumber; + private System.Windows.Forms.NumericUpDown numericUpDownInitialCellNumber; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox comboBoxCellType; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBoxName; + private System.Windows.Forms.GroupBox groupBoxCellPos; + private System.Windows.Forms.Panel panelManualPos; + private System.Windows.Forms.Label labelZ; + private System.Windows.Forms.NumericUpDown numericUpDownManualZ; + private System.Windows.Forms.Label labelY; + private System.Windows.Forms.NumericUpDown numericUpDownManualY; + private System.Windows.Forms.Label labelX; + private System.Windows.Forms.NumericUpDown numericUpDownManualX; + private System.Windows.Forms.RadioButton radioButtonPosRandom; + private System.Windows.Forms.RadioButton radioButtonPosManual; + private System.Windows.Forms.RadioButton radioButtonPosWorldCenter; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForManual; + private System.Windows.Forms.ToolStripMenuItem worldCenterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem randomToolStripMenuItem; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.GroupBox groupBoxForVolume; + private System.Windows.Forms.NumericUpDown numericUpDownInitialVolumeManual; + private System.Windows.Forms.RadioButton radioButtonVolumeFixed; + private System.Windows.Forms.RadioButton radioButtonVolumeRandom; + private System.Windows.Forms.Label label3; + public System.Windows.Forms.RichTextBox richTextBoxDescription; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.cs new file mode 100644 index 0000000..af1413d --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.cs @@ -0,0 +1,309 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Classes._3D; + +namespace HCSAnalyzer.Simulator.Forms +{ + public partial class FormForInfoSingleCellPopInit_Simulator : Form + { + public cCellPopulation CellPopulation; + cPoint3D WorldDim; + //cWorld CurrentWorld; + Random RND = new Random(); + + + public cListVariables ListVariables = null; + + public cClassForVariable v_CellNumber = null; + public cClassForVariable v_InitPosX = null; + public cClassForVariable v_InitPosY = null; + public cClassForVariable v_InitPosZ = null; + public cClassForVariable v_InitPosType = null; + public cClassForVariable v_InitVolType = null; + public cClassForVariable v_InitVol = null; + + FormForSimuGenerator Parent; + + public FormForInfoSingleCellPopInit_Simulator(cPoint3D WorldDim, cListVariables ListVariablesInput, FormForSimuGenerator Parent, cCellPopulation CellPopulation) + { + InitializeComponent(); + + if (CellPopulation == null) + { + this.comboBoxCellType.Text = "Regular"; + this.ListVariables = ListVariablesInput; + this.textBoxName.Text = "Population_" + Parent.MyPanelForParamCellPopulations.listViewForCellPopulations.Items.Count; + } + else + { + this.comboBoxCellType.Text = CellPopulation[0].Type.Name; + this.textBoxName.Text = CellPopulation.Name; + ListVariables = CellPopulation.AssociatedVariables; + } + + this.WorldDim = WorldDim; + this.Parent = Parent; + + this.v_CellNumber = ListVariables.FindVariable("v_CellNumber"); + this.v_InitPosX = ListVariables.FindVariable("v_InitPosX"); + this.v_InitPosY = ListVariables.FindVariable("v_InitPosY"); + this.v_InitPosZ = ListVariables.FindVariable("v_InitPosZ"); + this.v_InitPosType = ListVariables.FindVariable("v_InitPosType"); + this.v_InitVolType = ListVariables.FindVariable("v_InitVolType"); + this.v_InitVol = ListVariables.FindVariable("v_InitVol"); + + if (v_InitVolType.Cst_Value == 0) + { + this.radioButtonVolumeRandom.Checked = false; + this.radioButtonVolumeFixed.Checked = true; + } + else if (v_InitVolType.Cst_Value == 10) + { + this.radioButtonVolumeRandom.Checked = true; + this.radioButtonVolumeFixed.Checked = false; + } + + + if (v_InitPosType.Cst_Value == 0) + { + this.radioButtonPosWorldCenter.Checked = true; + this.radioButtonPosRandom.Checked = false; + this.radioButtonPosManual.Checked = false; + } + else if (v_InitPosType.Cst_Value == 1) + { + this.radioButtonPosWorldCenter.Checked = false; + this.radioButtonPosRandom.Checked = true; + this.radioButtonPosManual.Checked = false; + } + else + { + this.radioButtonPosWorldCenter.Checked = false; + this.radioButtonPosRandom.Checked = false; + this.radioButtonPosManual.Checked = true; + } + + this.numericUpDownInitialCellNumber.Value = (decimal)v_CellNumber.Cst_Value; + this.numericUpDownManualX.Value = (decimal)v_InitPosX.Cst_Value; + this.numericUpDownManualY.Value = (decimal)v_InitPosY.Cst_Value; + this.numericUpDownManualZ.Value = (decimal)v_InitPosZ.Cst_Value; + this.numericUpDownInitialVolumeManual.Value = (decimal)v_InitVol.Cst_Value; + + if (v_InitVol.IsConstant) + { + this.radioButtonVolumeFixed.Checked = true; + this.radioButtonVolumeRandom.Checked = false; + } + else + { + this.radioButtonVolumeFixed.Checked = false; + this.radioButtonVolumeRandom.Checked = true; + } + + this.comboBoxCellType.Items.Clear(); + + foreach (cCellType item in Parent.ListCellTypes) + this.comboBoxCellType.Items.Add(item.Name); + } + + private void buttonOK_Click(object sender, EventArgs e) + { + CellPopulation = new cCellPopulation(this.textBoxName.Text); + string CellType = comboBoxCellType.Text; + cCellCycle ClassicCellCycle = new cCellCycle(); // default cell cycle + cPoint3D InitialPos = null; + + if (radioButtonPosWorldCenter.Checked) + InitialPos = new cPoint3D(this.WorldDim.X / 2, this.WorldDim.Y / 2, this.WorldDim.Z / 2); + + for (int i = 0; i < (int)numericUpDownInitialCellNumber.Value; i++) + { + if (radioButtonPosManual.Checked) + { + InitialPos = new cPoint3D((double)numericUpDownManualX.Value, + (double)numericUpDownManualY.Value, + (double)numericUpDownManualZ.Value); + } + else if (radioButtonPosRandom.Checked) + { + InitialPos = new cPoint3D(RND.NextDouble() * this.WorldDim.X, + RND.NextDouble() * this.WorldDim.Y, + RND.NextDouble() * this.WorldDim.Z); + } + + cCellType CurrentCellType = Parent.ListCellTypes.FindType(CellType); + if (CurrentCellType == null) continue; + + cCell NewCell = new cCell(Parent.ListCellTypes.FindType(CellType), InitialPos, RND.NextDouble() /** ClassicCellCycle.ListProba.Count*/); + + //new cCell( + // InitialPos, + // 2, + // RND.NextDouble() * ClassicCellCycle.ListProba.Count); + CellPopulation.Add(NewCell); + } + + List ListToReturn = new List(); + this.v_CellNumber.Cst_Value = (double)numericUpDownInitialCellNumber.Value; + ListToReturn.Add(this.v_CellNumber); + + this.v_InitPosX.Cst_Value = (double)numericUpDownManualX.Value; + ListToReturn.Add(this.v_InitPosX); + + this.v_InitPosY.Cst_Value = (double)numericUpDownManualY.Value; + ListToReturn.Add(this.v_InitPosY); + + this.v_InitPosZ.Cst_Value = (double)numericUpDownManualZ.Value; + ListToReturn.Add(this.v_InitPosZ); + + if (this.radioButtonVolumeFixed.Checked) + this.v_InitVol.IsConstant = true; + else + this.v_InitVol.IsConstant = false; + + + this.v_InitVol.Cst_Value = (double)numericUpDownInitialVolumeManual.Value; + ListToReturn.Add(this.v_InitVol); + + ListToReturn.Add(this.v_InitPosType); + ListToReturn.Add(this.v_InitVolType); + + this.ListVariables = new cListVariables(ListToReturn); + } + + private void radioButtonPosWorldCenter_CheckedChanged(object sender, EventArgs e) + { + RefreshGUIPosition(); + } + + private void radioButtonPosRandom_CheckedChanged(object sender, EventArgs e) + { + RefreshGUIPosition(); + } + + private void radioButtonPosManual_CheckedChanged(object sender, EventArgs e) + { + RefreshGUIPosition(); + } + + void RefreshGUIPosition() + { + panelManualPos.Enabled = radioButtonPosManual.Checked; + + if (radioButtonPosWorldCenter.Checked) + this.v_InitPosType.Cst_Value = 0; + else if (radioButtonPosRandom.Checked) + this.v_InitPosType.Cst_Value = 1; + else + this.v_InitPosType.Cst_Value = 2; + } + + + void RefreshGUIVolume() + { + this.numericUpDownInitialVolumeManual.Enabled = this.radioButtonVolumeFixed.Checked; + + if (this.radioButtonVolumeFixed.Checked) + this.v_InitVolType.Cst_Value = 10; + else + this.v_InitVolType.Cst_Value = 0; + } + + + private void worldCenterToolStripMenuItem_Click(object sender, EventArgs e) + { + numericUpDownManualX.Value = (decimal)(this.WorldDim.X / 2); + numericUpDownManualY.Value = (decimal)(this.WorldDim.Y / 2); + numericUpDownManualZ.Value = (decimal)(this.WorldDim.Z / 2); + } + + private void randomToolStripMenuItem_Click(object sender, EventArgs e) + { + numericUpDownManualX.Value = (decimal)(this.RND.NextDouble() * this.WorldDim.X / 2); + numericUpDownManualY.Value = (decimal)(this.RND.NextDouble() * this.WorldDim.Y / 2); + numericUpDownManualZ.Value = (decimal)(this.RND.NextDouble() * this.WorldDim.Z / 2); + } + + #region UpDate Variables and associated display + private void UpdateVar(cClassForVariable Var, Label CurrentLabel) + { + FormForVariableDef WindowForVarDef = new FormForVariableDef(Var); + if (WindowForVarDef.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + Var = WindowForVarDef.thisVariable; + + if (CurrentLabel != null) + { + if (Var.IsConstant == false) CurrentLabel.ForeColor = Color.Firebrick; + else CurrentLabel.ForeColor = Color.Black; + } + } + + private void labelForCellNumber_Click(object sender, EventArgs e) + { + UpdateVar(this.v_CellNumber, labelForCellNumber); + } + + private void labelX_Click(object sender, EventArgs e) + { + UpdateVar(this.v_InitPosX, labelX); + } + + private void labelY_Click(object sender, EventArgs e) + { + UpdateVar(this.v_InitPosY, labelY); + } + + private void labelZ_Click(object sender, EventArgs e) + { + UpdateVar(this.v_InitPosZ, labelZ); + } + #endregion + + + private void labelFixedManual_MouseDown(object sender, MouseEventArgs e) + { + UpdateVar(this.v_InitVol, null); + } + + private void radioButtonVolumeRandom_CheckedChanged(object sender, EventArgs e) + { + this.RefreshGUIVolume(); + } + + private void radioButtonVolumeFixed_CheckedChanged(object sender, EventArgs e) + { + this.RefreshGUIVolume(); + } + + private void radioButtonVolumeFixed_MouseDown(object sender, MouseEventArgs e) + { + + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + UpdateVar(this.v_InitVol, null); + } + + } + + private void radioButtonVolumeRandom_MouseClick(object sender, MouseEventArgs e) + { + // if (e.Button == System.Windows.Forms.MouseButtons.Right) + // { + FormForRandSpecOfVar WindowForRandSpec = new FormForRandSpecOfVar(this.v_InitVol.RandomInfo); + if (WindowForRandSpec.ShowDialog() == System.Windows.Forms.DialogResult.OK) + this.v_InitVol.RandomInfo = WindowForRandSpec.RandomParam; + + // } + } + + + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.resx b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.resx new file mode 100644 index 0000000..3810b26 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForInfoSingleCellPopInit_Simulator.resx @@ -0,0 +1,1793 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 224, 17 + + + 17, 17 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.Designer.cs new file mode 100644 index 0000000..df2b316 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.Designer.cs @@ -0,0 +1,143 @@ +namespace HCSAnalyzer.Simulator.Forms +{ + partial class FormForRandSpecOfVar + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForRandSpecOfVar)); + this.buttonOk = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.numericUpDownMin = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMax = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMin)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMax)).BeginInit(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(101, 70); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(11, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(24, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Min"; + // + // numericUpDownMin + // + this.numericUpDownMin.DecimalPlaces = 2; + this.numericUpDownMin.Location = new System.Drawing.Point(53, 12); + this.numericUpDownMin.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMin.Minimum = new decimal(new int[] { + 1410065408, + 2, + 0, + -2147483648}); + this.numericUpDownMin.Name = "numericUpDownMin"; + this.numericUpDownMin.Size = new System.Drawing.Size(68, 20); + this.numericUpDownMin.TabIndex = 2; + // + // numericUpDownMax + // + this.numericUpDownMax.DecimalPlaces = 2; + this.numericUpDownMax.Location = new System.Drawing.Point(53, 38); + this.numericUpDownMax.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMax.Minimum = new decimal(new int[] { + 1410065408, + 2, + 0, + -2147483648}); + this.numericUpDownMax.Name = "numericUpDownMax"; + this.numericUpDownMax.Size = new System.Drawing.Size(68, 20); + this.numericUpDownMax.TabIndex = 4; + this.numericUpDownMax.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(11, 40); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(27, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Max"; + // + // FormForRandSpecOfVar + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(184, 99); + this.Controls.Add(this.numericUpDownMax); + this.Controls.Add(this.label2); + this.Controls.Add(this.numericUpDownMin); + this.Controls.Add(this.label1); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimizeBox = false; + this.Name = "FormForRandSpecOfVar"; + this.Text = "Random Spec."; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMin)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMax)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + public System.Windows.Forms.NumericUpDown numericUpDownMin; + public System.Windows.Forms.NumericUpDown numericUpDownMax; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.cs new file mode 100644 index 0000000..517611b --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; + +namespace HCSAnalyzer.Simulator.Forms +{ + public partial class FormForRandSpecOfVar : Form + { + public cClassForRandomParam RandomParam; + + public FormForRandSpecOfVar(cClassForRandomParam RandomParam) + { + InitializeComponent(); + this.numericUpDownMax.Value = (decimal)RandomParam.Max; + this.numericUpDownMin.Value = (decimal)RandomParam.Min; + this.RandomParam = RandomParam; + } + + private void buttonOk_Click(object sender, EventArgs e) + { + this.RandomParam.Max = (double)this.numericUpDownMax.Value; + this.RandomParam.Min = (double)this.numericUpDownMin.Value; + + + } + } +} diff --git a/Forms/ClusteringForms/FormForHierarchical.resx b/Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.resx similarity index 100% rename from Forms/ClusteringForms/FormForHierarchical.resx rename to Cell-by-Cell and DB/Simulator/Forms/FormForRandSpecOfVar.resx diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.Designer.cs new file mode 100644 index 0000000..901b602 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.Designer.cs @@ -0,0 +1,196 @@ +namespace HCSAnalyzer.Simulator.Forms +{ + partial class FormForVariableDef + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForVariableDef)); + this.buttonOk = new System.Windows.Forms.Button(); + this.radioButtonConstant = new System.Windows.Forms.RadioButton(); + this.radioButtonVariable = new System.Windows.Forms.RadioButton(); + this.groupBoxVariableSpec = new System.Windows.Forms.GroupBox(); + this.numericUpDownIncrement = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.checkBoxRandom = new System.Windows.Forms.CheckBox(); + this.checkBoxProportionalToRow = new System.Windows.Forms.CheckBox(); + this.checkBoxProportionalToCol = new System.Windows.Forms.CheckBox(); + this.groupBoxVariableSpec.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownIncrement)).BeginInit(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.Anchor = System.Windows.Forms.AnchorStyles.None; + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(87, 211); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); + // + // radioButtonConstant + // + this.radioButtonConstant.AutoSize = true; + this.radioButtonConstant.Checked = true; + this.radioButtonConstant.Location = new System.Drawing.Point(17, 13); + this.radioButtonConstant.Name = "radioButtonConstant"; + this.radioButtonConstant.Size = new System.Drawing.Size(67, 17); + this.radioButtonConstant.TabIndex = 1; + this.radioButtonConstant.TabStop = true; + this.radioButtonConstant.Text = "Constant"; + this.radioButtonConstant.UseVisualStyleBackColor = true; + this.radioButtonConstant.CheckedChanged += new System.EventHandler(this.radioButtonConstant_CheckedChanged); + // + // radioButtonVariable + // + this.radioButtonVariable.AutoSize = true; + this.radioButtonVariable.Location = new System.Drawing.Point(18, 48); + this.radioButtonVariable.Name = "radioButtonVariable"; + this.radioButtonVariable.Size = new System.Drawing.Size(63, 17); + this.radioButtonVariable.TabIndex = 2; + this.radioButtonVariable.Text = "Variable"; + this.radioButtonVariable.UseVisualStyleBackColor = true; + this.radioButtonVariable.CheckedChanged += new System.EventHandler(this.radioButtonVariable_CheckedChanged); + // + // groupBoxVariableSpec + // + this.groupBoxVariableSpec.Controls.Add(this.numericUpDownIncrement); + this.groupBoxVariableSpec.Controls.Add(this.label1); + this.groupBoxVariableSpec.Controls.Add(this.checkBoxRandom); + this.groupBoxVariableSpec.Controls.Add(this.checkBoxProportionalToRow); + this.groupBoxVariableSpec.Controls.Add(this.checkBoxProportionalToCol); + this.groupBoxVariableSpec.Enabled = false; + this.groupBoxVariableSpec.Location = new System.Drawing.Point(3, 70); + this.groupBoxVariableSpec.Name = "groupBoxVariableSpec"; + this.groupBoxVariableSpec.Size = new System.Drawing.Size(159, 132); + this.groupBoxVariableSpec.TabIndex = 3; + this.groupBoxVariableSpec.TabStop = false; + this.groupBoxVariableSpec.Text = "Variable Specifications"; + // + // numericUpDownIncrement + // + this.numericUpDownIncrement.DecimalPlaces = 2; + this.numericUpDownIncrement.Location = new System.Drawing.Point(70, 97); + this.numericUpDownIncrement.Maximum = new decimal(new int[] { + 1215752192, + 23, + 0, + 0}); + this.numericUpDownIncrement.Minimum = new decimal(new int[] { + 1215752192, + 23, + 0, + -2147483648}); + this.numericUpDownIncrement.Name = "numericUpDownIncrement"; + this.numericUpDownIncrement.Size = new System.Drawing.Size(67, 20); + this.numericUpDownIncrement.TabIndex = 4; + this.numericUpDownIncrement.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(10, 99); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(54, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Increment"; + // + // checkBoxRandom + // + this.checkBoxRandom.AutoSize = true; + this.checkBoxRandom.Location = new System.Drawing.Point(16, 69); + this.checkBoxRandom.Name = "checkBoxRandom"; + this.checkBoxRandom.Size = new System.Drawing.Size(66, 17); + this.checkBoxRandom.TabIndex = 2; + this.checkBoxRandom.Text = "Random"; + this.checkBoxRandom.UseVisualStyleBackColor = true; + this.checkBoxRandom.CheckedChanged += new System.EventHandler(this.checkBoxRandom_CheckedChanged); + // + // checkBoxProportionalToRow + // + this.checkBoxProportionalToRow.AutoSize = true; + this.checkBoxProportionalToRow.Location = new System.Drawing.Point(16, 46); + this.checkBoxProportionalToRow.Name = "checkBoxProportionalToRow"; + this.checkBoxProportionalToRow.Size = new System.Drawing.Size(83, 17); + this.checkBoxProportionalToRow.TabIndex = 1; + this.checkBoxProportionalToRow.Text = "Row related"; + this.checkBoxProportionalToRow.UseVisualStyleBackColor = true; + // + // checkBoxProportionalToCol + // + this.checkBoxProportionalToCol.AutoSize = true; + this.checkBoxProportionalToCol.Checked = true; + this.checkBoxProportionalToCol.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxProportionalToCol.Location = new System.Drawing.Point(16, 23); + this.checkBoxProportionalToCol.Name = "checkBoxProportionalToCol"; + this.checkBoxProportionalToCol.Size = new System.Drawing.Size(96, 17); + this.checkBoxProportionalToCol.TabIndex = 0; + this.checkBoxProportionalToCol.Text = "Column related"; + this.checkBoxProportionalToCol.UseVisualStyleBackColor = true; + // + // FormForVariableDef + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(167, 243); + this.Controls.Add(this.groupBoxVariableSpec); + this.Controls.Add(this.radioButtonVariable); + this.Controls.Add(this.radioButtonConstant); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForVariableDef"; + this.Text = "Variable"; + this.groupBoxVariableSpec.ResumeLayout(false); + this.groupBoxVariableSpec.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownIncrement)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.RadioButton radioButtonConstant; + private System.Windows.Forms.RadioButton radioButtonVariable; + private System.Windows.Forms.GroupBox groupBoxVariableSpec; + private System.Windows.Forms.CheckBox checkBoxRandom; + private System.Windows.Forms.CheckBox checkBoxProportionalToRow; + private System.Windows.Forms.CheckBox checkBoxProportionalToCol; + private System.Windows.Forms.NumericUpDown numericUpDownIncrement; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.cs b/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.cs new file mode 100644 index 0000000..88ebc62 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; + +namespace HCSAnalyzer.Simulator.Forms +{ + + public partial class FormForVariableDef : Form + { + public cClassForVariable thisVariable; + + public FormForVariableDef(cClassForVariable thisVariable) + { + InitializeComponent(); + this.thisVariable = thisVariable; + this.radioButtonConstant.Checked = thisVariable.IsConstant; + this.radioButtonVariable.Checked = !thisVariable.IsConstant; + this.checkBoxRandom.Checked = thisVariable.IsVariableRandom; + this.checkBoxProportionalToCol.Checked = thisVariable.IsVariableAlongColumns; + this.checkBoxProportionalToRow.Checked = thisVariable.IsVariableAlongRows; + this.numericUpDownIncrement.Value = (decimal)thisVariable.Increment; + } + + private void radioButtonVariable_CheckedChanged(object sender, EventArgs e) + { + RefreshGUI(); + } + + private void radioButtonConstant_CheckedChanged(object sender, EventArgs e) + { + RefreshGUI(); + } + + void RefreshGUI() + { + groupBoxVariableSpec.Enabled = radioButtonVariable.Checked; + } + + private void checkBoxRandom_CheckedChanged(object sender, EventArgs e) + { + FormForRandSpecOfVar WindowForRandSpec = new FormForRandSpecOfVar(this.thisVariable.RandomInfo); + if (WindowForRandSpec.ShowDialog() == System.Windows.Forms.DialogResult.OK) + thisVariable.RandomInfo = WindowForRandSpec.RandomParam; + } + + private void buttonOk_Click(object sender, EventArgs e) + { + this.thisVariable.IsConstant = this.radioButtonConstant.Checked; + this.thisVariable.IsVariableAlongColumns = this.checkBoxProportionalToCol.Checked; + this.thisVariable.IsVariableAlongRows = this.checkBoxProportionalToRow.Checked; + this.thisVariable.IsVariableRandom = this.checkBoxRandom.Checked; + this.thisVariable.Increment = (double)this.numericUpDownIncrement.Value; + } + + } +} diff --git a/Forms/ClusteringForms/FormForKMeansInfo.resx b/Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.resx similarity index 100% rename from Forms/ClusteringForms/FormForKMeansInfo.resx rename to Cell-by-Cell and DB/Simulator/Forms/FormForVariableDef.resx diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.Designer.cs new file mode 100644 index 0000000..e8c8d73 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.Designer.cs @@ -0,0 +1,345 @@ +namespace HCSAnalyzer.Simulator.Forms +{ + partial class FormForSimuGenerator + { + /// + /// 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(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("General"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Dimensions"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Cell Types"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("World", new System.Windows.Forms.TreeNode[] { + treeNode2, + treeNode3}); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Cell Populations"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Model Initialization", new System.Windows.Forms.TreeNode[] { + treeNode5}); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Plate Design"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Export", new System.Windows.Forms.TreeNode[] { + treeNode7}); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("3D"); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("Visualization", new System.Windows.Forms.TreeNode[] { + treeNode9}); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForSimuGenerator)); + this.buttonRun = new System.Windows.Forms.Button(); + this.treeViewForOptions = new System.Windows.Forms.TreeView(); + this.panelForDisplay = new System.Windows.Forms.Panel(); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.contextMenuStripForVisu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dToolStripMenuItemDisp3D = new System.Windows.Forms.ToolStripMenuItem(); + this.dToolStripMenuItemDisp2D = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripProgressBar = new System.Windows.Forms.ToolStripProgressBar(); + this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.displayToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.cellTypesRelationshipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.dToolStripMenuItemDisplay2D = new System.Windows.Forms.ToolStripMenuItem(); + this.dToolStripMenuItemDisplay3D = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newCellTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStripForTreeView = new System.Windows.Forms.ContextMenuStrip(this.components); + this.runToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.collapseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statusStrip.SuspendLayout(); + this.contextMenuStripForVisu.SuspendLayout(); + this.menuStrip.SuspendLayout(); + this.contextMenuStripForTreeView.SuspendLayout(); + this.SuspendLayout(); + // + // buttonRun + // + this.buttonRun.Location = new System.Drawing.Point(370, 287); + this.buttonRun.Name = "buttonRun"; + this.buttonRun.Size = new System.Drawing.Size(98, 25); + this.buttonRun.TabIndex = 0; + this.buttonRun.Text = "Run"; + this.buttonRun.UseVisualStyleBackColor = true; + this.buttonRun.Click += new System.EventHandler(this.buttonRun_Click); + // + // treeViewForOptions + // + this.treeViewForOptions.ContextMenuStrip = this.contextMenuStripForTreeView; + this.treeViewForOptions.Location = new System.Drawing.Point(7, 31); + this.treeViewForOptions.Name = "treeViewForOptions"; + treeNode1.Name = "Node0"; + treeNode1.Tag = "General"; + treeNode1.Text = "General"; + treeNode2.Name = "Node1"; + treeNode2.Tag = "WorldDimensions"; + treeNode2.Text = "Dimensions"; + treeNode3.Name = "Node0"; + treeNode3.Tag = "CellTypes"; + treeNode3.Text = "Cell Types"; + treeNode4.Name = "Node0"; + treeNode4.Tag = ""; + treeNode4.Text = "World"; + treeNode5.Name = "Node3"; + treeNode5.Tag = "CellPopulations"; + treeNode5.Text = "Cell Populations"; + treeNode6.Name = "Node2"; + treeNode6.Text = "Model Initialization"; + treeNode7.Name = "Node5"; + treeNode7.Tag = "PlateDesign"; + treeNode7.Text = "Plate Design"; + treeNode8.Name = "Node4"; + treeNode8.Text = "Export"; + treeNode9.Name = "Node1"; + treeNode9.Tag = "3D"; + treeNode9.Text = "3D"; + treeNode10.Name = "Node0"; + treeNode10.Tag = "Visualization"; + treeNode10.Text = "Visualization"; + this.treeViewForOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode4, + treeNode6, + treeNode8, + treeNode10}); + this.treeViewForOptions.Size = new System.Drawing.Size(179, 283); + this.treeViewForOptions.TabIndex = 10; + this.treeViewForOptions.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewForOptions_AfterSelect); + // + // panelForDisplay + // + this.panelForDisplay.AutoScroll = true; + this.panelForDisplay.BackColor = System.Drawing.SystemColors.Control; + this.panelForDisplay.Location = new System.Drawing.Point(192, 32); + this.panelForDisplay.Name = "panelForDisplay"; + this.panelForDisplay.Size = new System.Drawing.Size(275, 249); + this.panelForDisplay.TabIndex = 11; + // + // statusStrip + // + this.statusStrip.ContextMenuStrip = this.contextMenuStripForVisu; + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripProgressBar, + this.toolStripStatusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 320); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(473, 22); + this.statusStrip.Stretch = false; + this.statusStrip.TabIndex = 12; + // + // contextMenuStripForVisu + // + this.contextMenuStripForVisu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayToolStripMenuItem}); + this.contextMenuStripForVisu.Name = "contextMenuStripForVisu"; + this.contextMenuStripForVisu.Size = new System.Drawing.Size(113, 26); + // + // displayToolStripMenuItem + // + this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.dToolStripMenuItemDisp3D, + this.dToolStripMenuItemDisp2D}); + this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; + this.displayToolStripMenuItem.Size = new System.Drawing.Size(112, 22); + this.displayToolStripMenuItem.Text = "Display"; + // + // dToolStripMenuItemDisp3D + // + this.dToolStripMenuItemDisp3D.Name = "dToolStripMenuItemDisp3D"; + this.dToolStripMenuItemDisp3D.Size = new System.Drawing.Size(88, 22); + this.dToolStripMenuItemDisp3D.Text = "3D"; + this.dToolStripMenuItemDisp3D.Click += new System.EventHandler(this.dToolStripMenuItemDisp3D_Click); + // + // dToolStripMenuItemDisp2D + // + this.dToolStripMenuItemDisp2D.Enabled = false; + this.dToolStripMenuItemDisp2D.Name = "dToolStripMenuItemDisp2D"; + this.dToolStripMenuItemDisp2D.Size = new System.Drawing.Size(88, 22); + this.dToolStripMenuItemDisp2D.Text = "2D"; + this.dToolStripMenuItemDisp2D.Click += new System.EventHandler(this.dToolStripMenuItemDisp2D_Click); + // + // toolStripProgressBar + // + this.toolStripProgressBar.Name = "toolStripProgressBar"; + this.toolStripProgressBar.Size = new System.Drawing.Size(100, 16); + // + // toolStripStatusLabel + // + this.toolStripStatusLabel.Name = "toolStripStatusLabel"; + this.toolStripStatusLabel.Size = new System.Drawing.Size(0, 17); + // + // menuStrip + // + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayToolStripMenuItem1, + this.toolsToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(473, 24); + this.menuStrip.TabIndex = 13; + this.menuStrip.Text = "menuStrip1"; + // + // displayToolStripMenuItem1 + // + this.displayToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cellTypesRelationshipsToolStripMenuItem, + this.toolStripSeparator1, + this.dToolStripMenuItemDisplay2D, + this.dToolStripMenuItemDisplay3D}); + this.displayToolStripMenuItem1.Name = "displayToolStripMenuItem1"; + this.displayToolStripMenuItem1.Size = new System.Drawing.Size(57, 20); + this.displayToolStripMenuItem1.Text = "Display"; + // + // cellTypesRelationshipsToolStripMenuItem + // + this.cellTypesRelationshipsToolStripMenuItem.Name = "cellTypesRelationshipsToolStripMenuItem"; + this.cellTypesRelationshipsToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.cellTypesRelationshipsToolStripMenuItem.Text = "Cell Types Relationships"; + this.cellTypesRelationshipsToolStripMenuItem.Click += new System.EventHandler(this.cellTypesRelationshipsToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(198, 6); + // + // dToolStripMenuItemDisplay2D + // + this.dToolStripMenuItemDisplay2D.Enabled = false; + this.dToolStripMenuItemDisplay2D.Name = "dToolStripMenuItemDisplay2D"; + this.dToolStripMenuItemDisplay2D.Size = new System.Drawing.Size(201, 22); + this.dToolStripMenuItemDisplay2D.Text = "2D"; + this.dToolStripMenuItemDisplay2D.Click += new System.EventHandler(this.dToolStripMenuItemDisplay2D_Click); + // + // dToolStripMenuItemDisplay3D + // + this.dToolStripMenuItemDisplay3D.Name = "dToolStripMenuItemDisplay3D"; + this.dToolStripMenuItemDisplay3D.Size = new System.Drawing.Size(201, 22); + this.dToolStripMenuItemDisplay3D.Text = "3D"; + this.dToolStripMenuItemDisplay3D.Click += new System.EventHandler(this.dToolStripMenuItemDisplay3D_Click); + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newCellTypeToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20); + this.toolsToolStripMenuItem.Text = "Tools"; + // + // newCellTypeToolStripMenuItem + // + this.newCellTypeToolStripMenuItem.Name = "newCellTypeToolStripMenuItem"; + this.newCellTypeToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.newCellTypeToolStripMenuItem.Text = "New cell type"; + this.newCellTypeToolStripMenuItem.Click += new System.EventHandler(this.newCellTypeToolStripMenuItem_Click); + // + // contextMenuStripForTreeView + // + this.contextMenuStripForTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.runToolStripMenuItem, + this.toolStripSeparator2, + this.collapseToolStripMenuItem, + this.expandAllToolStripMenuItem}); + this.contextMenuStripForTreeView.Name = "contextMenuStripForTreeView"; + this.contextMenuStripForTreeView.Size = new System.Drawing.Size(153, 98); + // + // runToolStripMenuItem + // + this.runToolStripMenuItem.Name = "runToolStripMenuItem"; + this.runToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.runToolStripMenuItem.Text = "Run"; + this.runToolStripMenuItem.Click += new System.EventHandler(this.runToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); + // + // collapseToolStripMenuItem + // + this.collapseToolStripMenuItem.Name = "collapseToolStripMenuItem"; + this.collapseToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.collapseToolStripMenuItem.Text = "Collapse All"; + this.collapseToolStripMenuItem.Click += new System.EventHandler(this.collapseToolStripMenuItem_Click); + // + // expandAllToolStripMenuItem + // + this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem"; + this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.expandAllToolStripMenuItem.Text = "Expand All"; + this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + // + // FormForSimuGenerator + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(473, 342); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.menuStrip); + this.Controls.Add(this.panelForDisplay); + this.Controls.Add(this.treeViewForOptions); + this.Controls.Add(this.buttonRun); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip; + this.Name = "FormForSimuGenerator"; + this.Text = "Cells Simulator"; + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.contextMenuStripForVisu.ResumeLayout(false); + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + this.contextMenuStripForTreeView.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonRun; + public System.Windows.Forms.TreeView treeViewForOptions; + private System.Windows.Forms.Panel panelForDisplay; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel; + private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForVisu; + private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dToolStripMenuItemDisp3D; + private System.Windows.Forms.ToolStripMenuItem dToolStripMenuItemDisp2D; + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem dToolStripMenuItemDisplay3D; + private System.Windows.Forms.ToolStripMenuItem dToolStripMenuItemDisplay2D; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForTreeView; + private System.Windows.Forms.ToolStripMenuItem runToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newCellTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem cellTypesRelationshipsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem collapseToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.cs new file mode 100644 index 0000000..5f27cab --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.cs @@ -0,0 +1,657 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Forms; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Classes; +using HCSAnalyzer.Forms.IO; +using ImageAnalysis; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using HCSAnalyzer.Simulator.Forms.Panels; +using HCSAnalyzer.Simulator.Forms.NewCellType; +using MIConvexHull; +using Microsoft.Msagl.GraphViewerGdi; + +namespace HCSAnalyzer.Simulator.Forms +{ + public partial class FormForSimuGenerator : Form + { + + cGlobalInfo GlobalInfo; + public cWorld NewWorld; + public cListClusteringAlgo ListClusteringAlgo; + public PanelForParamCellPopulations MyPanelForParamCellPopulations; + PanelForParamCellTypes MyPanelForParamCellTypes; + + + public cListCellType ListCellTypes { get; private set; } + + public cParamAlgo GetSelectedAlgoAndParameters() + { + cParamAlgo ToReturn = ListClusteringAlgo.GetListParams((string)treeViewForOptions.SelectedNode.Tag); + return ToReturn; + } + + public FormForSimuGenerator(cGlobalInfo GlobalInfo) + { + Random rnd = new Random(); + + // generate some random points + Func nextRandom = () => 2 * 10 * rnd.NextDouble() - 10; + var vertices = Enumerable.Range(0, 300) + .Select(_ => new cPoint3D(nextRandom(), nextRandom(), nextRandom())) + .ToList(); + + //var vertices = new List(); + //int d = 4; + //double cs = 10.0; + //for (int i = 0; i < d; i++) + //{ + // for (int j = 0; j < d; j++) + // { + // for (int k = 0; k < d; k++) + // { + // //vertices.Add(new Vertex(10 * i - 20 + rnd.NextDouble(), 10 * j - 20 - rnd.NextDouble(), 10 * k - 20 + rnd.NextDouble())); + // vertices.Add(new Vertex(-10 * i, 10 * j, 10 * k)); + // } + // } + //} + + // calculate the triangulation + // var tetrahedrons = Triangulation.CreateDelaunay(vertices).Cells; + // var tetrahedrons = VoronoiMesh.Create(vertices).Vertices; + + #region initialise cell types + ListCellTypes = new cListCellType(); + for (int i = 0; i < 5; i++) + ListCellTypes.Add(new cCellType(i, this)); + + foreach (cCellType item in this.ListCellTypes) + { + int Idx = 0; + foreach (cTransitionValue Transition in item.ListInitialTransitions) + { + Transition.DestType = this.ListCellTypes[Idx++]; + } + } + + #endregion + + this.GlobalInfo = GlobalInfo; + InitializeComponent(); + MyPanelForParamCellPopulations = new PanelForParamCellPopulations(new cPoint3D(600, 600, 50), this); + + this.treeViewForOptions.ExpandAll(); + this.treeViewForOptions.SelectedNode = this.treeViewForOptions.Nodes[0]; + this.ListClusteringAlgo = new cListClusteringAlgo(new cPoint3D(600, 600, 50)); + + cParamAlgo ClusteringAlgo = ListClusteringAlgo.GetListParams("WorldDimensions"); + cListValuesParam Parameters = ClusteringAlgo.GetListValuesParam(); + + NewWorld = new cWorld(new cPoint3D((int)(Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionY").Value), + (Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionY").Value), + (Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionZ").Value)), this); + + MyPanelForParamCellTypes = new PanelForParamCellTypes(); + } + + private void buttonRun_Click(object sender, EventArgs e) + { + RunSimu(); + } + + void RunSimu() + { + // int NumWellToProcess = 1; + List ListNameSignature = new List(); + Random RND = new Random(); + + if(NewWorld.ListCells!=null) NewWorld.ListCells.Clear(); + + + ListNameSignature.Add("PosX"); + ListNameSignature.Add("PosY"); + ListNameSignature.Add("PosZ"); + ListNameSignature.Add("Volume"); + ListNameSignature.Add("DistanceToCenter"); + ListNameSignature.Add("FullPathDistance"); + ListNameSignature.Add("CellType"); + + cSQLiteDatabase SQDB = null; + string PlateName = "SimulatedPlate"; + + bool IsExportToDB = (bool)ListClusteringAlgo.GetListParams("PlateDesign").GetListValuesParam().ListCheckValues.Get("checkBoxExportToDB").Value; + int NumCols = (int)ListClusteringAlgo.GetListParams("PlateDesign").GetListValuesParam().ListDoubleValues.Get("numericUpDownNumCols").Value; + int NumRows = (int)ListClusteringAlgo.GetListParams("PlateDesign").GetListValuesParam().ListDoubleValues.Get("numericUpDownNumRows").Value; + + if (IsExportToDB) + { + + FolderBrowserDialog WorkingFolderDialog = new FolderBrowserDialog(); + WorkingFolderDialog.ShowNewFolderButton = true; + WorkingFolderDialog.Description = "Select the working directory"; + if (WorkingFolderDialog.ShowDialog() != DialogResult.OK) return; + //NumWellToProcess = NumWells; + + SQDB = new cSQLiteDatabase(WorkingFolderDialog.SelectedPath + "\\" + PlateName, ListNameSignature, true); + } + + // run the simulation + FormForProgress MyProgressBar = new FormForProgress(); + int NumIterations = (int)ListClusteringAlgo.GetListParams("General").GetListValuesParam().ListDoubleValues.Get("numericUpDownRunIterations").Value; + + if (IsExportToDB) + { + toolStripProgressBar.Maximum = NumIterations * NumCols * NumRows; + } + else + { + toolStripProgressBar.Maximum = NumIterations; + NumCols = 1; + NumRows = 1; + } + + + //MyProgressBar.progressBar + // MyProgressBar.Show(); + + + // cParamAlgo ClusteringAlgo = ListClusteringAlgo.GetListParams("CellPopulations"); + // cListValuesParam Parameters = ClusteringAlgo.GetListValuesParam(); + + //ListView ListViewForCellPops = null;// (ListView)Parameters.ListListViewValues.Get("listViewForCellPopulations").Value; + + bool IsMemoryOn = (bool)ListClusteringAlgo.GetListParams("General").GetListValuesParam().ListCheckValues.Get("checkBoxMemory").Value; + + for (int IdxCol = 0; IdxCol < NumCols; IdxCol++) + for (int IdxRow = 0; IdxRow < NumRows; IdxRow++) + { + cWellForDatabase WellForDB = new cWellForDatabase(PlateName, IdxCol + 1, IdxRow + 1); + List> ListData = new List>(); + + cParamAlgo ClusteringAlgo = ListClusteringAlgo.GetListParams("WorldDimensions"); + cListValuesParam Parameters = ClusteringAlgo.GetListValuesParam(); + + NewWorld.ListCells.Clear(); + + NewWorld = new cWorld(new cPoint3D((int)(Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionX").Value), + (Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionY").Value), + (Parameters.ListDoubleValues.Get("numericUpDownWorldDimensionZ").Value)), this); + + + // // define a cell cycle + // cCycle ClassicCellCycle = new cCycle(); // default cell cycle + + // Random RndForUnsychronizedPopulation = new Random(); + + // int CellType = comboBoxCellType.SelectedIndex; + // if (SQDB != null) CellType = IdxWell % comboBoxCellType.Items.Count; + + // // generate initiale cell population + // for (int i = 0; i < (int)numericUpDownInitialCellNumber.Value; i++) + // { + // cCell NewCell = new cCell(new cPoint3D(NewWorld.Dimensions.X / 2, NewWorld.Dimensions.Y / 2, 0), + // 2, + // CellType, + // RndForUnsychronizedPopulation.NextDouble() * ClassicCellCycle.ListProba.Count); + + // NewWorld.ListCells.Add(NewCell); + + foreach (ListViewItem item in MyPanelForParamCellPopulations.listViewForCellPopulations.Items) + { + if (item.Checked) + { + cCellPopulation CurrentCellPop = (cCellPopulation)item.Tag; + + //cClassForVariable MyVar = CurrentCellPop.AssociatedVariables.FindVariable("v_CellNumber"); + //if (MyVar.IsConstant == false) + //{ + // double NewValue = MyVar.Cst_Value + IdxWell * MyVar.Increment; + //} + + //NewWorld.ListCells.AddRange(CurrentCellPop); + + //ListVar.Add(new cClassForVariable("v_CellNumber", 100)); + //ListVar.Add(new cClassForVariable("v_InitPosX", 0)); + //ListVar.Add(new cClassForVariable("v_InitPosY", 0)); + //ListVar.Add(new cClassForVariable("v_InitPosZ", 0)); + //ListVar.Add(new cClassForVariable("v_InitPosType", 0)); + + cClassForVariable MyVarVolType = CurrentCellPop.AssociatedVariables.FindVariable("v_InitVolType"); + cClassForVariable MyVarVol = CurrentCellPop.AssociatedVariables.FindVariable("v_InitVol"); + + cClassForVariable MyVarPosType = CurrentCellPop.AssociatedVariables.FindVariable("v_InitPosType"); + cClassForVariable MyVarPosX = CurrentCellPop.AssociatedVariables.FindVariable("v_InitPosX"); + cClassForVariable MyVarPosY = CurrentCellPop.AssociatedVariables.FindVariable("v_InitPosY"); + cClassForVariable MyVarPosZ = CurrentCellPop.AssociatedVariables.FindVariable("v_InitPosZ"); + + + double InitVolume = 0; + if (MyVarVolType.Cst_Value == 1) // Random + { + InitVolume = (MyVarVolType.RandomInfo.Max - MyVarVolType.RandomInfo.Min) * RND.NextDouble() + MyVarVolType.RandomInfo.Min; + } + else // fixed + { + InitVolume = MyVarVol.Cst_Value; + } + + foreach (cCell CurrentCell in CurrentCellPop) + { + + double Volume = 0; + if (MyVarVol.IsConstant == false) // random + { + // a changer ... au lieu de min max, mettre juste standard dev. + Volume = (MyVarVol.RandomInfo.Max - MyVarVol.RandomInfo.Min) * RND.NextDouble() + MyVarVol.RandomInfo.Min; + } + else + { + if (MyVarVol.IsVariableAlongColumns) + Volume = InitVolume + IdxCol * InitVolume; + else if (MyVarVol.IsVariableAlongRows) + Volume = InitVolume + IdxRow * InitVolume; + else + Volume = InitVolume; + + + } + CurrentCell.InitialVolume = Volume; + + + if(MyVarPosType.Cst_Value==0) // center + { + cPoint3D CellPos = new cPoint3D(NewWorld.Dimensions.X / 2.0, NewWorld.Dimensions.Y / 2.0, NewWorld.Dimensions.Z / 2.0); + CurrentCell.CentroidPosition = CellPos; + } + else if (MyVarPosType.Cst_Value==1) // random + { + cPoint3D CellPos = new cPoint3D(NewWorld.Dimensions.X * RND.NextDouble(), + NewWorld.Dimensions.Y * RND.NextDouble(), + NewWorld.Dimensions.Z * RND.NextDouble()); + CurrentCell.CentroidPosition = CellPos; + } + else if (MyVarPosType.Cst_Value==2) // fixed + { + double X_start; + + if (MyVarPosX.IsVariableAlongColumns) + X_start = MyVarPosX.Cst_Value + IdxCol * MyVarPosX.Increment; + else if (MyVarPosX.IsVariableAlongRows) + X_start = MyVarPosX.Cst_Value + IdxRow * MyVarPosX.Increment; + else + X_start = MyVarPosX.Cst_Value; + + double Y_start; + if (MyVarPosY.IsVariableAlongColumns) + Y_start = MyVarPosY.Cst_Value + IdxCol * MyVarPosY.Increment; + else if (MyVarPosY.IsVariableAlongRows) + Y_start = MyVarPosY.Cst_Value + IdxRow * MyVarPosY.Increment; + else + Y_start = MyVarPosY.Cst_Value; + + double Z_start; + if (MyVarPosZ.IsVariableAlongColumns) + Z_start = MyVarPosZ.Cst_Value + IdxCol * MyVarPosZ.Increment; + else if (MyVarPosZ.IsVariableAlongRows) + Z_start = MyVarPosZ.Cst_Value + IdxRow * MyVarPosZ.Increment; + else + Z_start = MyVarPosZ.Cst_Value; + + + cPoint3D CellPos = new cPoint3D(X_start, + Y_start, + Z_start); + CurrentCell.CentroidPosition = CellPos; + } + + + CurrentCell.MemoryOn = true; + CurrentCell.PreviousStates.Clear(); + + NewWorld.ListCells.Add(CurrentCell); + } + + } + } + //NewWorld.ListCells.AddRange( + + //} + // //{ + // // cCell NewCell = new cCell(new cPoint3D(IdxPosX, IdxPosY, NewWorld.Dimensions.Z / 2), + // // 10, + // // CellType, + // // RndForUnsychronizedPopulation.NextDouble() * ClassicCellCycle.ListProba.Count); + // // NewWorld.ListCells.Add(NewCell); + // //} + + + + for (int IdxSimu = 0; IdxSimu < NumIterations; IdxSimu++) + { + // toolStripProgressBar.Value = IdxSimu + NumIterations * (IdxRow * NumCols + IdxCol); + //MyProgressBar.label.Text = "It. " + IdxSimu; + //MyProgressBar.label.Text += " - " + NewWorld.ListCells.Count + " cells."; + //MyProgressBar.label.Refresh(); + NewWorld.RunSimu(1); + } + + toolStripStatusLabel.Text = "Current simulation: " + NumIterations + " iterations. " + NewWorld.ListCells.Count + " cells"; + + if (SQDB != null) + { + foreach (cCell TmpCell in NewWorld.ListCells) + { + List Signature = new List(); + Signature.Add(TmpCell.CentroidPosition.X); + Signature.Add(TmpCell.CentroidPosition.Y); + Signature.Add(TmpCell.CentroidPosition.Z); + Signature.Add(TmpCell.GetVolume()); + Signature.Add(TmpCell.CentroidPosition.DistTo(new cPoint3D(NewWorld.Dimensions.X / 2, NewWorld.Dimensions.Y / 2, NewWorld.Dimensions.Z / 2))); + + cInfoCell InfoCell = new cInfoCell(TmpCell); + Signature.Add(InfoCell.GetDistPath()); + + Signature.Add(this.ListCellTypes.FindIdxType(TmpCell.Type)); + ListData.Add(Signature); + } + WellForDB.AddListSignatures(ListData); + SQDB.AddNewWell(WellForDB); + } + } + //MyProgressBar.Close(); + toolStripProgressBar.Value = 0; + if (SQDB != null) SQDB.CloseConnection(); + // groupBoxForResults.Enabled = true; + } + + private void button3DVisualization_Click(object sender, EventArgs e) + { + FormFor3DVisu WindowFor3D = new FormFor3DVisu(GlobalInfo.CurrentScreen, this); + WindowFor3D.Show(); + } + + private void radioButtonEvolutionCellNumber_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + + + } + } + + private void button2DVisualization_Click(object sender, EventArgs e) + { + + } + + public class cListClusteringAlgo : List + { + public cListClusteringAlgo(cPoint3D WorldDims) + { + this.Add(new cParamWorldDimensions("WorldDimensions")); + this.Add(new cParamGeneral("General")); + this.Add(new cParamPlateDesign("PlateDesign")); + this.Add(new cParamCellTypes("CellTypes")); + this.Add(new cParam3D("3D")); + } + + public Panel GetPanel(string Name) + { + if (Name == null) return null; + + foreach (var item in this) + if (item.Name == Name) return item.GetPanel(); + + return null; + } + + public cParamAlgo GetListParams(string CategoryName) + { + foreach (cParamAlgo item in this) + { + if (item.Name == CategoryName) return item; + } + return null; + + } + } + + [Serializable] + public class cParamWorldDimensions : cParamAlgo + { + public cParamWorldDimensions(string Name) + : base(Name) + { + PanelForParamWorldDimensions PanelForOption = new PanelForParamWorldDimensions(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + + [Serializable] + public class cParamGeneral : cParamAlgo + { + public cParamGeneral(string Name) + : base(Name) + { + PanelForParamGeneral PanelForOption = new PanelForParamGeneral(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamPlateDesign : cParamAlgo + { + public cParamPlateDesign(string Name) + : base(Name) + { + PanelForParamPlateDesign PanelForOption = new PanelForParamPlateDesign(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamCellTypes : cParamAlgo + { + public cParamCellTypes(string Name) + : base(Name) + { + PanelForParamCellTypes PanelForOption = new PanelForParamCellTypes(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParam3D : cParamAlgo + { + public cParam3D(string Name) + : base(Name) + { + PanelForParams3D PanelForOption = new PanelForParams3D(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + private void treeViewForOptions_AfterSelect(object sender, TreeViewEventArgs e) + { + this.panelForDisplay.Controls.Clear(); + string TagName = (string)e.Node.Tag; + + if (TagName == "CellPopulations") + { + //PanelForParamCellPopulations + this.panelForDisplay.Controls.Add(MyPanelForParamCellPopulations); + } + else if (TagName == "CellTypes") + { + //PanelForParamCellPopulations + //MyPanelForParamCellTypes.RefreshDisplay(Parent); + this.panelForDisplay.Controls.Add(MyPanelForParamCellTypes); + MyPanelForParamCellTypes.RefreshDisplay(this); + } + else + { + Panel PanelToDisp = ListClusteringAlgo.GetPanel(TagName); + if (PanelToDisp == null) return; + this.panelForDisplay.Controls.Add(PanelToDisp); + } + } + + #region Display + void Display3D() + { + FormFor3DVisu WindowFor3D = new FormFor3DVisu(GlobalInfo.CurrentScreen, this); + WindowFor3D.Show(); + } + + void Display2D() + { + + cImage TestImage = new cImage((int)NewWorld.Dimensions.X, (int)NewWorld.Dimensions.Y, 1, 1); + TestImage.Name = "2D World"; + /*for (int IdxChannel = 0; IdxChannel < TestImage.NumChannels; IdxChannel++) + for (int Y = 0; Y < TestImage.Height; Y++) + for (int X = 0; X < TestImage.Width; X++) + { + TestImage.Data[IdxChannel].Data[X + Y * TestImage.Width] = X * Y / 10; + } + */ + // cImage FilteredImage = new cImage(TestImage.Width, TestImage.Height, TestImage.Depth, TestImage.NumChannels); + // ImageAnalysisFiltering.cImageFilterMedian FilterMedian = new ImageAnalysisFiltering.cImageFilterMedian(TestImage, 0, FilteredImage, 0); + // FilterMedian.radius = 2; + // FilterMedian.Run(); + + cImageViewer NewView = new cImageViewer(); + NewView.SetImage(TestImage); + + //cImageViewer NewView1 = new cImageViewer(); + //NewView1.SetImage(FilteredImage); + + //NewView.AddNotation(new ObjectForNotations.cString("This is a test", new Point(10, 10), Color.Red, 20)); + + foreach (var item in NewWorld.ListCells) + { + NewView.AddNotation(new ObjectForNotations.cDisk(new Point((int)item.CentroidPosition.X, (int)item.CentroidPosition.Y), + item.Type.TypeColor, (int)item.GetVolume())); + } + + //for (int Idx = 0; Idx < 120; Idx += 10) + // NewView.AddNotation(new ObjectForNotations.cDisk(new Point(Idx * 10, Idx * 10), Color.FromArgb(Idx, Idx, 50), Idx)); + + GlobalInfo.DisplayViewer(NewView); + } + + private void dToolStripMenuItemDisp3D_Click(object sender, EventArgs e) + { + Display3D(); + } + + private void dToolStripMenuItemDisp2D_Click(object sender, EventArgs e) + { + Display2D(); + } + + private void dToolStripMenuItemDisplay3D_Click(object sender, EventArgs e) + { + Display3D(); + } + + private void dToolStripMenuItemDisplay2D_Click(object sender, EventArgs e) + { + Display2D(); + } + + #endregion + + private void runToolStripMenuItem_Click(object sender, EventArgs e) + { + RunSimu(); + } + + private void newCellTypeToolStripMenuItem_Click(object sender, EventArgs e) + { + CreateNewCellType(); + } + + public void CreateNewCellType() + { + FormForNewCellType WindowForNewCellType = new FormForNewCellType(this); + if (WindowForNewCellType.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + cCellType NewCellType = WindowForNewCellType.NewCellType; + + ListCellTypes.Add(NewCellType); + MyPanelForParamCellTypes.RefreshDisplay(this); + } + + public void EditCellType(cCellType CurrentType) + { + FormForNewCellType WindowForNewCellType = new FormForNewCellType(this,CurrentType ); + if (WindowForNewCellType.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + int IdxCellType = -1; + foreach (var item in ListCellTypes) + { + IdxCellType++; + if (item.Name == CurrentType.Name) + break; + } + ListCellTypes[IdxCellType] = WindowForNewCellType.NewCellType; + + //cCellType NewCellType = WindowForNewCellType.NewCellType; + + + //ListCellTypes.Find(CurrentType) = NewCellType; + //ListCellTypes.Add(NewCellType); + MyPanelForParamCellTypes.RefreshDisplay(this); + } + + private void cellTypesRelationshipsToolStripMenuItem_Click(object sender, EventArgs e) + { + FormForCellTypeRelationships WindowForDisplay = new FormForCellTypeRelationships(this); + //GViewer GraphView = new GViewer(); + //Microsoft.Msagl.Drawing.Graph graph = new Microsoft.Msagl.Drawing.Graph("graph"); + //GraphView.Size = new System.Drawing.Size(WindowForDisplay.panel.Width, WindowForDisplay.panel.Height); + //GraphView.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + + + + + //GraphView.Graph = graph; + + + //WindowForDisplay.panel.Controls.Add(GraphView); + WindowForDisplay.Show(); + + /* + GraphView.Size = new System.Drawing.Size(PanelForVisualFeedback.Width, PanelForVisualFeedback.Height); + GraphView.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + PanelForVisualFeedback.Controls.Clear(); + PanelForVisualFeedback.Controls.Add(GraphView); + + FormForClassificationTree WindowForTree = new FormForClassificationTree(); + string StringForTree = J48Model.graph().Remove(0, J48Model.graph().IndexOf("{") + 2); + WindowForTree.gViewerForTreeClassif.Graph = GlobalInfo.WindowHCSAnalyzer.ComputeAndDisplayGraph(StringForTree.Remove(StringForTree.Length - 3, 3)); + return WindowForTree;*/ + + } + + private void collapseToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.CollapseAll(); + } + + private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.ExpandAll(); + } + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.resx new file mode 100644 index 0000000..f186777 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/FormForSimuGenerator.resx @@ -0,0 +1,1799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 667, 17 + + + 261, 17 + + + 370, 17 + + + 559, 17 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.Designer.cs new file mode 100644 index 0000000..482b850 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.Designer.cs @@ -0,0 +1,100 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParamCellPopulations + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.listViewForCellPopulations = new System.Windows.Forms.ListView(); + this.columnHeaderPopName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderCellNum = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderCellType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.listViewForCellPopulations); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(233, 251); + this.panel.TabIndex = 0; + // + // listViewForCellPopulations + // + this.listViewForCellPopulations.CheckBoxes = true; + this.listViewForCellPopulations.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderPopName, + this.columnHeaderCellNum, + this.columnHeaderCellType}); + this.listViewForCellPopulations.GridLines = true; + this.listViewForCellPopulations.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listViewForCellPopulations.Location = new System.Drawing.Point(0, 3); + this.listViewForCellPopulations.MultiSelect = false; + this.listViewForCellPopulations.Name = "listViewForCellPopulations"; + this.listViewForCellPopulations.Size = new System.Drawing.Size(230, 246); + this.listViewForCellPopulations.TabIndex = 9; + this.listViewForCellPopulations.UseCompatibleStateImageBehavior = false; + this.listViewForCellPopulations.View = System.Windows.Forms.View.Details; + this.listViewForCellPopulations.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listViewForCellPopulations_MouseDown); + // + // columnHeaderPopName + // + this.columnHeaderPopName.Text = "Name"; + this.columnHeaderPopName.Width = 78; + // + // columnHeaderCellNum + // + this.columnHeaderCellNum.Text = "Cell Number"; + this.columnHeaderCellNum.Width = 77; + // + // columnHeaderCellType + // + this.columnHeaderCellType.Text = "Type"; + this.columnHeaderCellType.Width = 90; + // + // PanelForParamCellPopulations + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamCellPopulations"; + this.Size = new System.Drawing.Size(239, 258); + this.panel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader columnHeaderPopName; + private System.Windows.Forms.ColumnHeader columnHeaderCellNum; + private System.Windows.Forms.ColumnHeader columnHeaderCellType; + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.ListView listViewForCellPopulations; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.cs new file mode 100644 index 0000000..f43d328 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Simulator.Forms.NewCellType; +using System.Runtime.Serialization; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParamCellPopulations : UserControl + { + // cWorld NewWorld; + public cPoint3D WorldDims; + FormForSimuGenerator Parent; + + public PanelForParamCellPopulations(cPoint3D WorldDims, FormForSimuGenerator Parent) + { + InitializeComponent(); + this.WorldDims = WorldDims; + this.Parent = Parent; + } + + private void editToolStripMenuItem_Click(object sender, EventArgs e) + { + Point locationOnForm = listViewForCellPopulations.FindForm().PointToClient(Control.MousePosition); + ListViewItem IdxItem = listViewForCellPopulations.GetItemAt(Control.MousePosition.X, Control.MousePosition.Y);// locationOnForm.Y - 163; + } + + void EditItem(object sender, EventArgs e) + { + cCellPopulation SelectedCellPop = (cCellPopulation)listViewForCellPopulations.FocusedItem.Tag; + + FormForInfoSingleCellPopInit_Simulator WindowForSingleCellPop = + new FormForInfoSingleCellPopInit_Simulator( this.WorldDims,SelectedCellPop.AssociatedVariables, Parent, SelectedCellPop); + + WindowForSingleCellPop.richTextBoxDescription.Text = SelectedCellPop.Information; + + if (WindowForSingleCellPop.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + List names = new List(); + + cCellPopulation returnPop = WindowForSingleCellPop.CellPopulation; + + listViewForCellPopulations.FocusedItem.SubItems[0].Text = returnPop.Name; + listViewForCellPopulations.FocusedItem.SubItems[1].Text = returnPop.Count.ToString(); + listViewForCellPopulations.FocusedItem.SubItems[2].Text = returnPop[0].Type.Name; + + //names.Add(SelectedCellPop.Count.ToString()); + // names.Add(WindowForSingleCellPop.CellPopulation[0].Type.Name); + returnPop.AssociatedVariables = WindowForSingleCellPop.ListVariables; + + + // ListViewItem NewItem = new ListViewItem(names.ToArray()); + + listViewForCellPopulations.FocusedItem.Tag = returnPop; + // NewItem.Checked = true; + //this.listViewForCellPopulations.Items.Add(NewItem); + } + } + + void DeleteItem(object sender, EventArgs e) + { + listViewForCellPopulations.Items.Remove(listViewForCellPopulations.FocusedItem); + } + + void NewTypeItem(object sender, EventArgs e) + { + Parent.CreateNewCellType(); + } + + private void LoadItem(object sender, EventArgs e) + { + OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + + CurrOpenFileDialog.Filter = "opt files (*.CP)|*.CP"; + CurrOpenFileDialog.Multiselect = true; + DialogResult Res = CurrOpenFileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrOpenFileDialog.FileNames[0] == "") return; + + foreach (var FileName in CurrOpenFileDialog.FileNames) + { + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(FileName, + FileMode.Open, + FileAccess.Read, + FileShare.Read); + cCellPopulation obj = (cCellPopulation)formatter.Deserialize(stream); + stream.Close(); + + List names = new List(); + names.Add(obj.Name); + names.Add(obj.Count.ToString()); + names.Add(obj[0].Type.Name); + + // WindowForSingleCellPop.CellPopulation.AssociatedVariables = WindowForSingleCellPop.ListVariables; + ListViewItem NewItem = new ListViewItem(names.ToArray()); + + NewItem.Tag = obj; + + NewItem.Checked = true; + this.listViewForCellPopulations.Items.Add(NewItem); + } + //Parent.ListCellTypes.Add(obj); + //MyPanelForParamCellTypes.RefreshDisplay(this); + //this.RefreshDisplay(Parent); + } + + private void SaveItem(object sender, EventArgs e) + { + SaveFileDialog CurrSavefileDialog = new SaveFileDialog(); + CurrSavefileDialog.Filter = "opt files (*.CP)|*.CP"; + CurrSavefileDialog.FileName = ((cCellPopulation)listViewForCellPopulations.FocusedItem.Tag).Name + ".CP"; + DialogResult Res = CurrSavefileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrSavefileDialog.FileName == "") return; + + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(CurrSavefileDialog.FileName, + FileMode.Create, + FileAccess.Write, FileShare.None); + formatter.Serialize(stream, (cCellPopulation)listViewForCellPopulations.FocusedItem.Tag); + stream.Close(); + } + + private void AddItem(object sender, EventArgs e) + { + List ListVar = new List(); + ListVar.Add(new cClassForVariable("v_CellNumber", 100)); + ListVar.Add(new cClassForVariable("v_InitPosX", 0)); + ListVar.Add(new cClassForVariable("v_InitPosY", 0)); + ListVar.Add(new cClassForVariable("v_InitPosZ", 0)); + ListVar.Add(new cClassForVariable("v_InitPosType", 0)); + ListVar.Add(new cClassForVariable("v_InitVolType", 0)); + ListVar.Add(new cClassForVariable("v_InitVol", 10)); + + cListVariables AssociatedListVar = new cListVariables(ListVar); + + FormForInfoSingleCellPopInit_Simulator WindowForSingleCellPop = + new FormForInfoSingleCellPopInit_Simulator(WorldDims, AssociatedListVar, Parent,null); + + if (WindowForSingleCellPop.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + List names = new List(); + names.Add(WindowForSingleCellPop.CellPopulation.Name); + names.Add(WindowForSingleCellPop.CellPopulation.Count.ToString()); + names.Add(WindowForSingleCellPop.CellPopulation[0].Type.Name); + WindowForSingleCellPop.CellPopulation.AssociatedVariables = WindowForSingleCellPop.ListVariables; + ListViewItem NewItem = new ListViewItem(names.ToArray()); + WindowForSingleCellPop.CellPopulation.Information = WindowForSingleCellPop.richTextBoxDescription.Text; + + NewItem.Tag = WindowForSingleCellPop.CellPopulation; + + NewItem.Checked = true; + this.listViewForCellPopulations.Items.Add(NewItem); + + } + } + + private void ClearItem(object sender, EventArgs e) + { + int NumItems = this.listViewForCellPopulations.Items.Count; + for (int IdxItem = 0; IdxItem < NumItems; IdxItem++) + { + this.listViewForCellPopulations.Items[0].Remove(); + } + } + + private void listViewForCellPopulations_MouseDown(object sender, MouseEventArgs e) + { + + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + //Point locationOnForm = listViewForCellPopulations.FindForm().PointToClient(Control.MousePosition); + ListViewItem IdxItem = listViewForCellPopulations.GetItemAt(e.X, e.Y); + + ContextMenuStrip contextMenuStripPicker = new ContextMenuStrip(); + + ToolStripMenuItem AddItem = new ToolStripMenuItem("Add"); + AddItem.Click += new System.EventHandler(this.AddItem); + contextMenuStripPicker.Items.Add(AddItem); + + + ToolStripMenuItem LoadItem = new ToolStripMenuItem("Load"); + LoadItem.Click += new System.EventHandler(this.LoadItem); + contextMenuStripPicker.Items.Add(LoadItem); + + if (IdxItem != null) + { + ToolStripMenuItem EditItem = new ToolStripMenuItem("Edit " + IdxItem.Text); + EditItem.Click += new System.EventHandler(this.EditItem); + contextMenuStripPicker.Items.Add(EditItem); + + ToolStripMenuItem SaveItem = new ToolStripMenuItem("Save " + IdxItem.Text); + SaveItem.Click += new System.EventHandler(this.SaveItem); + contextMenuStripPicker.Items.Add(SaveItem); + + ToolStripMenuItem DeleteItem = new ToolStripMenuItem("Delete " + IdxItem.Text); + DeleteItem.Click += new System.EventHandler(this.DeleteItem); + contextMenuStripPicker.Items.Add(DeleteItem); + + } + + if (listViewForCellPopulations.Items.Count > 0) + { + ToolStripMenuItem ClearItem = new ToolStripMenuItem("Clear"); + ClearItem.Click += new System.EventHandler(this.ClearItem); + contextMenuStripPicker.Items.Add(ClearItem); + } + contextMenuStripPicker.Items.Add(new ToolStripSeparator()); + + ToolStripMenuItem NewTypeItem = new ToolStripMenuItem("New Cell Type"); + NewTypeItem.Click += new System.EventHandler(this.NewTypeItem); + contextMenuStripPicker.Items.Add(NewTypeItem); + + contextMenuStripPicker.Show(Control.MousePosition); + } + } + } +} diff --git a/Classes/cDisplayTable.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.resx similarity index 100% rename from Classes/cDisplayTable.resx rename to Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellPopulations.resx diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.Designer.cs new file mode 100644 index 0000000..d08c840 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.Designer.cs @@ -0,0 +1,157 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParamCellTypes + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addNewCellTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editCurrentTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.richTextBox = new System.Windows.Forms.RichTextBox(); + this.panelForColor = new System.Windows.Forms.Panel(); + this.comboBoxCellTypes = new System.Windows.Forms.ComboBox(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.saveCellTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadCellTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panel.SuspendLayout(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.ContextMenuStrip = this.contextMenuStrip; + this.panel.Controls.Add(this.richTextBox); + this.panel.Controls.Add(this.panelForColor); + this.panel.Controls.Add(this.comboBoxCellTypes); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(233, 188); + this.panel.TabIndex = 0; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addNewCellTypeToolStripMenuItem, + this.editCurrentTypeToolStripMenuItem, + this.toolStripSeparator1, + this.saveCellTypeToolStripMenuItem, + this.loadCellTypeToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(167, 120); + // + // addNewCellTypeToolStripMenuItem + // + this.addNewCellTypeToolStripMenuItem.Name = "addNewCellTypeToolStripMenuItem"; + this.addNewCellTypeToolStripMenuItem.Size = new System.Drawing.Size(166, 22); + this.addNewCellTypeToolStripMenuItem.Text = "New Cell Type"; + this.addNewCellTypeToolStripMenuItem.Click += new System.EventHandler(this.addNewCellTypeToolStripMenuItem_Click); + // + // editCurrentTypeToolStripMenuItem + // + this.editCurrentTypeToolStripMenuItem.Name = "editCurrentTypeToolStripMenuItem"; + this.editCurrentTypeToolStripMenuItem.Size = new System.Drawing.Size(166, 22); + this.editCurrentTypeToolStripMenuItem.Text = "Edit Current Type"; + this.editCurrentTypeToolStripMenuItem.Click += new System.EventHandler(this.editCurrentTypeToolStripMenuItem_Click); + // + // richTextBox + // + this.richTextBox.ContextMenuStrip = this.contextMenuStrip; + this.richTextBox.Location = new System.Drawing.Point(12, 36); + this.richTextBox.Name = "richTextBox"; + this.richTextBox.ReadOnly = true; + this.richTextBox.Size = new System.Drawing.Size(205, 144); + this.richTextBox.TabIndex = 2; + this.richTextBox.Text = ""; + // + // panelForColor + // + this.panelForColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelForColor.ContextMenuStrip = this.contextMenuStrip; + this.panelForColor.Location = new System.Drawing.Point(139, 6); + this.panelForColor.Name = "panelForColor"; + this.panelForColor.Size = new System.Drawing.Size(78, 21); + this.panelForColor.TabIndex = 1; + this.panelForColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelForColor_MouseClick); + // + // comboBoxCellTypes + // + this.comboBoxCellTypes.ContextMenuStrip = this.contextMenuStrip; + this.comboBoxCellTypes.FormattingEnabled = true; + this.comboBoxCellTypes.Location = new System.Drawing.Point(12, 6); + this.comboBoxCellTypes.Name = "comboBoxCellTypes"; + this.comboBoxCellTypes.Size = new System.Drawing.Size(121, 21); + this.comboBoxCellTypes.TabIndex = 0; + this.comboBoxCellTypes.SelectedIndexChanged += new System.EventHandler(this.comboBoxCellTypes_SelectedIndexChanged); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(163, 6); + // + // saveCellTypeToolStripMenuItem + // + this.saveCellTypeToolStripMenuItem.Name = "saveCellTypeToolStripMenuItem"; + this.saveCellTypeToolStripMenuItem.Size = new System.Drawing.Size(166, 22); + this.saveCellTypeToolStripMenuItem.Text = "Save Cell Type"; + this.saveCellTypeToolStripMenuItem.Click += new System.EventHandler(this.saveCellTypeToolStripMenuItem_Click); + // + // loadCellTypeToolStripMenuItem + // + this.loadCellTypeToolStripMenuItem.Name = "loadCellTypeToolStripMenuItem"; + this.loadCellTypeToolStripMenuItem.Size = new System.Drawing.Size(166, 22); + this.loadCellTypeToolStripMenuItem.Text = "Load Cell Type"; + this.loadCellTypeToolStripMenuItem.Click += new System.EventHandler(this.loadCellTypeToolStripMenuItem_Click); + // + // PanelForParamCellTypes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamCellTypes"; + this.Size = new System.Drawing.Size(241, 194); + this.panel.ResumeLayout(false); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RichTextBox richTextBox; + private System.Windows.Forms.Panel panelForColor; + private System.Windows.Forms.ComboBox comboBoxCellTypes; + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem addNewCellTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editCurrentTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem saveCellTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem loadCellTypeToolStripMenuItem; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.cs new file mode 100644 index 0000000..ba8bbfe --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Simulator.Forms.NewCellType; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.IO; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParamCellTypes : UserControl + { + + public PanelForParamCellTypes() + { + InitializeComponent(); + } + + FormForSimuGenerator Parent; + + public void RefreshDisplay(FormForSimuGenerator Parent) + { + this.Parent = Parent; + comboBoxCellTypes.Items.Clear(); + foreach (cCellType item in Parent.ListCellTypes) + { + comboBoxCellTypes.Items.Add(item.Name); + } + + this.comboBoxCellTypes.SelectedItem = this.comboBoxCellTypes.Items[0]; + } + + private void comboBoxCellTypes_SelectedIndexChanged(object sender, EventArgs e) + { + cCellType CurrentType = Parent.ListCellTypes.FindType(comboBoxCellTypes.Text); + if (CurrentType == null) return; + this.panelForColor.BackColor = CurrentType.TypeColor; + this.richTextBox.Clear(); + // this.richTextBox.AppendText(CurrentType.Cycle.ListProba.ToString()); + } + + private void panelForColor_MouseClick(object sender, MouseEventArgs e) + { + ColorDialog ColorPicker = new ColorDialog(); + if (ColorPicker.ShowDialog() != DialogResult.OK) return; + panelForColor.BackColor = ColorPicker.Color; + panelForColor.Refresh(); + cCellType CurrentType = Parent.ListCellTypes.FindType(comboBoxCellTypes.Text); + CurrentType.TypeColor = panelForColor.BackColor; + } + + private void addNewCellTypeToolStripMenuItem_Click(object sender, EventArgs e) + { + Parent.CreateNewCellType(); + } + + private void editCurrentTypeToolStripMenuItem_Click(object sender, EventArgs e) + { + Parent.EditCellType(Parent.ListCellTypes.FindType(comboBoxCellTypes.Text)); + } + + private void saveCellTypeToolStripMenuItem_Click(object sender, EventArgs e) + { +// Parent.ListCellTypes.FindType(comboBoxCellTypes.Text); + + SaveFileDialog CurrSavefileDialog = new SaveFileDialog(); + CurrSavefileDialog.Filter = "opt files (*.CT)|*.CT"; + DialogResult Res = CurrSavefileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrSavefileDialog.FileName == "") return; + + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(CurrSavefileDialog.FileName, + FileMode.Create, + FileAccess.Write, FileShare.None); + formatter.Serialize(stream, Parent.ListCellTypes.FindType(comboBoxCellTypes.Text)); + stream.Close(); + + + + + } + + private void loadCellTypeToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + + CurrOpenFileDialog.Filter = "opt files (*.CT)|*.CT"; + DialogResult Res = CurrOpenFileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrOpenFileDialog.FileName == "") return; + + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(CurrOpenFileDialog.FileName, + FileMode.Open, + FileAccess.Read, + FileShare.Read); + cCellType obj = (cCellType)formatter.Deserialize(stream); + stream.Close(); + + Parent.ListCellTypes.Add(obj); + //MyPanelForParamCellTypes.RefreshDisplay(this); + this.RefreshDisplay(Parent); + + } + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.resx new file mode 100644 index 0000000..2d8292b --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamCellTypes.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/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.Designer.cs new file mode 100644 index 0000000..355cb89 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.Designer.cs @@ -0,0 +1,106 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParamGeneral + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.numericUpDownRunIterations = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.checkBoxMemory = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRunIterations)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxMemory); + this.panel.Controls.Add(this.numericUpDownRunIterations); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(171, 242); + this.panel.TabIndex = 0; + // + // numericUpDownRunIterations + // + this.numericUpDownRunIterations.Location = new System.Drawing.Point(68, 15); + this.numericUpDownRunIterations.Maximum = new decimal(new int[] { + 276447232, + 23283, + 0, + 0}); + this.numericUpDownRunIterations.Name = "numericUpDownRunIterations"; + this.numericUpDownRunIterations.Size = new System.Drawing.Size(84, 20); + this.numericUpDownRunIterations.TabIndex = 4; + this.numericUpDownRunIterations.Value = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 17); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(50, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Iterations"; + // + // checkBoxMemory + // + this.checkBoxMemory.AutoSize = true; + this.checkBoxMemory.Location = new System.Drawing.Point(13, 63); + this.checkBoxMemory.Name = "checkBoxMemory"; + this.checkBoxMemory.Size = new System.Drawing.Size(144, 17); + this.checkBoxMemory.TabIndex = 6; + this.checkBoxMemory.Text = "Keep previous cell states"; + this.checkBoxMemory.UseVisualStyleBackColor = true; + // + // PanelForParamGeneral + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamGeneral"; + this.Size = new System.Drawing.Size(177, 248); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRunIterations)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.NumericUpDown numericUpDownRunIterations; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox checkBoxMemory; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.cs new file mode 100644 index 0000000..372d999 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParamGeneral : UserControl + { + public PanelForParamGeneral() + { + InitializeComponent(); + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamGeneral.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/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.Designer.cs new file mode 100644 index 0000000..b9b446f --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.Designer.cs @@ -0,0 +1,170 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParamPlateDesign + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.checkBoxExportToDB = new System.Windows.Forms.CheckBox(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownNumCols = new System.Windows.Forms.NumericUpDown(); + this.groupBoxPlateDesign = new System.Windows.Forms.GroupBox(); + this.numericUpDownNumRows = new System.Windows.Forms.NumericUpDown(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumCols)).BeginInit(); + this.groupBoxPlateDesign.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumRows)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBoxPlateDesign); + this.panel.Controls.Add(this.checkBoxExportToDB); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(187, 232); + this.panel.TabIndex = 1; + // + // checkBoxExportToDB + // + this.checkBoxExportToDB.AutoSize = true; + this.checkBoxExportToDB.Location = new System.Drawing.Point(38, 21); + this.checkBoxExportToDB.Name = "checkBoxExportToDB"; + this.checkBoxExportToDB.Size = new System.Drawing.Size(117, 17); + this.checkBoxExportToDB.TabIndex = 12; + this.checkBoxExportToDB.Text = "Export to Database"; + this.checkBoxExportToDB.UseVisualStyleBackColor = true; + this.checkBoxExportToDB.CheckedChanged += new System.EventHandler(this.checkBoxExportToDB_CheckedChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 31); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(47, 13); + this.label1.TabIndex = 13; + this.label1.Text = "Columns"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(18, 62); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(34, 13); + this.label2.TabIndex = 14; + this.label2.Text = "Rows"; + // + // numericUpDownNumCols + // + this.numericUpDownNumCols.Location = new System.Drawing.Point(73, 29); + this.numericUpDownNumCols.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownNumCols.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumCols.Name = "numericUpDownNumCols"; + this.numericUpDownNumCols.Size = new System.Drawing.Size(91, 20); + this.numericUpDownNumCols.TabIndex = 15; + this.numericUpDownNumCols.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // groupBoxPlateDesign + // + this.groupBoxPlateDesign.Controls.Add(this.numericUpDownNumRows); + this.groupBoxPlateDesign.Controls.Add(this.numericUpDownNumCols); + this.groupBoxPlateDesign.Controls.Add(this.label1); + this.groupBoxPlateDesign.Controls.Add(this.label2); + this.groupBoxPlateDesign.Enabled = false; + this.groupBoxPlateDesign.Location = new System.Drawing.Point(4, 56); + this.groupBoxPlateDesign.Name = "groupBoxPlateDesign"; + this.groupBoxPlateDesign.Size = new System.Drawing.Size(179, 95); + this.groupBoxPlateDesign.TabIndex = 16; + this.groupBoxPlateDesign.TabStop = false; + this.groupBoxPlateDesign.Text = "Plate Design"; + // + // numericUpDownNumRows + // + this.numericUpDownNumRows.Location = new System.Drawing.Point(73, 60); + this.numericUpDownNumRows.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownNumRows.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumRows.Name = "numericUpDownNumRows"; + this.numericUpDownNumRows.Size = new System.Drawing.Size(91, 20); + this.numericUpDownNumRows.TabIndex = 18; + this.numericUpDownNumRows.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // PanelForParamPlateDesign + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamPlateDesign"; + this.Size = new System.Drawing.Size(193, 240); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumCols)).EndInit(); + this.groupBoxPlateDesign.ResumeLayout(false); + this.groupBoxPlateDesign.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumRows)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.CheckBox checkBoxExportToDB; + private System.Windows.Forms.GroupBox groupBoxPlateDesign; + private System.Windows.Forms.NumericUpDown numericUpDownNumRows; + private System.Windows.Forms.NumericUpDown numericUpDownNumCols; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.cs new file mode 100644 index 0000000..a466dec --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParamPlateDesign : UserControl + { + public PanelForParamPlateDesign() + { + InitializeComponent(); + } + + private void checkBoxExportToDB_CheckedChanged(object sender, EventArgs e) + { + groupBoxPlateDesign.Enabled = checkBoxExportToDB.Checked; + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamPlateDesign.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/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.Designer.cs new file mode 100644 index 0000000..24906fc --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.Designer.cs @@ -0,0 +1,176 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParamWorldDimensions + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.numericUpDownWorldDimensionY = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownWorldDimensionX = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownWorldDimensionZ = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionY)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionX)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionZ)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.label1); + this.panel.Controls.Add(this.numericUpDownWorldDimensionY); + this.panel.Controls.Add(this.numericUpDownWorldDimensionX); + this.panel.Controls.Add(this.numericUpDownWorldDimensionZ); + this.panel.Location = new System.Drawing.Point(1, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(187, 238); + this.panel.TabIndex = 0; + // + // numericUpDownWorldDimensionY + // + this.numericUpDownWorldDimensionY.Location = new System.Drawing.Point(52, 39); + this.numericUpDownWorldDimensionY.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionY.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionY.Name = "numericUpDownWorldDimensionY"; + this.numericUpDownWorldDimensionY.Size = new System.Drawing.Size(109, 20); + this.numericUpDownWorldDimensionY.TabIndex = 1; + this.numericUpDownWorldDimensionY.Value = new decimal(new int[] { + 600, + 0, + 0, + 0}); + // + // numericUpDownWorldDimensionX + // + this.numericUpDownWorldDimensionX.Location = new System.Drawing.Point(52, 13); + this.numericUpDownWorldDimensionX.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionX.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionX.Name = "numericUpDownWorldDimensionX"; + this.numericUpDownWorldDimensionX.Size = new System.Drawing.Size(109, 20); + this.numericUpDownWorldDimensionX.TabIndex = 0; + this.numericUpDownWorldDimensionX.Value = new decimal(new int[] { + 600, + 0, + 0, + 0}); + // + // numericUpDownWorldDimensionZ + // + this.numericUpDownWorldDimensionZ.Location = new System.Drawing.Point(52, 65); + this.numericUpDownWorldDimensionZ.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionZ.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownWorldDimensionZ.Name = "numericUpDownWorldDimensionZ"; + this.numericUpDownWorldDimensionZ.Size = new System.Drawing.Size(109, 20); + this.numericUpDownWorldDimensionZ.TabIndex = 2; + this.numericUpDownWorldDimensionZ.Value = new decimal(new int[] { + 50, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(11, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Width"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(11, 41); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(38, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Height"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(11, 67); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(36, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Depth"; + // + // PanelForParamWorldDimensions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamWorldDimensions"; + this.Size = new System.Drawing.Size(188, 241); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionY)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionX)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWorldDimensionZ)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.NumericUpDown numericUpDownWorldDimensionZ; + private System.Windows.Forms.NumericUpDown numericUpDownWorldDimensionY; + private System.Windows.Forms.NumericUpDown numericUpDownWorldDimensionX; + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.cs new file mode 100644 index 0000000..3e437d9 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParamWorldDimensions : UserControl + { + public PanelForParamWorldDimensions() + { + InitializeComponent(); + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParamWorldDimensions.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/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.Designer.cs new file mode 100644 index 0000000..ee1687d --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.Designer.cs @@ -0,0 +1,85 @@ +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + partial class PanelForParams3D + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.checkBoxDisplayText = new System.Windows.Forms.CheckBox(); + this.checkBoxDisplayCellPath = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxDisplayCellPath); + this.panel.Controls.Add(this.checkBoxDisplayText); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(175, 142); + this.panel.TabIndex = 0; + // + // checkBoxDisplayText + // + this.checkBoxDisplayText.AutoSize = true; + this.checkBoxDisplayText.Location = new System.Drawing.Point(32, 17); + this.checkBoxDisplayText.Name = "checkBoxDisplayText"; + this.checkBoxDisplayText.Size = new System.Drawing.Size(118, 17); + this.checkBoxDisplayText.TabIndex = 0; + this.checkBoxDisplayText.Text = "Display Type Name"; + this.checkBoxDisplayText.UseVisualStyleBackColor = true; + // + // checkBoxDisplayCellPath + // + this.checkBoxDisplayCellPath.AutoSize = true; + this.checkBoxDisplayCellPath.Location = new System.Drawing.Point(32, 53); + this.checkBoxDisplayCellPath.Name = "checkBoxDisplayCellPath"; + this.checkBoxDisplayCellPath.Size = new System.Drawing.Size(110, 17); + this.checkBoxDisplayCellPath.TabIndex = 1; + this.checkBoxDisplayCellPath.Text = "Display Cell Paths"; + this.checkBoxDisplayCellPath.UseVisualStyleBackColor = true; + // + // PanelForParams3D + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParams3D"; + this.Size = new System.Drawing.Size(182, 152); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.CheckBox checkBoxDisplayText; + private System.Windows.Forms.CheckBox checkBoxDisplayCellPath; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.cs b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.cs new file mode 100644 index 0000000..9028a2f --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.Panels +{ + public partial class PanelForParams3D : UserControl + { + public PanelForParams3D() + { + InitializeComponent(); + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.resx b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/MainWindow/PanelForParams3D.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/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.Designer.cs new file mode 100644 index 0000000..f8b176b --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.Designer.cs @@ -0,0 +1,140 @@ +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + partial class FormForNewCellType + { + /// + /// 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(); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("General"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Transition Values"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Cell Cycle"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Velocity"); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForNewCellType)); + this.treeViewForOptions = new System.Windows.Forms.TreeView(); + this.panelForDisplay = new System.Windows.Forms.Panel(); + this.buttonOk = new System.Windows.Forms.Button(); + this.contextMenuStripForTree = new System.Windows.Forms.ContextMenuStrip(this.components); + this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStripForTree.SuspendLayout(); + this.SuspendLayout(); + // + // treeViewForOptions + // + this.treeViewForOptions.Location = new System.Drawing.Point(3, 5); + this.treeViewForOptions.Name = "treeViewForOptions"; + treeNode5.Name = "Node0"; + treeNode5.Tag = "General"; + treeNode5.Text = "General"; + treeNode6.Name = "Node0"; + treeNode6.Tag = "TransitionMatrix"; + treeNode6.Text = "Transition Values"; + treeNode7.Name = "Node1"; + treeNode7.Tag = "CellCycle"; + treeNode7.Text = "Cell Cycle"; + treeNode8.Name = "Node2"; + treeNode8.Tag = "Velocity"; + treeNode8.Text = "Velocity"; + this.treeViewForOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode5, + treeNode6, + treeNode7, + treeNode8}); + this.treeViewForOptions.Size = new System.Drawing.Size(188, 276); + this.treeViewForOptions.TabIndex = 11; + this.treeViewForOptions.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewForOptions_AfterSelect); + // + // panelForDisplay + // + this.panelForDisplay.AutoScroll = true; + this.panelForDisplay.BackColor = System.Drawing.SystemColors.Control; + this.panelForDisplay.Location = new System.Drawing.Point(197, 5); + this.panelForDisplay.Name = "panelForDisplay"; + this.panelForDisplay.Size = new System.Drawing.Size(252, 276); + this.panelForDisplay.TabIndex = 12; + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(351, 286); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(98, 25); + this.buttonOk.TabIndex = 13; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); + // + // contextMenuStripForTree + // + this.contextMenuStripForTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.collapseAllToolStripMenuItem, + this.expandAllToolStripMenuItem}); + this.contextMenuStripForTree.Name = "contextMenuStripForTree"; + this.contextMenuStripForTree.Size = new System.Drawing.Size(153, 70); + // + // collapseAllToolStripMenuItem + // + this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem"; + this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.collapseAllToolStripMenuItem.Text = "Collapse All"; + this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); + // + // expandAllToolStripMenuItem + // + this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem"; + this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.expandAllToolStripMenuItem.Text = "Expand All"; + this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + // + // FormForNewCellType + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(453, 313); + this.Controls.Add(this.buttonOk); + this.Controls.Add(this.panelForDisplay); + this.Controls.Add(this.treeViewForOptions); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForNewCellType"; + this.Text = "New Cell Type"; + this.contextMenuStripForTree.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.TreeView treeViewForOptions; + private System.Windows.Forms.Panel panelForDisplay; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForTree; + private System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.cs new file mode 100644 index 0000000..76fdcd7 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using HCSAnalyzer.Simulator.Classes; + +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + public partial class FormForNewCellType : Form + { + + #region List Parameters + + cListParams ListParams; + public PanelForTransitionMatrix TransitionMatrixGUI; + + public class cListParams : List + { + public cListParams(FormForSimuGenerator Parent, FormForNewCellType DirectParent) + { + this.Add(new cParamGeneral("General")); + this.Add(new cParamTransitionMatrix("TransitionMatrix", Parent, DirectParent)); + this.Add(new cParamVelocity("Velocity")); + this.Add(new cParamCellCycle("CellCycle")); + } + + public Panel GetPanel(string Name) + { + if (Name == null) return null; + + foreach (var item in this) + if (item.Name == Name) return item.GetPanel(); + + return null; + } + + public cParamAlgo GetListParams(string CategoryName) + { + foreach (cParamAlgo item in this) + { + if (item.Name == CategoryName) return item; + } + return null; + + } + } + + [Serializable] + public class cParamCellCycle : cParamAlgo + { + public cParamCellCycle(string Name) + : base(Name) + { + PanelForParamCellCycle PanelForOption = new PanelForParamCellCycle(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamVelocity : cParamAlgo + { + public cParamVelocity(string Name) + : base(Name) + { + PanelForParamVelocity PanelForOption = new PanelForParamVelocity(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamGeneral : cParamAlgo + { + public cParamGeneral(string Name) + : base(Name) + { + PanelForParamGeneralForCellType PanelForOption = new PanelForParamGeneralForCellType(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + + + [Serializable] + public class cParamTransitionMatrix : cParamAlgo + { + public cParamTransitionMatrix(string Name, FormForSimuGenerator Parent, FormForNewCellType DirectParent) + : base(Name) + { + PanelForTransitionMatrix PanelForOption = new PanelForTransitionMatrix(Parent, DirectParent); + this.PanelToDisplay = PanelForOption.panel; + } + } + + #endregion + FormForSimuGenerator Parent; + + + public FormForNewCellType(FormForSimuGenerator Parent) + { + InitializeComponent(); + + this.treeViewForOptions.ExpandAll(); + this.treeViewForOptions.SelectedNode = this.treeViewForOptions.Nodes[0]; + this.ListParams = new cListParams(Parent, this); + this.Parent = Parent; + + } + public FormForNewCellType(FormForSimuGenerator Parent, cCellType CurrentType) + { + InitializeComponent(); + + this.treeViewForOptions.ExpandAll(); + this.treeViewForOptions.SelectedNode = this.treeViewForOptions.Nodes[0]; + this.ListParams = new cListParams(Parent, this); + this.Parent = Parent; + // ListParams.GetListParams("Velocity") + // ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownFront").Value = 100; + + UpdateNumUpDownValue("Velocity", "numericUpDownFront", CurrentType.Velocity.Weight_Front); + UpdateNumUpDownValue("Velocity", "numericUpDownBack", CurrentType.Velocity.Weight_Back); + UpdateNumUpDownValue("Velocity", "numericUpDownTop", CurrentType.Velocity.Weight_Top); + UpdateNumUpDownValue("Velocity", "numericUpDownBottom", CurrentType.Velocity.Weight_Bottom); + UpdateNumUpDownValue("Velocity", "numericUpDownLeft", CurrentType.Velocity.Weight_Left); + UpdateNumUpDownValue("Velocity", "numericUpDownRight", CurrentType.Velocity.Weight_Right); + + UpdatePanelCtrlColor("General", "panelColor", CurrentType.TypeColor); + UpdateCtrlTextValue("General", "textBoxName", CurrentType.Name); + UpDateTransitionMatrix("TransitionMatrix", "dataGridViewForProbaTransition", CurrentType.ListInitialTransitions); + } + + + void UpDateTransitionMatrix(string ParamPanelName, string ParamName, cListTransition ListTransitionValues) + { + cParamAlgo MyParamAlgo = ListParams.GetListParams(ParamPanelName); + Control[] ListCtrl = MyParamAlgo.GetPanel().Controls.Find(ParamName, true); + + DataGridView MyGrid = (DataGridView)ListCtrl[0]; + + // DirectParent.TransitionMatrixGUI = this; + MyGrid.Rows.Clear(); + + foreach (var item in ListTransitionValues) + { + MyGrid.Rows.Add(); + MyGrid.Rows[MyGrid.Rows.Count - 1].HeaderCell.Value = item.DestType.Name; + MyGrid[0, MyGrid.Rows.Count - 1].Value = item.Value; + } + // MyGrid.ColumnCount; + MyGrid.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders); + } + + void UpdateCtrlTextValue(string ParamPanelName, string ParamName, string NewValue) + { + cParamAlgo MyParamAlgo = ListParams.GetListParams(ParamPanelName); + MyParamAlgo.GetListValuesParam().ListTextValues.Get(ParamName).Value = NewValue; + + Control[] ListCtrl = MyParamAlgo.GetPanel().Controls.Find(ParamName, true); + if ((ListCtrl != null) && (ListCtrl.Length == 1)) + ListCtrl[0].Text = NewValue; + } + + void UpdateNumUpDownValue(string ParamPanelName, string ParamName, double NewValue) + { + cParamAlgo MyParamAlgo = ListParams.GetListParams(ParamPanelName); + MyParamAlgo.GetListValuesParam().ListDoubleValues.Get(ParamName).Value = NewValue; + + Control[] ListCtrl = MyParamAlgo.GetPanel().Controls.Find(ParamName, true); + if ((ListCtrl != null) && (ListCtrl.Length == 1)) + ListCtrl[0].Text = NewValue.ToString(); + } + + void UpdatePanelCtrlColor(string ParamPanelName, string ParamName, Color NewValue) + { + cParamAlgo MyParamAlgo = ListParams.GetListParams(ParamPanelName); + MyParamAlgo.GetListValuesParam().ListColorValues.Get(ParamName).Value = NewValue; + + Control[] ListCtrl = MyParamAlgo.GetPanel().Controls.Find(ParamName, true); + if ((ListCtrl != null) && (ListCtrl.Length == 1)) + { + ListCtrl[0].BackColor = NewValue; + } + } + + + + private void treeViewForOptions_AfterSelect(object sender, TreeViewEventArgs e) + { + this.panelForDisplay.Controls.Clear(); + string TagName = (string)e.Node.Tag; + Panel PanelToDisp = ListParams.GetPanel(TagName); + if (PanelToDisp == null) return; + this.panelForDisplay.Controls.Add(PanelToDisp); + } + + public cCellType NewCellType; + + private void buttonOk_Click(object sender, EventArgs e) + { + double Front = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownFront").Value); + double Back = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownBack").Value); + double Left = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownLeft").Value); + double Right = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownRight").Value); + double Top = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownTop").Value); + double Bottom = (double)(ListParams.GetListParams("Velocity").GetListValuesParam().ListDoubleValues.Get("numericUpDownBottom").Value); + + cVelocity Velocity = new cVelocity(Front, Back, Left, Right, Top, Bottom); + Velocity.Speed = 1; + + string Name = (string)(ListParams.GetListParams("General").GetListValuesParam().ListTextValues.Get("textBoxName").Value); + + Color PickedColor = (Color)(ListParams.GetListParams("General").GetListValuesParam().ListColorValues.Get("panelColor").Value); + + List NewListTransitions = new List(); + + for (int IdxRow = 0; IdxRow < this.TransitionMatrixGUI.dataGridViewForProbaTransition.Rows.Count; IdxRow++) + { + + // this.TransitionMatrixGUI.dataGridView.Rows[IdxRow]; + NewListTransitions.Add(new cTransitionValue(Parent.ListCellTypes.FindType((string)this.TransitionMatrixGUI.dataGridViewForProbaTransition.Rows[IdxRow].HeaderCell.Value), + Convert.ToDouble(this.TransitionMatrixGUI.dataGridViewForProbaTransition.Rows[IdxRow].Cells[0].Value.ToString()))); + } + + + NewCellType = new cCellType(Name, Velocity, PickedColor, new cCellCycle(), NewListTransitions); + + NewCellType.ListInitialTransitions[NewCellType.ListInitialTransitions.Count - 1].DestType = NewCellType; + } + + private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.CollapseAll(); + } + + private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.ExpandAll(); + } + } +} diff --git a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.resx b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.resx similarity index 99% rename from Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.resx rename to Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.resx index 960d4b7..eca637e 100644 --- a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.resx +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/FormForNewCellType.resx @@ -117,7 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.Designer.cs new file mode 100644 index 0000000..2c1d3e2 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.Designer.cs @@ -0,0 +1,71 @@ +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + partial class PanelForParamCellCycle + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 242); + this.panel.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(19, 18); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(53, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Cell Cycle"; + // + // PanelForParamCellCycle + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamCellCycle"; + this.Size = new System.Drawing.Size(238, 251); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.Label label1; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.cs new file mode 100644 index 0000000..2495969 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + public partial class PanelForParamCellCycle : UserControl + { + public PanelForParamCellCycle() + { + InitializeComponent(); + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.resx b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamCellCycle.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/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.Designer.cs new file mode 100644 index 0000000..917d626 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.Designer.cs @@ -0,0 +1,107 @@ +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + partial class PanelForParamGeneralForCellType + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.textBoxName = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.panelColor = new System.Windows.Forms.Panel(); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.panelColor); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.textBoxName); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 242); + this.panel.TabIndex = 1; + // + // textBoxName + // + this.textBoxName.Location = new System.Drawing.Point(60, 15); + this.textBoxName.Name = "textBoxName"; + this.textBoxName.Size = new System.Drawing.Size(134, 20); + this.textBoxName.TabIndex = 6; + this.textBoxName.Text = "New Type"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(19, 18); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Name"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(19, 47); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(31, 13); + this.label2.TabIndex = 7; + this.label2.Text = "Color"; + // + // panelColor + // + this.panelColor.BackColor = System.Drawing.Color.Chocolate; + this.panelColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelColor.Location = new System.Drawing.Point(60, 48); + this.panelColor.Name = "panelColor"; + this.panelColor.Size = new System.Drawing.Size(134, 13); + this.panelColor.TabIndex = 8; + this.panelColor.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panelColor_MouseClick); + // + // PanelForParamGeneralForCellType + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamGeneralForCellType"; + this.Size = new System.Drawing.Size(238, 252); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.TextBox textBoxName; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panelColor; + private System.Windows.Forms.Label label2; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.cs new file mode 100644 index 0000000..e05f82a --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + public partial class PanelForParamGeneralForCellType : UserControl + { + public PanelForParamGeneralForCellType() + { + InitializeComponent(); + } + + private void panelColor_MouseClick(object sender, MouseEventArgs e) + { + ColorDialog ColorPicker = new ColorDialog(); + if(ColorPicker.ShowDialog() != DialogResult.OK) return; + panelColor.BackColor = ColorPicker.Color; + panelColor.Refresh(); + + } + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.resx b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamGeneralForCellType.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/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.Designer.cs new file mode 100644 index 0000000..1f46537 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.Designer.cs @@ -0,0 +1,251 @@ +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + partial class PanelForParamVelocity + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.resetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label6 = new System.Windows.Forms.Label(); + this.numericUpDownBottom = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.numericUpDownTop = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownRight = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownLeft = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownBack = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.numericUpDownFront = new System.Windows.Forms.NumericUpDown(); + this.panel.SuspendLayout(); + this.contextMenuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBottom)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTop)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLeft)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBack)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFront)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.ContextMenuStrip = this.contextMenuStrip; + this.panel.Controls.Add(this.label6); + this.panel.Controls.Add(this.numericUpDownBottom); + this.panel.Controls.Add(this.label5); + this.panel.Controls.Add(this.numericUpDownTop); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.numericUpDownRight); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.numericUpDownLeft); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.numericUpDownBack); + this.panel.Controls.Add(this.label1); + this.panel.Controls.Add(this.numericUpDownFront); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 242); + this.panel.TabIndex = 3; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.resetToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(103, 26); + // + // resetToolStripMenuItem + // + this.resetToolStripMenuItem.Name = "resetToolStripMenuItem"; + this.resetToolStripMenuItem.Size = new System.Drawing.Size(102, 22); + this.resetToolStripMenuItem.Text = "Reset"; + this.resetToolStripMenuItem.Click += new System.EventHandler(this.resetToolStripMenuItem_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(112, 215); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(35, 13); + this.label6.TabIndex = 17; + this.label6.Text = "Down"; + // + // numericUpDownBottom + // + this.numericUpDownBottom.DecimalPlaces = 2; + this.numericUpDownBottom.Location = new System.Drawing.Point(151, 212); + this.numericUpDownBottom.Name = "numericUpDownBottom"; + this.numericUpDownBottom.Size = new System.Drawing.Size(67, 20); + this.numericUpDownBottom.TabIndex = 16; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(112, 189); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(21, 13); + this.label5.TabIndex = 15; + this.label5.Text = "Up"; + // + // numericUpDownTop + // + this.numericUpDownTop.DecimalPlaces = 2; + this.numericUpDownTop.Location = new System.Drawing.Point(151, 186); + this.numericUpDownTop.Name = "numericUpDownTop"; + this.numericUpDownTop.Size = new System.Drawing.Size(67, 20); + this.numericUpDownTop.TabIndex = 14; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(169, 97); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 13; + this.label4.Text = "Right"; + // + // numericUpDownRight + // + this.numericUpDownRight.DecimalPlaces = 2; + this.numericUpDownRight.Location = new System.Drawing.Point(151, 74); + this.numericUpDownRight.Name = "numericUpDownRight"; + this.numericUpDownRight.Size = new System.Drawing.Size(68, 20); + this.numericUpDownRight.TabIndex = 12; + this.numericUpDownRight.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(21, 97); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(25, 13); + this.label3.TabIndex = 11; + this.label3.Text = "Left"; + // + // numericUpDownLeft + // + this.numericUpDownLeft.DecimalPlaces = 2; + this.numericUpDownLeft.Location = new System.Drawing.Point(3, 74); + this.numericUpDownLeft.Name = "numericUpDownLeft"; + this.numericUpDownLeft.Size = new System.Drawing.Size(68, 20); + this.numericUpDownLeft.TabIndex = 10; + this.numericUpDownLeft.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(94, 140); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Back"; + // + // numericUpDownBack + // + this.numericUpDownBack.DecimalPlaces = 2; + this.numericUpDownBack.Location = new System.Drawing.Point(77, 117); + this.numericUpDownBack.Name = "numericUpDownBack"; + this.numericUpDownBack.Size = new System.Drawing.Size(67, 20); + this.numericUpDownBack.TabIndex = 8; + this.numericUpDownBack.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(94, 13); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(31, 13); + this.label1.TabIndex = 7; + this.label1.Text = "Front"; + // + // numericUpDownFront + // + this.numericUpDownFront.DecimalPlaces = 2; + this.numericUpDownFront.Location = new System.Drawing.Point(76, 29); + this.numericUpDownFront.Name = "numericUpDownFront"; + this.numericUpDownFront.Size = new System.Drawing.Size(68, 20); + this.numericUpDownFront.TabIndex = 6; + this.numericUpDownFront.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // PanelForParamVelocity + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamVelocity"; + this.Size = new System.Drawing.Size(238, 250); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.contextMenuStrip.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBottom)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTop)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLeft)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBack)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFront)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.NumericUpDown numericUpDownBottom; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NumericUpDown numericUpDownTop; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown numericUpDownRight; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.NumericUpDown numericUpDownLeft; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown numericUpDownBack; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numericUpDownFront; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem resetToolStripMenuItem; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.cs new file mode 100644 index 0000000..49b3985 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + public partial class PanelForParamVelocity : UserControl + { + public PanelForParamVelocity() + { + InitializeComponent(); + } + + private void resetToolStripMenuItem_Click(object sender, EventArgs e) + { + this.numericUpDownBack.Value = 1; + this.numericUpDownFront.Value = 1; + this.numericUpDownLeft.Value = 1; + this.numericUpDownRight.Value = 1; + this.numericUpDownTop.Value = 0; + this.numericUpDownBottom.Value = 0; + } + + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.resx b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.resx new file mode 100644 index 0000000..2d8292b --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForParamVelocity.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/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.Designer.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.Designer.cs new file mode 100644 index 0000000..bd64ba9 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.Designer.cs @@ -0,0 +1,118 @@ +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + partial class PanelForTransitionMatrix + { + /// + /// 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.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + this.dataGridViewForProbaTransition = new System.Windows.Forms.DataGridView(); + this.ColumnForNames = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.resetToNoTransitionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panel = new System.Windows.Forms.Panel(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForProbaTransition)).BeginInit(); + this.contextMenuStrip.SuspendLayout(); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // dataGridViewForProbaTransition + // + this.dataGridViewForProbaTransition.AllowUserToAddRows = false; + this.dataGridViewForProbaTransition.AllowUserToDeleteRows = false; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridViewForProbaTransition.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.dataGridViewForProbaTransition.ColumnHeadersHeight = 28; + this.dataGridViewForProbaTransition.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.ColumnForNames}); + this.dataGridViewForProbaTransition.Location = new System.Drawing.Point(3, 0); + this.dataGridViewForProbaTransition.Name = "dataGridViewForProbaTransition"; + this.dataGridViewForProbaTransition.Size = new System.Drawing.Size(244, 235); + this.dataGridViewForProbaTransition.TabIndex = 0; + // + // ColumnForNames + // + this.ColumnForNames.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + dataGridViewCellStyle2.Format = "N2"; + dataGridViewCellStyle2.NullValue = null; + this.ColumnForNames.DefaultCellStyle = dataGridViewCellStyle2; + this.ColumnForNames.HeaderText = "Probability"; + this.ColumnForNames.Name = "ColumnForNames"; + this.ColumnForNames.Width = 80; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.resetToNoTransitionToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(187, 26); + // + // resetToNoTransitionToolStripMenuItem + // + this.resetToNoTransitionToolStripMenuItem.Name = "resetToNoTransitionToolStripMenuItem"; + this.resetToNoTransitionToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.resetToNoTransitionToolStripMenuItem.Text = "Reset to no transition"; + this.resetToNoTransitionToolStripMenuItem.Click += new System.EventHandler(this.resetToNoTransitionToolStripMenuItem_Click); + // + // panel + // + this.panel.Controls.Add(this.dataGridViewForProbaTransition); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(250, 238); + this.panel.TabIndex = 1; + // + // PanelForTransitionMatrix + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForTransitionMatrix"; + this.Size = new System.Drawing.Size(256, 244); + ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForProbaTransition)).EndInit(); + this.contextMenuStrip.ResumeLayout(false); + this.panel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem resetToNoTransitionToolStripMenuItem; + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.DataGridView dataGridViewForProbaTransition; + private System.Windows.Forms.DataGridViewTextBoxColumn ColumnForNames; + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.cs b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.cs new file mode 100644 index 0000000..d62232a --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Simulator.Classes; + +namespace HCSAnalyzer.Simulator.Forms.NewCellType +{ + public partial class PanelForTransitionMatrix : UserControl + { + FormForSimuGenerator Parent; + + public PanelForTransitionMatrix(FormForSimuGenerator Parent, FormForNewCellType DirectParent) + { + InitializeComponent(); + this.Parent = Parent; + DirectParent.TransitionMatrixGUI = this; + foreach (var item in Parent.ListCellTypes) + { + this.dataGridViewForProbaTransition.Rows.Add(); + this.dataGridViewForProbaTransition.Rows[this.dataGridViewForProbaTransition.Rows.Count - 1].HeaderCell.Value = item.Name; + this.dataGridViewForProbaTransition[0, this.dataGridViewForProbaTransition.Rows.Count - 1].Value = 0; + } + + this.dataGridViewForProbaTransition.Rows.Add(); + this.dataGridViewForProbaTransition.Rows[this.dataGridViewForProbaTransition.Rows.Count - 1].HeaderCell.Value = "New Type"; + this.dataGridViewForProbaTransition[0, this.dataGridViewForProbaTransition.Rows.Count - 1].Value = 1; + + //dataGridViewForProbaTransition.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; + // dataGridViewForProbaTransition.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; + this.dataGridViewForProbaTransition.AutoResizeRowHeadersWidth( DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);//[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; + + } + + + + //public PanelForTransitionMatrix(FormForSimuGenerator Parent, FormForNewCellType DirectParent, cCellType CellType ) + //{ + // InitializeComponent(); + // this.Parent = Parent; + // DirectParent.TransitionMatrixGUI = this; + // foreach (var item in CellType.ListInitialTransitions) + // { + // this.dataGridView.Rows.Add(); + // this.dataGridView.Rows[this.dataGridView.Rows.Count - 1].HeaderCell.Value = item.DestType.Name; + // this.dataGridView[0, this.dataGridView.Rows.Count - 1].Value = item.Value; + // } + //} + + private void resetToNoTransitionToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + + + } +} diff --git a/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.resx b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.resx new file mode 100644 index 0000000..fc53e19 --- /dev/null +++ b/Cell-by-Cell and DB/Simulator/Forms/NewCellType/PanelForTransitionMatrix.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + 17, 17 + + \ No newline at end of file diff --git a/Classes/cExportDatabase.cs b/Cell-by-Cell and DB/cExportDatabase.cs similarity index 100% rename from Classes/cExportDatabase.cs rename to Cell-by-Cell and DB/cExportDatabase.cs diff --git a/Class2.cs b/ClassBase.cs similarity index 94% rename from Class2.cs rename to ClassBase.cs index 99eb08c..809d6b1 100644 --- a/Class2.cs +++ b/ClassBase.cs @@ -6,7 +6,7 @@ namespace HCSAnalyzer { - class Class2 + class ClassBase { /// /// The main entry point for the application. @@ -17,7 +17,6 @@ static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new HCSAnalyzer()); - } diff --git a/ClassDiagram1.cd b/ClassDiagram1.cd deleted file mode 100644 index e3728b6..0000000 --- a/ClassDiagram1.cd +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - AAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAIAAAAAIAA= - Classes\cDRCanalysis.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\cDRCanalysis.cs - - - - - - AAAAAAIAAAAAAAAAAAAAFQAAAAAAAAAAAAAACCAAAAQ= - Classes\cDRCanalysis.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\cDRCanalysis.cs - - - - - - AAAAAEAAAAAAAAAAAAAUAAAAAAAIQAAAQAAAAAAAAEA= - Classes\cDRCanalysis.cs - - - - \ No newline at end of file diff --git a/Classes/Base Classes/Data/cFeedBackMessage.cs b/Classes/Base Classes/Data/cFeedBackMessage.cs new file mode 100644 index 0000000..f657bdf --- /dev/null +++ b/Classes/Base Classes/Data/cFeedBackMessage.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Classes.Base_Classes +{ + public class cFeedBackMessage + { + public bool IsSucceed; + public string Message; + + public cFeedBackMessage(bool IsSucceed) + { + if (!IsSucceed) + { + this.IsSucceed = false; + this.Message = "Fail"; + } + else + { + this.IsSucceed = true; + this.Message = "Success"; + + } + + } + + } +} diff --git a/Classes/Base Classes/Data/cRandomGenerator.cs b/Classes/Base Classes/Data/cRandomGenerator.cs new file mode 100644 index 0000000..396097f --- /dev/null +++ b/Classes/Base Classes/Data/cRandomGenerator.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; + +namespace HCSAnalyzer.Classes.Base_Classes.Data +{ + class cRandomGenerator : cDataGenerator + { + #region Parameters + public int List_Number = 1; + public int Size_List = 100; + public double Min = 0; + public double Max = 100; + #endregion + + + Random RND = new Random(); + cGlobalInfo GlobalInfo; + cExtendedTable ToReturn = null; + + + public cRandomGenerator(cGlobalInfo GlobalInfo) + { + this.GlobalInfo = GlobalInfo; + } + + public cExtendedTable GetOutPut() + { + return this.ToReturn; + } + + public void Run() + { + ToReturn = new cExtendedTable(); + for (int IdxList = 0; IdxList < this.List_Number; IdxList++) + { + + cExtendedList CurrentList = new cExtendedList("List" + IdxList, GlobalInfo.ListCellularPhenotypes[IdxList % GlobalInfo.ListCellularPhenotypes.Count].ColourForDisplay); + + + for (int IdxValue = 0; IdxValue < this.Size_List; IdxValue++) + { + CurrentList.Add(RND.NextDouble() * (Max - Min) + Min); + } + + ToReturn.Add(CurrentList); + } + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmeticOperation.cs b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmeticOperation.cs new file mode 100644 index 0000000..c3db07a --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmeticOperation.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + abstract class cArithmeticOperation : cComponent + { + protected cExtendedTable Input1; + protected cExtendedTable Input2; + + protected cExtendedTable Output; + + public cExtendedTable GetOutPut() + { + return this.Output; + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Abs.cs b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Abs.cs new file mode 100644 index 0000000..343253b --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Abs.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + class cArithmetic_Abs : cArithmeticOperation + { + public cArithmetic_Abs() + { + + } + + + public void SetInputData(cExtendedTable MyData) + { + this.Input1 = MyData; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (this.Input1 == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No Basis defined."; + return FeedBackMessage; + } + + Process(); + + return FeedBackMessage; + } + + void Process() + { + this.Title = "Abs."; + this.Output = new cExtendedTable(this.Input1); + this.Output.Name = "abs(" + this.Input1.Name + ")"; + + for (int Col = 0; Col < this.Input1.Count; Col++) + { + + + for (int Row = 0; Row < this.Input1[0].Count; Row++) + this.Output[Col][Row] = Math.Abs(this.Input1[Col][Row]); + } + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Power.cs b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Power.cs new file mode 100644 index 0000000..056b4d0 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Arithmetic/cArithmetic_Power.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + class cArithmetic_Power : cArithmeticOperation + { + + double Power = 1; + + public cArithmetic_Power() + { + + } + + + public void Set_Power(double Power) + { + this.Power = Power; + } + + public void SetInputData(cExtendedTable MyData) + { + this.Input1 = MyData; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (this.Input1 == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No Basis defined."; + return FeedBackMessage; + } + + Process(); + + return FeedBackMessage; + } + + void Process() + { + this.Title = "Power("+ this.Power +")"; + this.Output = new cExtendedTable(this.Input1); + this.Output.Name = "(" + this.Output.Name + ")^" + this.Power; + + for (int Col = 0; Col < this.Input1.Count; Col++) + for (int Row = 0; Row < this.Input1[0].Count; Row++) + this.Output[Col][Row] = Math.Pow(this.Input1[Col][Row], this.Power); + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cHistogramBuilder.cs b/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cHistogramBuilder.cs new file mode 100644 index 0000000..12f2784 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cHistogramBuilder.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + class cHistogramBuilder : cComponent + { + public cHistogramBuilder() + { + this.Title = "Histogram builder"; + } + + cExtendedTable Input; + cExtendedTable Output; + + public double BinNumber = 100; + public double Min = double.NaN; + public double Max = double.NaN; + + + public void SetInputData(cExtendedTable InputTable) + { + this.Input = InputTable; + } + + public cExtendedTable GetOutPut() + { + return this.Output; + } + + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data."; + return FeedBackMessage; + } + Process(); + + return FeedBackMessage; + } + + void Process() + { + this.Output = new cExtendedTable(); + this.Output.Name = "Histogram (" + this.Input.Name + ")"; + + List Res = null; + + if(double.IsNaN(this.Min)||double.IsNaN(this.Max)) + Res = Input[0].CreateHistogram(this.BinNumber); + else + Res = Input[0].CreateHistogram(this.Min,this.Max,(int)this.BinNumber); + + cExtendedList ListX = new cExtendedList("Value"); + cExtendedList ListY = new cExtendedList("Histogram value"); + + ListX.AddRange(Res[0]); + ListY.AddRange(Res[1]); + + this.Output.Add(ListX); + this.Output.Add(ListY); + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cStatistics.cs b/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cStatistics.cs new file mode 100644 index 0000000..dc5f282 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/ColumnBasedAnalysis/cStatistics.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + class cStatistics : cArithmeticOperation + { + public cStatistics() + { + this.Title = "Statistics"; + } + + + public void SetInputData(cExtendedTable MyData) + { + this.Input1 = MyData; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (this.Input1 == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No Basis defined."; + return FeedBackMessage; + } + if (!IsMAD && !IsMax && !IsMean && !IsMedian && !IsMin && !IsStdDev && !IsSum && !IsCV) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "You have to select at least one statistic value to be computed"; + return FeedBackMessage; + } + Process(); + + return FeedBackMessage; + } + + public bool IsSum = true; + public bool IsMean = true; + public bool IsCV = true; + public bool IsMAD = false; + public bool IsStdDev = true; + public bool IsMedian = true; + public bool IsMin = false; + public bool IsMax = false; + public bool IsSkewness = false; + public bool IsKurtosis = false; + + + + public void UnselectAll() + { + IsSum = false; + IsMean = false; + IsCV = false; + IsMAD = false; + IsStdDev = false; + IsMedian = false; + IsMin = false; + IsMax = false; + IsSkewness = false; + IsKurtosis = false; + } + + void Process() + { + this.Title = "Statistics"; + this.Output = new cExtendedTable(); + this.Output.Name = "Statistics (" + this.Input1.Name + ")"; + + this.Output.ListRowNames = new List(); + + if(IsSum) + this.Output.ListRowNames.Add("Sum"); + if (IsMean) + this.Output.ListRowNames.Add("Mean"); + if (IsStdDev) + this.Output.ListRowNames.Add("StdDev"); + if (IsCV) + this.Output.ListRowNames.Add("CV"); + //if (IsMedian) + // this.Output.ListRowNames.Add("Median"); + //if (IsMAD) + // this.Output.ListRowNames.Add("MAD"); + if (IsMin) + this.Output.ListRowNames.Add("Min"); + if (IsMax) + this.Output.ListRowNames.Add("Max"); + if (IsSkewness) + this.Output.ListRowNames.Add("Skewness"); + if (IsKurtosis) + this.Output.ListRowNames.Add("Kurtosis"); + + + for (int Col = 0; Col < this.Input1.Count; Col++) + { + this.Output.Add(new cExtendedList()); + this.Output[Col].Name = this.Input1[Col].Name; + if (this.Input1[Col].Tag != null) + { + this.Output[Col].Tag = this.Input1[Col].Tag; + } + + if (IsSum) + this.Output[Col].Add(this.Input1[Col].Sum()); + if (IsMean) + this.Output[Col].Add(this.Input1[Col].Mean()); + if (IsStdDev) + this.Output[Col].Add(this.Input1[Col].Std()); + if (IsCV) + this.Output[Col].Add(this.Input1[Col].CV()); + // if (IsMedian) + //this.Output[Col].Add(this.Input1[Col].Med); + //if (IsMAD) + //this.Output[Col].Add(this.Input1[Col].Ma); + if (IsMin) + this.Output[Col].Add(this.Input1[Col].Min()); + if (IsMax) + this.Output[Col].Add(this.Input1[Col].Max()); + if (IsSkewness) + this.Output[Col].Add(this.Input1[Col].Skewness()); + if (IsKurtosis) + this.Output[Col].Add(this.Input1[Col].Kurtosis()); + + } + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Fitting & Regression/cLinearRegression.cs b/Classes/Base Classes/DataAnalysis/Fitting & Regression/cLinearRegression.cs new file mode 100644 index 0000000..d89a698 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Fitting & Regression/cLinearRegression.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cLinearRegression : cComponent + { + cExtendedList ListClass = null; + cExtendedTable Input = null; + cExtendedTable Output; + + public cLinearRegression() + { + this.Title = "Linear regression"; + } + + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage;// = new cFeedBackMessage(); + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data table defined."; + return FeedBackMessage; + } + + // ------------- now proceed ------------- + Process(); + + + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + public cExtendedTable GetOutPut() + { + return this.Output; + } + + private void Process() + { + double[,] DataForLDA = Input.CopyToArray(); + + //double[,] Basis; + //double[] s2; + int Info; + /************************************************************************* + Linear least squares fitting. + + QR decomposition is used to reduce task to MxM, then triangular solver or + SVD-based solver is used depending on condition number of the system. It + allows to maximize speed and retain decent accuracy. + + INPUT PARAMETERS: + Y - array[0..N-1] Function values in N points. + FMatrix - a table of basis functions values, array[0..N-1, 0..M-1]. + FMatrix[I, J] - value of J-th basis function in I-th point. + N - number of points used. N>=1. + M - number of basis functions, M>=1. + + OUTPUT PARAMETERS: + Info - error code: + * -4 internal SVD decomposition subroutine failed (very + rare and for degenerate systems only) + * 1 task is solved + C - decomposition coefficients, array[0..M-1] + Rep - fitting report. Following fields are set: + * Rep.TaskRCond reciprocal of condition number + * R2 non-adjusted coefficient of determination + (non-weighted) + * RMSError rms error on the (X,Y). + * AvgError average error on the (X,Y). + * AvgRelError average relative error on the non-zero Y + * MaxError maximum error + NON-WEIGHTED ERRORS ARE CALCULATED + + ERRORS IN PARAMETERS + + This solver also calculates different kinds of errors in parameters and + fills corresponding fields of report: + * Rep.CovPar covariance matrix for parameters, array[K,K]. + * Rep.ErrPar errors in parameters, array[K], + errpar = sqrt(diag(CovPar)) + * Rep.ErrCurve vector of fit errors - standard deviations of empirical + best-fit curve from "ideal" best-fit curve built with + infinite number of samples, array[N]. + errcurve = sqrt(diag(F*CovPar*F')), + where F is functions matrix. + * Rep.Noise vector of per-point estimates of noise, array[N] + + NOTE: noise in the data is estimated as follows: + * for fitting without user-supplied weights all points are + assumed to have same level of noise, which is estimated from + the data + * for fitting with user-supplied weights we assume that noise + level in I-th point is inversely proportional to Ith weight. + Coefficient of proportionality is estimated from the data. + + NOTE: we apply small amount of regularization when we invert squared + Jacobian and calculate covariance matrix. It guarantees that + algorithm won't divide by zero during inversion, but skews + error estimates a bit (fractional error is about 10^-9). + + However, we believe that this difference is insignificant for + all practical purposes except for the situation when you want + to compare ALGLIB results with "reference" implementation up + to the last significant digit. + + -- ALGLIB -- + Copyright 17.08.2009 by Bochkanov Sergey + *************************************************************************/ + + + double[] weights = null; + int fitResult = 0; + double[] resultData = new double[this.Input[0].Count]; + + //alglib.lsfit.lsfitreport rep = new alglib.lsfit.lsfitreport(); + //alglib.lsfit.lsfitlinear(resultData, DataForLDA, this.Input[0].Count, this.Input.Count, ref fitResult, ref weights, rep); + + //alglib.lsfitstate state; + int info; + //double[] c = new double[] { 0, 0, 0, 0 }; + + + //alglib.lsfitreport Nrep; + //alglib.lsfitresults(state, out info, out c, out Nrep); + + // alglib.fisherldan(DataForLDA, this.Input[0].Count, this.Input.Count - 1, (int)this.Input[this.Input.Count - 1].Max() + 1, out Info, out Basis); + //Output = new cExtendedTable(Basis); + alglib.linearmodel LM = null; + alglib.lrreport Lreport = null; + alglib.lrbuild(DataForLDA, this.Input[0].Count, this.Input.Count-1, out info, out LM, out Lreport); + + //LM.innerobj.w[0] = 1; + + double[] Coeff = null; + int NVars; + + alglib.lrunpack(LM, out Coeff, out NVars); + + cExtendedList CL = new cExtendedList(); + CL.AddRange(Coeff); + CL.Name = "Coefficients"; + + this.Output = new cExtendedTable(CL); + + this.Output.ListRowNames = new List(); + + for (int i = 0; i < this.Output[0].Count; i++) + this.Output.ListRowNames.Add("Coeff_" + i); + + Output.Name = "Linear regression coeff. of (" + this.Input.Name + ")"; + + //foreach (var item in Output) + //{ + // item.ListTags = new List(); + // for (int i = 0; i < Output[0].Count; i++) + // item.ListTags.Add(this.Input[i].Tag); + //} + + + //for (int IdxLDA = 0; IdxLDA < Output.Count; IdxLDA++) + //{ + // Output[IdxLDA].Name = "LDA_" + (IdxLDA + 1); + // Output.ListRowNames.Add(this.Input[IdxLDA].Name); + //} + + + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/Abstract/cMetric.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/Abstract/cMetric.cs new file mode 100644 index 0000000..f4e6ade --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/Abstract/cMetric.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + abstract class cMetric : cComponent + { + protected cExtendedList Input1; + protected cExtendedList Input2; + + protected cExtendedTable Output; + + public cExtendedTable GetOutPut() + { + return this.Output; + } + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelation.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelation.cs new file mode 100644 index 0000000..c385e3e --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelation.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + public enum eCorrelationType { PEARSON, SPEARMAN }; + + class cCorrelation : cMetric + { + eCorrelationType CorrelationType = eCorrelationType.PEARSON; + + public cCorrelation() + { + this.Title = "Correlation"; + } + + public void SetCorrelationType(eCorrelationType Type) + { + this.CorrelationType = Type; + } + + public void Set_Data(cExtendedList Input1, cExtendedList Input2) + { + base.Input1 = Input1; + base.Input2 = Input2; + } + + private void Process() + { + base.Output = new cExtendedTable(); + double Value = double.NaN; + base.Output.ListRowNames = new List(); + base.Output.ListRowNames.Add(base.Input1.Name); + + if (this.CorrelationType == eCorrelationType.PEARSON) + { + base.Output.Name = "Pearson Correlation Coefficient"; + Value = alglib.pearsoncorr2(base.Input1.ToArray(), base.Input2.ToArray()); + } + else if (this.CorrelationType == eCorrelationType.SPEARMAN) + { + base.Output.Name = "Spearman Correlation Coefficient"; + Value = alglib.spearmancorr2(base.Input1.ToArray(), base.Input2.ToArray()); + } + + cExtendedList Result = new cExtendedList(); + Result.Add(Value); + base.Output.Add(Result); + base.Output[0].Name = base.Input2.Name; + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if ((base.Input1 == null) || (base.Input2 == null)) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelationMatrix.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelationMatrix.cs new file mode 100644 index 0000000..8aa33b3 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCorrelationMatrix.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cCorrelationMatrix : cDataAnalysisComponent + { + eCorrelationType CorrelationType = eCorrelationType.PEARSON; + cExtendedTable Input; + cExtendedTable OutPut; + + public cCorrelationMatrix() + { + this.Title = "Correlation"; + } + + public void SetCorrelationType(eCorrelationType Type) + { + this.CorrelationType = Type; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + if (this.CorrelationType == eCorrelationType.PEARSON) + { + this.OutPut.Name = "Pearson Correlation Matrix"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = alglib.pearsoncorr2(this.Input[IdxCol].ToArray(), this.Input[IdxColBis].ToArray()); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + else if (this.CorrelationType == eCorrelationType.SPEARMAN) + { + this.OutPut.Name = "Spearman Correlation Matrix"; + + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = alglib.spearmancorr2(this.Input[IdxCol].ToArray(), this.Input[IdxColBis].ToArray()); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + + } + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCovarianceMatrix.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCovarianceMatrix.cs new file mode 100644 index 0000000..8a6d4c2 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cCovarianceMatrix.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cCovarianceMatrix : cDataAnalysisComponent + { + //eCorrelationType CorrelationType = eCorrelationType.PEARSON; + cExtendedTable Input; + cExtendedTable OutPut; + + public cCovarianceMatrix() + { + this.Title = "Covariance"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + this.OutPut.Name = "Covariance Matrix"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = alglib.cov2(this.Input[IdxCol].ToArray(), this.Input[IdxColBis].ToArray()); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistanceMahalanobis.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistanceMahalanobis.cs new file mode 100644 index 0000000..13af315 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistanceMahalanobis.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using LibPlateAnalysis; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + + + class cDistanceMahalanobis : cDataAnalysisComponent + { + // public eDistances DistanceType = eDistances.EUCLIDEAN; + + cExtendedTable Input; + cExtendedTable OutPut; + cExtendedTable CovarianceMatrix; + + + public cDistanceMahalanobis(cExtendedTable CovarianceMatrix) + { + this.Title = "Mahalanobis Distance"; + this.CovarianceMatrix = CovarianceMatrix; + } + + + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + this.OutPut.Name = "Mahalanobis"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = this.Input[IdxCol].Dist_Euclidean(this.Input[IdxColBis]); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistances.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistances.cs new file mode 100644 index 0000000..f57e188 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDistances.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using LibPlateAnalysis; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + + + class cDistances : cDataAnalysisComponent + { + public eDistances DistanceType = eDistances.EUCLIDEAN; + + cExtendedTable Input; + cExtendedTable OutPut; + + public cDistances() + { + this.Title = "Distance - "; + } + + + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + if (this.DistanceType == eDistances.EUCLIDEAN) + { + this.OutPut.Name = "Euclidean"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = this.Input[IdxCol].Dist_Euclidean(this.Input[IdxColBis]); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + if (this.DistanceType == eDistances.MANHATTAN) + { + this.OutPut.Name = "Manhattan"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = this.Input[IdxCol].Dist_Manhattan(this.Input[IdxColBis]); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + if (this.DistanceType == eDistances.BHATTACHARYYA) + { + this.OutPut.Name = "Bhattacharyya coeff."; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = this.Input[IdxCol].Dist_BhattacharyyaCoefficient(this.Input[IdxColBis]); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + if (this.DistanceType == eDistances.EMD) + { + this.OutPut.Name = "Earth Mover"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + Value = this.Input[IdxCol].Dist_EarthMover(this.Input[IdxColBis]); + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + } + + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDotProduct.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDotProduct.cs new file mode 100644 index 0000000..a8ef650 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cDotProduct.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cDotProduct : cDataAnalysisComponent + { + cExtendedTable Input; + cExtendedTable OutPut; + + public cDotProduct() + { + this.Title = "Dot product"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + this.OutPut.Name = "dot product(s)"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + //if (IdxCol != IdxColBis) + Value = this.Input[IdxCol].DotProduct(this.Input[IdxColBis]); + + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cF-Test.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cF-Test.cs new file mode 100644 index 0000000..95fecf0 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cF-Test.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + + public enum eFTestTails { BOTH, LEFT, RIGHT }; + + + class cTwoSampleFTest : cDataAnalysisComponent + { + cExtendedTable Input; + cExtendedTable OutPut; + public eFTestTails FTestTails = eFTestTails.BOTH; + + public cTwoSampleFTest() + { + this.Title = "Two-Sample F-Test"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + this.OutPut.ListRowNames = new List(); + + this.OutPut.Name = "Two-Sample F-Test"; + + if (FTestTails == eFTestTails.BOTH) + this.OutPut.Name += " (both tails)"; + else if (FTestTails == eFTestTails.LEFT) + this.OutPut.Name += " (left tail)"; + else if (FTestTails == eFTestTails.RIGHT) + this.OutPut.Name += " (right tail)"; + + + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + /************************************************************************* + Two-sample F-test + + This test checks three hypotheses about dispersions of the given samples. + The following tests are performed: + * two-tailed test (null hypothesis - the dispersions are equal) + * left-tailed test (null hypothesis - the dispersion of the first + sample is greater than or equal to the dispersion of the second + sample). + * right-tailed test (null hypothesis - the dispersion of the first + sample is less than or equal to the dispersion of the second sample) + + The test is based on the following assumptions: + * the given samples have normal distributions + * the samples are independent. + + Input parameters: + X - sample 1. Array whose index goes from 0 to N-1. + N - sample size. + Y - sample 2. Array whose index goes from 0 to M-1. + M - sample size. + + Output parameters: + BothTails - p-value for two-tailed test. + If BothTails is less than the given significance level + the null hypothesis is rejected. + LeftTail - p-value for left-tailed test. + If LeftTail is less than the given significance level, + the null hypothesis is rejected. + RightTail - p-value for right-tailed test. + If RightTail is less than the given significance level + the null hypothesis is rejected. + + -- ALGLIB -- + Copyright 19.09.2006 by Bochkanov Sergey + *************************************************************************/ + double bothtails; + double lefttail; + double righttail; + + alglib.ftest(this.Input[IdxCol].ToArray(), this.Input[IdxCol].Count, this.Input[IdxColBis].ToArray(), this.Input[IdxColBis].Count, out bothtails, out lefttail, out righttail); + + if(FTestTails== eFTestTails.BOTH) + NewResult.Add(bothtails); + else if(FTestTails == eFTestTails.LEFT) + NewResult.Add(lefttail); + else if (FTestTails == eFTestTails.RIGHT) + NewResult.Add(righttail); + + + } + this.OutPut.Add(NewResult); + } + + + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + Process(); + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cMineAnalysis.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cMineAnalysis.cs new file mode 100644 index 0000000..5654f5a --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cMineAnalysis.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using analysis; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using LibPlateAnalysis; + +namespace HCSAnalyzer.Classes.DataAnalysis +{ + public class cMineAnalysis : cDataAnalysisComponent + { + #region Private + cExtendedTable Input; + List Output; + #endregion + + #region public parameters + public bool Is_BriefReport = true; + public cScreening CurrentScreening = null; + #endregion + + + + + public cMineAnalysis() + { + this.Title = "MINE Analysis"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + public List GetOutPut() + { + return this.Output; + } + + public void Run() + { + // define names + string[] VarNames = new string[Input.Count]; + double[][] dataset = new double[Input.Count][]; + + int Idx = 0; + foreach (var item in Input) + { + dataset[Idx] = new double[item.Count]; + Array.Copy(item.ToArray(), dataset[Idx], item.Count); + VarNames[Idx++] = item.Name; + } + + //// define data + data.Dataset data_Set = new data.Dataset(dataset, VarNames, 0); + analysis.VarPairQueue Qu = new analysis.VarPairQueue(data_Set); + + for(int Idx_0=0;Idx_0 ListValues = new List(); + List ListIscolor = new List(); + + for (Idx = 0; Idx < res.Length; Idx++) + { + ListValues.Add(res[Idx].toString().Split(',')); + } + string[] ListNames = res[0].getHeader().Split(','); + + this.Output = new List(); + + for (int IdxTest = 2; IdxTest < ListNames.Length; IdxTest++) // loop over all the different type of results + { + // remove useless informations + if (ListNames[IdxTest] == "MI via KDE") continue; + if (ListNames[IdxTest] == "Fisher") continue; + if (ListNames[IdxTest] == "last value") continue; + if (ListNames[IdxTest] == "MAS found at (X)") continue; + if (ListNames[IdxTest] == "MAS found at (Y)") continue; + if (ListNames[IdxTest] == "MICfound at (Y)") continue; + + double[,] TmpTable = new double[VarNames.Length, VarNames.Length]; + + for (int i = 0; i < res.Length; i++) // loop over the different pairs + { + string TmpName0 = res[i].getXVar(); + string TmpName1 = res[i].getYVar(); + int Idx_var0 = 0; + int Idx_var1 = 0; + + for (Idx_var0 = 0; Idx_var0 < VarNames.Length; Idx_var0++) + if(VarNames[Idx_var0]==TmpName0) + break; + + for (Idx_var1 = 0; Idx_var1 < VarNames.Length; Idx_var1++) + if (VarNames[Idx_var1] == TmpName1) + break; + + double Value=0; + double.TryParse(res[i].toString().Split(',')[IdxTest], out Value); + TmpTable[Idx_var0, Idx_var1] = TmpTable[Idx_var1, Idx_var0] = Value; + } + + cExtendedTable NewTable = new cExtendedTable(TmpTable); + NewTable.ListRowNames = new List(); + for (int i = 0; i < VarNames.Length; i++) + { + NewTable.ListRowNames.Add(VarNames[i]); + NewTable[i].Name = VarNames[i]; + + + if (CurrentScreening != null) + { + int IdxDesc = CurrentScreening.ListDescriptors.GetDescriptorIndex(NewTable[i].Name); + if (IdxDesc > -1) + { + NewTable[i].Tag = CurrentScreening.ListDescriptors[IdxDesc]; + } + } + + } + + NewTable.Name = ListNames[IdxTest]; + this.Output.Add(NewTable); + } + + + + } + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Metric & Comparison/cZFactor.cs b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cZFactor.cs new file mode 100644 index 0000000..5b33d8b --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Metric & Comparison/cZFactor.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cZFactor : cDataAnalysisComponent + { + cExtendedTable Input; + cExtendedTable OutPut; + + public cZFactor() + { + this.Title = "Z-Factor"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + private void Process() + { + this.OutPut = new cExtendedTable(); + double Value = double.NaN; + this.OutPut.ListRowNames = new List(); + + this.OutPut.Name = "Z-Factor(s)"; + for (int IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + this.OutPut.ListRowNames.Add(this.Input[IdxCol].Name); + cExtendedList NewResult = new cExtendedList(); + NewResult.Name = this.Input[IdxCol].Name; + for (int IdxColBis = 0; IdxColBis < this.Input.Count; IdxColBis++) + { + if (IdxCol != IdxColBis) + Value = this.Input[IdxCol].ZFactor(this.Input[IdxColBis]); + else + Value = double.NaN; + + //if (double.IsInfinity(Value)) Value = 1; + + NewResult.Add(Value); + } + this.OutPut.Add(NewResult); + } + + } + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Projectors/Apply Projection/cLinearProjector.cs b/Classes/Base Classes/DataAnalysis/Projectors/Apply Projection/cLinearProjector.cs new file mode 100644 index 0000000..7b2fe1b --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Projectors/Apply Projection/cLinearProjector.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using weka.core; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cLinearProjector : cDataAnalysisComponent + { + public cLinearProjector() + { + this.Title = "Linear Projection"; + } + + cExtendedTable Basis = null; + cExtendedTable DataToProject = null; + cExtendedTable ProjectedData = null; + + public void Set_Basis(cExtendedTable Basis) + { + this.Basis = Basis; + } + + public void Set_Input(cExtendedTable DataToProject) + { + this.DataToProject = DataToProject; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (this.Basis == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No Basis defined."; + return FeedBackMessage; + } + if (this.DataToProject == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + // ------------- now proceed ------------- + Project(); + + return FeedBackMessage; + } + + private void Project() + { + Matrix NewPt = new Matrix(this.DataToProject[0].Count, this.DataToProject.Count); + NewPt = DataToProject.CopyToWEKAMatrix().multiply(this.Basis.CopyToWEKAMatrix()); + ProjectedData = new cExtendedTable(NewPt); + + int Idx=0; + foreach (var item in DataToProject) + { + ProjectedData[Idx].Name = Basis.ListRowNames[Idx]; + Idx++; + } + + ProjectedData.ListRowNames.AddRange(DataToProject.ListRowNames); + } + + public cExtendedTable GetOutPut() + { + return this.ProjectedData; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorComp.cs b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorComp.cs new file mode 100644 index 0000000..d633fb5 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorComp.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + public abstract class cProjectorComp : cDataAnalysisComponent + { + protected cExtendedTable NewBasis; + + public cExtendedTable GetOutPut() + { + return this.NewBasis; + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorLDA.cs b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorLDA.cs new file mode 100644 index 0000000..afcb5c3 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorLDA.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cProjectorLDA : cProjectorComp + { + cExtendedList ListClass = null; + cExtendedTable Input = null; + + public cProjectorLDA() + { + this.Title = "LDA projection coefficients"; + } + + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage;// = new cFeedBackMessage(); + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data table defined."; + return FeedBackMessage; + } + + // ------------- now proceed ------------- + Process(); + + if (NewBasis.Count == 0) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "LDA basis construction not achieved.\nCheck your data validity."; + return FeedBackMessage; + + } + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + private void Process() + { + double[,] DataForLDA = Input.CopyToArray(); + + double[,] Basis; + //double[] s2; + int Info; + + /************************************************************************* + N-dimensional multiclass Fisher LDA + + Subroutine finds coefficients of linear combinations which optimally separates + training set on classes. It returns N-dimensional basis whose vector are sorted + by quality of training set separation (in descending order). + + INPUT PARAMETERS: + XY - training set, array[0..NPoints-1,0..NVars]. + First NVars columns store values of independent + variables, next column stores number of class (from 0 + to NClasses-1) which dataset element belongs to. Fractional + values are rounded to nearest integer. + NPoints - training set size, NPoints>=0 + NVars - number of independent variables, NVars>=1 + NClasses - number of classes, NClasses>=2 + + + OUTPUT PARAMETERS: + Info - return code: + * -4, if internal EVD subroutine hasn't converged + * -2, if there is a point with class number + outside of [0..NClasses-1]. + * -1, if incorrect parameters was passed (NPoints<0, + NVars<1, NClasses<2) + * 1, if task has been solved + * 2, if there was a multicollinearity in training set, + but task has been solved. + W - basis, array[0..NVars-1,0..NVars-1] + columns of matrix stores basis vectors, sorted by + quality of training set separation (in descending order) + + -- ALGLIB -- + Copyright 31.05.2008 by Bochkanov Sergey + *************************************************************************/ + // alglib.pcabuildbasis(DataForLDA, MyData[0].Count, MyData.Count, out Info, out s2, out Basis); + alglib.fisherldan(DataForLDA, this.Input[0].Count, this.Input.Count-1, (int)this.Input[this.Input.Count-1].Max()+1, out Info, out Basis); + + + base.NewBasis = new cExtendedTable(Basis); + base.NewBasis.Name = "LDA coeff. values of (" + this.Input.Name + ")"; + + + foreach (var item in base.NewBasis) + { + item.ListTags = new List(); + + for (int i = 0; i < base.NewBasis[0].Count; i++) + { + item.ListTags.Add(this.Input[i].Tag); + } + } + + + for (int IdxLDA = 0; IdxLDA < base.NewBasis.Count; IdxLDA++) + { + NewBasis[IdxLDA].Name = "LDA_" + (IdxLDA + 1); + NewBasis.ListRowNames.Add(this.Input[IdxLDA].Name); + } + + + } + + + } +} diff --git a/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorPCA.cs b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorPCA.cs new file mode 100644 index 0000000..8af0d81 --- /dev/null +++ b/Classes/Base Classes/DataAnalysis/Projectors/Compute Basis/cProjectorPCA.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using weka.core; + + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cProjectorPCA : cProjectorComp + { + cExtendedTable Input = null; + + public cProjectorPCA() + { + this.Title = "PCA projection coefficients"; + } + + public void SetInputData(cExtendedTable MyData) + { + this.Input = MyData; + } + + private void Process() + { + double[,] DataForPCA = Input.CopyToArray(); + + double[,] Basis; + double[] s2; + int Info; + + /************************************************************************* + Principal components analysis + + Subroutine builds orthogonal basis where first axis corresponds to + direction with maximum variance, second axis maximizes variance in subspace + orthogonal to first axis and so on. + + It should be noted that, unlike LDA, PCA does not use class labels. + + INPUT PARAMETERS: + X - dataset, array[0..NPoints-1,0..NVars-1]. + matrix contains ONLY INDEPENDENT VARIABLES. + NPoints - dataset size, NPoints>=0 + NVars - number of independent variables, NVars>=1 + + ---------------------------------------------- + * Info - return code: + * -4, if SVD subroutine haven't converged + * -1, if wrong parameters has been passed (NPoints<0, + NVars<1) + * 1, if task is solved + S2 - array[0..NVars-1]. variance values corresponding + to basis vectors. + V - array[0..NVars-1,0..NVars-1] + matrix, whose columns store basis vectors. + + -- ALGLIB -- + Copyright 25.08.2008 by Bochkanov Sergey + *************************************************************************/ + alglib.pcabuildbasis(DataForPCA, Input[0].Count, Input.Count, out Info, out s2, out Basis); + + base.NewBasis = new cExtendedTable(Basis); + base.NewBasis.Name = "PCA coeff. values of (" + Input.Name + ")"; + + foreach (var item in base.NewBasis) + { + item.ListTags = new List(); + + for (int i = 0; i < base.NewBasis[0].Count; i++) + { + item.ListTags.Add(this.Input[i].Tag); + } + } + + + + for (int IdxPCA = 0; IdxPCA < base.NewBasis.Count; IdxPCA++) + { + NewBasis[IdxPCA].Name = "PCA_"+(IdxPCA+1); + NewBasis.ListRowNames.Add(Input[IdxPCA].Name); + } + + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No Data Table defined."; + return FeedBackMessage; + } + + // ------------- now proceed ------------- + + Process(); + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + } +} diff --git a/Classes/Base Classes/DataManip/cInverse.cs b/Classes/Base Classes/DataManip/cInverse.cs new file mode 100644 index 0000000..bc3de99 --- /dev/null +++ b/Classes/Base Classes/DataManip/cInverse.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataAnalysis +{ + class cInverse : cDataAnalysisComponent + { + cExtendedTable Input; + cExtendedTable OutPut; + public alglib.matinvreport Report; + + public cInverse() + { + this.Title = "Inverse"; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + + public cExtendedTable GetOutPut() + { + return this.OutPut; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + if (this.Input.Count != this.Input[0].Count) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "A square matrix is required for this operation"; + return FeedBackMessage; + } + + + // ------------- now proceed ------------- + int Info; + + double[,] Mat = this.Input.CopyToArray(); + alglib.rmatrixinverse(ref Mat, out Info, out Report); + + if (Info != 1) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "Error while inversing the matrix"; + return FeedBackMessage; + } + + this.OutPut = new cExtendedTable(Mat); + + + if (this.Input.ListRowNames != null) + { + this.OutPut.ListRowNames = new List(); + this.OutPut.ListRowNames.AddRange(this.Input.ListRowNames.ToArray()); + } + + int IdxCOl=0; + foreach (var item in this.Input) + { + this.OutPut[IdxCOl++].Name = item.Name; + } + + + this.OutPut.Name = "Inverse(" + this.Input.Name + ")"; + + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + + } +} diff --git a/Classes/Base Classes/DataManip/cSort.cs b/Classes/Base Classes/DataManip/cSort.cs new file mode 100644 index 0000000..b7eaadb --- /dev/null +++ b/Classes/Base Classes/DataManip/cSort.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.DataProcessing +{ + class cSort : cComponent + { + + class cTmp + { + public double Value; + public int Index; + + public cTmp(double Value, int Idx) + { + this.Value = Value; + this.Index = Idx; + } + } + + public cSort() + { + this.Title = "Sort"; + } + + cExtendedTable Input; + cExtendedTable Output; + + public bool IsAscending = true; + + List RefList = new List(); + + public int ColumnIndexForSorting = 0; + + public cExtendedTable GetOutPut() + { + return this.Output; + } + + public void SetInputData(cExtendedTable Input) + { + this.Input = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input defined."; + return FeedBackMessage; + } + + if (this.ColumnIndexForSorting >= this.Input.Count) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "Sorting column index exceed table size."; + return FeedBackMessage; + } + Process(); + + this.Output = new cExtendedTable(this.Input); + this.Output.Name = "Sorted "+this.Input.Name; + + int IdxCol = 0; + foreach (var item in this.Input) + { + this.Output[IdxCol].Tag = item.Tag; + IdxCol++; + } + + for (IdxCol = 0; IdxCol < this.Input.Count; IdxCol++) + { + for (int IdxRow = 0; IdxRow < RefList.Count; IdxRow++) + this.Output[IdxCol][IdxRow] = this.Input[IdxCol][RefList[IdxRow].Index]; + + if (this.Input[IdxCol].ListTags != null) + { + for (int IdxRow = 0; IdxRow < RefList.Count; IdxRow++) + this.Output[IdxCol].ListTags[IdxRow] = this.Input[IdxCol].ListTags[RefList[IdxRow].Index]; + } + } + + for (int IdxRow = 0; IdxRow < this.Input.ListRowNames.Count; IdxRow++) + this.Output.ListRowNames[IdxRow] = this.Input.ListRowNames[RefList[IdxRow].Index]; + + + + return FeedBackMessage; + } + + void Process() + { + this.Output = new cExtendedTable(); + this.Output.Name = "Sort(" + this.Input.Name + ")"; + + + for (int IDx = 0; IDx < this.Input[ColumnIndexForSorting].Count; IDx++) + { + RefList.Add(new cTmp(this.Input[ColumnIndexForSorting][IDx], IDx)); + } + + if(IsAscending) + RefList.Sort(delegate(cTmp p1, cTmp p2) { return p1.Value.CompareTo(p2.Value); }); + else + RefList.Sort(delegate(cTmp p1, cTmp p2) { return -p1.Value.CompareTo(p2.Value); }); + + + + + //ZFactorList.Sort(delegate(cSimpleSignature p1, cSimpleSignature p2) { return p1.AverageValue.CompareTo(p2.AverageValue); }); + + + // this.Output.ListRowNames = new List(); + + // if (IsSum) + // this.Output.ListRowNames.Add("Sum"); + // if (IsMean) + // this.Output.ListRowNames.Add("Mean"); + // if (IsStdDev) + // this.Output.ListRowNames.Add("StdDev"); + // //if (IsMedian) + // // this.Output.ListRowNames.Add("Median"); + // //if (IsMAD) + // // this.Output.ListRowNames.Add("MAD"); + // if (IsMin) + // this.Output.ListRowNames.Add("Min"); + // if (IsMax) + // this.Output.ListRowNames.Add("Max"); + + + + // for (int Col = 0; Col < this.Input1.Count; Col++) + // { + // this.Output.Add(new cExtendedList()); + // this.Output[Col].Name = this.Input1[Col].Name; + // if (this.Input1[Col].Tag != null) + // { + // this.Output[Col].Tag = this.Input1[Col].Tag; + // } + + // if (IsSum) + // this.Output[Col].Add(this.Input1[Col].Sum()); + // if (IsMean) + // this.Output[Col].Add(this.Input1[Col].Mean()); + // if (IsStdDev) + // this.Output[Col].Add(this.Input1[Col].Std()); + // // if (IsMedian) + // //this.Output[Col].Add(this.Input1[Col].Med); + // //if (IsMAD) + // //this.Output[Col].Add(this.Input1[Col].Ma); + // if (IsMin) + // this.Output[Col].Add(this.Input1[Col].Min()); + // if (IsMax) + // this.Output[Col].Add(this.Input1[Col].Max()); + + + // } + } + + } +} diff --git a/Classes/Base Classes/DataStructures/cExtendedControl.cs b/Classes/Base Classes/DataStructures/cExtendedControl.cs new file mode 100644 index 0000000..6f3fcf5 --- /dev/null +++ b/Classes/Base Classes/DataStructures/cExtendedControl.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.DataStructures +{ + public class cExtendedControl : Control + { + public string Title; + } +} diff --git a/Classes/MiscClasses.cs b/Classes/Base Classes/DataStructures/cExtendedList.cs similarity index 62% rename from Classes/MiscClasses.cs rename to Classes/Base Classes/DataStructures/cExtendedList.cs index 4bce54a..062cd6e 100644 --- a/Classes/MiscClasses.cs +++ b/Classes/Base Classes/DataStructures/cExtendedList.cs @@ -2,60 +2,46 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Collections; -//using Emgu.CV; -//using Emgu.CV.Structure; -//using Emgu.CV.CvEnum; -using System.Runtime.InteropServices; +using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; -namespace HCSAnalyzer.Classes +namespace HCSAnalyzer.Classes.Base_Classes.DataStructures { - - - - public class cInfoClassif - { - public String StringForTree; - public String StringForQuality; - public String ConfusionMatrix; - - } - - - public class cInfoClass + public class cExtendedList : List { - public int[] CorrespondanceTable; - public List ListBackAssociation = new List(); - public int NumberOfClass = 0; - - } + public string Name; + public Color Color = Color.DarkBlue; + public List ListTags = null; + public object Tag = null; - public class cScoreAndClass - { - public double Score; - public int Class; - public cScoreAndClass(int Class, double Score) + public cExtendedList(string Name) { - this.Class = Class; - this.Score = Score; + this.Name = Name; } - } - - public class cInfoDescriptors - { - public int[] CorrespondanceTable; - public List ListBackAssociation = new List(); - } + public cExtendedList(string Name, Color Color) + { + this.Name = Name; + this.Color = Color; + } + public cExtendedList() + { + this.Name = ""; + } - public class cExtendedList : List - { + public bool IsContainNegative() + { + foreach (var item in this) + { + if (item < 0) return true; + } + return false; + } public double Mean() { @@ -65,7 +51,6 @@ public double Mean() return Mean / (double)this.Count; } - public double GetWeightedMean() { double ToReturn = 0; @@ -87,6 +72,29 @@ public double Std() return Math.Sqrt(var / (float)(this.Count - 1)); } + public double CV() + { + double var = 0f, mean = this.Mean(); + foreach (float f in this) var += (f - mean) * (f - mean); + return Math.Sqrt(var / (float)(this.Count - 1))/mean; + } + + public double Skewness() + { + double Skew = 0f, mean = this.Mean(), std = this.Std(); + + foreach (float f in this) Skew += (f - mean) * (f - mean) * (f - mean); + return Skew / ((float)(this.Count - 1)*std*std*std); + } + + public double Kurtosis() + { + double Kurt = 0f, mean = this.Mean(), std = this.Std(); + + foreach (float f in this) Kurt += (f - mean) * (f - mean) * (f - mean)* (f - mean); + return (Kurt / ((float)(this.Count - 1) * std * std * std * std)-3); + } + public cExtendedList Normalize(double Min, double Max) { cExtendedList ToReturn = new cExtendedList(); @@ -104,15 +112,14 @@ public cExtendedList Normalize(double Min, double Max) return ToReturn; } - - public List CreateHistogram(double Min, double Max, double Bin) + public List CreateHistogram(double Min, double Max, double BinSize) { List ToReturn = new List(); //float max = math.Max(data); if (this.Count == 0) return ToReturn; - double step = (Max - Min) / Bin; + double step = (Max - Min) / BinSize; int HistoSize = (int)((Max - Min) / step) + 1; @@ -138,7 +145,43 @@ public List CreateHistogram(double Min, double Max, double Bin) return ToReturn; } - public List CreateHistogram(double Bin) + public List CreateHistogram(double Min, double Max, int NumBin) + { + List ToReturn = new List(); + + double BinSize = (Max - Min) / (double)NumBin; + + //float max = math.Max(data); + if (this.Count == 0) return ToReturn; + + double step = BinSize; + + int HistoSize = NumBin; + + double[] axeX = new double[HistoSize]; + for (int i = 0; i < HistoSize; i++) + { + axeX[i] = Min + i * step; + } + ToReturn.Add(axeX); + + double[] histogram = new double[HistoSize]; + //double RealPos = Min; + + int PosHisto; + foreach (double f in this) + { + PosHisto = (int)((f - Min) / step); + if ((PosHisto >= 0) && (PosHisto < HistoSize)) + histogram[PosHisto]++; + } + ToReturn.Add(histogram); + + return ToReturn; + } + + + public List CreateHistogram(double BinSize) { List ToReturn = new List(); @@ -169,34 +212,32 @@ public List CreateHistogram(double Bin) } - double step = (Max - Min) / Bin; - // int HistoSize = (int)((Max - Min) / step)+1; - - axeX = new double[(int)Bin]; + double step = (Max - Min) / BinSize; + // int HistoSize = (int)((Max - Min) / step)+1; + + axeX = new double[(int)BinSize]; - for (int i = 0; i < (int)Bin; i++) + for (int i = 0; i < (int)BinSize; i++) { axeX[i] = Min + i * step; } ToReturn.Add(axeX); - histogram = new double[(int)Bin]; + histogram = new double[(int)BinSize]; //double RealPos = Min; int PosHisto; foreach (double f in this) { - PosHisto = (int)(((Bin-1)*(f - Min)) / (Max-Min)); - // if ((PosHisto >= 0) && (PosHisto < Bin)) - histogram[PosHisto]++; + PosHisto = (int)(((BinSize - 1) * (f - Min)) / (Max - Min)); + // if ((PosHisto >= 0) && (PosHisto < Bin)) + histogram[PosHisto]++; } ToReturn.Add(histogram); return ToReturn; } - - //public List CreateHistogram(double Bins) //{ // List ToReturn = new List(); @@ -218,7 +259,7 @@ public List CreateHistogram(double Bin) // if (Max == Min) // { - + // axeX.Add(Max); // ToReturn.Add(axeX); // histogram.Add(Max * this.Count); @@ -275,6 +316,27 @@ public double Min() } + public double Dist_Mahalanobis(cExtendedList CompareTo, cExtendedTable TransitionMatrix) + { + if (CompareTo.Count != this.Count) return -1; + if ((CompareTo.Count != TransitionMatrix.Count) || (CompareTo.Count != TransitionMatrix[0].Count)) return -1; + + cExtendedList TmpVector = new cExtendedList(); + + for (int i = 0; i < this.Count; i++) + { + double TMpValue = 0; + for (int j = 0; j < this.Count; j++) + { + TMpValue+= TransitionMatrix[j][i] * CompareTo[j]; + } + TmpVector.Add(TMpValue); + } + + return this.Dist_Euclidean(TmpVector); + } + + public double Dist_Euclidean(cExtendedList CompareTo) { double Res = 0; @@ -306,7 +368,7 @@ public double Dist_Manhattan(cExtendedList CompareTo) public double Dist_VectorCosine(cExtendedList CompareTo) { - + if (CompareTo.Count != this.Count) return -1; double Top = 0; @@ -322,9 +384,9 @@ public double Dist_VectorCosine(cExtendedList CompareTo) } - double Bottom = Math.Sqrt(Bottom1)*Math.Sqrt(Bottom2); + double Bottom = Math.Sqrt(Bottom1) * Math.Sqrt(Bottom2); - if(Bottom<=0) return -1; + if (Bottom <= 0) return -1; double ToReturn = 1 - (Top / Bottom); @@ -332,12 +394,41 @@ public double Dist_VectorCosine(cExtendedList CompareTo) } + public double ZFactor(cExtendedList CompareTo) + { + double Mean2 = CompareTo.Mean(); + double Mean1 = this.Mean(); + + double ZScore=0; + + if (Mean2 != Mean1) + ZScore = 1 - 3 * (this.Std() + CompareTo.Std()) / (Math.Abs( Mean1 - Mean2)); + else + ZScore = double.NaN; + + return ZScore; + } + + public double DotProduct(cExtendedList CompareTo) + { + if(this.Count!=CompareTo.Count) return double.NaN; + + double DotProduct = 0; + + for (int i = 0; i < this.Count; i++) + { + DotProduct += this[i] * CompareTo[i]; + } + + + return DotProduct; + } public double Dist_BhattacharyyaCoefficient(cExtendedList CompareTo) { double Res = 0; if (CompareTo.Count != this.Count) return -1; - + for (int i = 0; i < this.Count; i++) { Res += Math.Sqrt(this[i] * CompareTo[i]); @@ -346,12 +437,11 @@ public double Dist_BhattacharyyaCoefficient(cExtendedList CompareTo) return Res; } - - public double Dist_EarthMover(cExtendedList CompareTo) { Matrix Signature1 = new Matrix(this.Count, 2); Matrix Signature2 = new Matrix(CompareTo.Count, 2); + for (int Idx = 0; Idx < this.Count; Idx++) { @@ -365,11 +455,13 @@ public double Dist_EarthMover(cExtendedList CompareTo) double ResutatEMD; ResutatEMD = CvInvoke.cvCalcEMD2(Signature1.Ptr, Signature2.Ptr, DIST_TYPE.CV_DIST_L1, null, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); - return ResutatEMD; + //Emgu.CV.Structure.MCvPoint2D64f - } + return ResutatEMD; + + } } } diff --git a/Classes/Base Classes/DataStructures/cExtendedTable.cs b/Classes/Base Classes/DataStructures/cExtendedTable.cs new file mode 100644 index 0000000..40e0b5a --- /dev/null +++ b/Classes/Base Classes/DataStructures/cExtendedTable.cs @@ -0,0 +1,275 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Data; +using HCSAnalyzer.Classes.General; + +namespace HCSAnalyzer.Classes.Base_Classes.DataStructures +{ + public class cExtendedTable : List + { + public string Name = "New Table"; + public List ListRowNames = new List(); + + public double[,] CopyToArray() + { + double[,] ToReturn = new double[this[0].Count, this.Count]; + for (int Row = 0; Row < this[0].Count; Row++) + { + for (int Col = 0; Col < this.Count; Col++) + { + ToReturn[Row, Col] = this[Col][Row]; + } + } + return ToReturn; + } + + public weka.core.Matrix CopyToWEKAMatrix() + { + weka.core.Matrix MatrixToBeReturned = new weka.core.Matrix(this[0].Count, this.Count); + + for (int Col = 0; Col < this.Count; Col++) + for (int Row = 0; Row < this[0].Count; Row++) + MatrixToBeReturned.addElement(Row, Col, this[Col][Row]); + + return MatrixToBeReturned; + } + + public cExtendedTable() + { + + } + + public cExtendedTable(cExtendedTable Source) + { + this.Name = Source.Name + "_Copy"; + foreach (var item in Source) + { + + cExtendedList NewCol = new cExtendedList(); + + NewCol.Name = item.Name; + NewCol.AddRange(item); + this.Add(NewCol); + + + if (item.Tag != null) + { + this[0].Tag = new object(); + this[0].Tag = item.Tag; + + + + } + + if (item.ListTags != null) + { + this[this.Count - 1].ListTags = new List(); + this[this.Count - 1].ListTags.AddRange(item.ListTags); + } + } + + this.ListRowNames.AddRange(Source.ListRowNames); + } + + public cExtendedTable(cExtendedList Source) + { + this.Name = Source.Name + "_Copy"; + cExtendedList NewCol = new cExtendedList(); + NewCol.Name = Source.Name; + NewCol.AddRange(Source); + this.Add(NewCol); + + if (Source.ListTags != null) + { + this[0].ListTags = new List(); + this[0].ListTags.AddRange(Source.ListTags); + } + + //this.ListRowNames.AddRange(Source.ListRowNames); + } + + public cExtendedTable(double[,] Table) + { + int NumRow = Table.GetLength(0); + int NumCol = Table.GetLength(1); + + for (int Col = 0; Col < NumCol; Col++) + { + cExtendedList NewCol = new cExtendedList(); + for (int Row = 0; Row < NumRow; Row++) + { + NewCol.Add(Table[Row, Col]); + } + this.Add(NewCol); + } + } + + public cExtendedTable(weka.core.Matrix Table) + { + int NumRow = Table.numRows(); + int NumCol = Table.numColumns(); + + for (int Col = 0; Col < NumCol; Col++) + { + cExtendedList NewCol = new cExtendedList(); + for (int Row = 0; Row < NumRow; Row++) + { + NewCol.Add(Table.getElement(Row, Col)); + } + this.Add(NewCol); + } + } + + public cExtendedTable(DataTable Table) + { + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + //cExtendedTable ListValueDesc = new cExtendedTable(); + + for (int i = 0; i < Table.Columns.Count; i++) this.Add(new cExtendedList()); + for (int i = 0; i < Table.Columns.Count; i++) this[i].Name = Table.Columns[i].ColumnName; + + // loop on all the plate + for (int RowIdx = 0; RowIdx < Table.Rows.Count; RowIdx++) + { + for (int ColIdx = 0; ColIdx < Table.Columns.Count; ColIdx++) + this[ColIdx].Add((double)Table.Rows[RowIdx][ColIdx]); + } + //return ListValueDesc; + } + + /// + /// Build a table containing the well values + /// + /// List of the wells + /// Required to take into account the selected descriptors + public cExtendedTable(List ListWell, bool OnlySelectedDescriptors) + { + if (ListWell.Count == 0) return; + + foreach (var Desc in ListWell[0].Parent.ListDescriptors) + { + if (Desc.IsActive()) + { + cExtendedList NewList = new cExtendedList(Desc.GetName()); + + this.Add(NewList); + this[this.Count - 1].Tag = Desc; + } + } + + cExtendedList Values; + int IdxWell =0; + foreach (cWell CurrentWell in ListWell) + { + Values = CurrentWell.GetAverageValuesList(OnlySelectedDescriptors); + ListRowNames.Add(CurrentWell.Name); + + for (int i = 0; i < Values.Count; i++) + this[i].Add(Values[i]); + + IdxWell++; + } + + // in this specific case, we can add the tags + for(int i=0;i(); + + for(int j=0;j= this[0].Count) return null; + + cExtendedList ToReturn = new cExtendedList(); + for (int i = 0; i < this.Count; i++) + { + ToReturn.Add(this[i][Idx]); + } + + ToReturn.Name = this.Name + "_Row_" + Idx; + return ToReturn; + } + + public cExtendedTable(List ListWell, int IdxDesc) + { + cExtendedList NewList = new cExtendedList(ListWell[0].Parent.ListDescriptors[IdxDesc].GetName()); + this.Add(NewList); + + foreach (cWell CurrentWell in ListWell) + { + double Value = CurrentWell.ListDescriptors[IdxDesc].GetValue(); + ListRowNames.Add(CurrentWell.Name); + + this[0].Add(Value); + } + + // in this specific case, we can add the tags + for (int i = 0; i < this.Count; i++) + { + this[i].ListTags = new List(); + + for (int j = 0; j < ListWell.Count; j++) + this[i].ListTags.Add(ListWell[j]); + } + } + + public cExtendedTable(List ListWell, int IdxDesc, cExtendedList ListActiveClasses) + { + cExtendedList NewList = new cExtendedList(ListWell[0].Parent.ListDescriptors[IdxDesc].GetName()); + this.Add(NewList); + + foreach (cWell CurrentWell in ListWell) + { + if ((CurrentWell.GetClassIdx() >= 0)&&(ListActiveClasses[CurrentWell.GetClassIdx()]==1)) + { + double Value = CurrentWell.ListDescriptors[IdxDesc].GetValue(); + ListRowNames.Add(CurrentWell.Name); + + this[0].Add(Value); + } + } + + // in this specific case, we can add the tags + for (int i = 0; i < this.Count; i++) + { + this[i].ListTags = new List(); + + for (int j = 0; j < ListWell.Count; j++) + { + if((ListWell[j].GetClassIdx()>=0)&&(ListActiveClasses[ListWell[j].GetClassIdx()]==1)) + this[i].ListTags.Add(ListWell[j]); + } + } + } + + + public double Max() + { + cExtendedList ListMaxima = new cExtendedList(); + + foreach (var item in this) + ListMaxima.Add(item.Max()); + + return ListMaxima.Max(); + } + + public double Min() + { + cExtendedList ListMinima = new cExtendedList(); + + foreach (var item in this) + ListMinima.Add(item.Min()); + + return ListMinima.Min(); + + } + + } +} diff --git a/Classes/Base Classes/DataStructures/cExtendedValue.cs b/Classes/Base Classes/DataStructures/cExtendedValue.cs new file mode 100644 index 0000000..6828bd9 --- /dev/null +++ b/Classes/Base Classes/DataStructures/cExtendedValue.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Classes.Base_Classes.DataStructures +{ + public class cExtendedValue + { + public object Tag; + public double Value; + + } +} diff --git a/Classes/Base Classes/GUI/FormForSingleSlider.Designer.cs b/Classes/Base Classes/GUI/FormForSingleSlider.Designer.cs new file mode 100644 index 0000000..616c16f --- /dev/null +++ b/Classes/Base Classes/GUI/FormForSingleSlider.Designer.cs @@ -0,0 +1,92 @@ +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + partial class FormForSingleSlider + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForSingleSlider)); + this.buttonOk = new System.Windows.Forms.Button(); + this.trackBar = new System.Windows.Forms.TrackBar(); + this.numericUpDown = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown)).BeginInit(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(191, 81); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(81, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + // + // trackBar + // + this.trackBar.Location = new System.Drawing.Point(12, 24); + this.trackBar.Maximum = 100; + this.trackBar.Name = "trackBar"; + this.trackBar.Size = new System.Drawing.Size(173, 45); + this.trackBar.TabIndex = 1; + this.trackBar.Value = 10; + this.trackBar.Scroll += new System.EventHandler(this.trackBar_Scroll); + // + // numericUpDown + // + this.numericUpDown.Location = new System.Drawing.Point(191, 24); + this.numericUpDown.Name = "numericUpDown"; + this.numericUpDown.Size = new System.Drawing.Size(81, 20); + this.numericUpDown.TabIndex = 2; + this.numericUpDown.ValueChanged += new System.EventHandler(this.numericUpDown_ValueChanged); + // + // FormForSingleSlider + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 111); + this.Controls.Add(this.numericUpDown); + this.Controls.Add(this.trackBar); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForSingleSlider"; + ((System.ComponentModel.ISupportInitialize)(this.trackBar)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + public System.Windows.Forms.TrackBar trackBar; + public System.Windows.Forms.NumericUpDown numericUpDown; + } +} \ No newline at end of file diff --git a/Classes/Base Classes/GUI/FormForSingleSlider.cs b/Classes/Base Classes/GUI/FormForSingleSlider.cs new file mode 100644 index 0000000..75f9f08 --- /dev/null +++ b/Classes/Base Classes/GUI/FormForSingleSlider.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + public partial class FormForSingleSlider : Form + { + public FormForSingleSlider(string Title) + { + InitializeComponent(); + this.Text = Title; + } + + private void trackBar_Scroll(object sender, EventArgs e) + { + this.numericUpDown.Value = this.trackBar.Value; + } + + private void numericUpDown_ValueChanged(object sender, EventArgs e) + { + this.trackBar.Value = (int)this.numericUpDown.Value; + } + } +} diff --git a/Forms/FormClassification.resx b/Classes/Base Classes/GUI/FormForSingleSlider.resx similarity index 100% rename from Forms/FormClassification.resx rename to Classes/Base Classes/GUI/FormForSingleSlider.resx diff --git a/Classes/Base Classes/GUI/FormForXYMinMax.Designer.cs b/Classes/Base Classes/GUI/FormForXYMinMax.Designer.cs new file mode 100644 index 0000000..e423f3a --- /dev/null +++ b/Classes/Base Classes/GUI/FormForXYMinMax.Designer.cs @@ -0,0 +1,238 @@ +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + partial class FormForXYMinMax + { + /// + /// Variable nécessaire au concepteur. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + /// true si les ressources managées doivent être supprimées ; sinon, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur Windows Form + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForXYMinMax)); + this.buttonOk = new System.Windows.Forms.Button(); + this.groupBoxX = new System.Windows.Forms.GroupBox(); + this.numericUpDownXMin = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownXMax = new System.Windows.Forms.NumericUpDown(); + this.groupBoxY = new System.Windows.Forms.GroupBox(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownYMax = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownYMin = new System.Windows.Forms.NumericUpDown(); + this.groupBoxX.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownXMin)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownXMax)).BeginInit(); + this.groupBoxY.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownYMax)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownYMin)).BeginInit(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(196, 104); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(81, 23); + this.buttonOk.TabIndex = 1; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + // + // groupBoxX + // + this.groupBoxX.Controls.Add(this.label2); + this.groupBoxX.Controls.Add(this.numericUpDownXMax); + this.groupBoxX.Controls.Add(this.label1); + this.groupBoxX.Controls.Add(this.numericUpDownXMin); + this.groupBoxX.Location = new System.Drawing.Point(9, 8); + this.groupBoxX.Name = "groupBoxX"; + this.groupBoxX.Size = new System.Drawing.Size(131, 90); + this.groupBoxX.TabIndex = 2; + this.groupBoxX.TabStop = false; + this.groupBoxX.Text = "X"; + // + // numericUpDownXMin + // + this.numericUpDownXMin.DecimalPlaces = 2; + this.numericUpDownXMin.Location = new System.Drawing.Point(40, 21); + this.numericUpDownXMin.Maximum = new decimal(new int[] { + -559939585, + 902409669, + 54, + 0}); + this.numericUpDownXMin.Minimum = new decimal(new int[] { + -559939585, + 902409669, + 54, + -2147483648}); + this.numericUpDownXMin.Name = "numericUpDownXMin"; + this.numericUpDownXMin.Size = new System.Drawing.Size(81, 20); + this.numericUpDownXMin.TabIndex = 3; + this.numericUpDownXMin.ValueChanged += new System.EventHandler(this.numericUpDownXMin_ValueChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(7, 23); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(27, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Min."; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(7, 55); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(30, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Max."; + // + // numericUpDownXMax + // + this.numericUpDownXMax.DecimalPlaces = 2; + this.numericUpDownXMax.Location = new System.Drawing.Point(40, 53); + this.numericUpDownXMax.Maximum = new decimal(new int[] { + -559939585, + 902409669, + 54, + 0}); + this.numericUpDownXMax.Minimum = new decimal(new int[] { + -559939585, + 902409669, + 54, + -2147483648}); + this.numericUpDownXMax.Name = "numericUpDownXMax"; + this.numericUpDownXMax.Size = new System.Drawing.Size(81, 20); + this.numericUpDownXMax.TabIndex = 5; + this.numericUpDownXMax.ValueChanged += new System.EventHandler(this.numericUpDownXMax_ValueChanged); + // + // groupBoxY + // + this.groupBoxY.Controls.Add(this.label3); + this.groupBoxY.Controls.Add(this.numericUpDownYMax); + this.groupBoxY.Controls.Add(this.label4); + this.groupBoxY.Controls.Add(this.numericUpDownYMin); + this.groupBoxY.Location = new System.Drawing.Point(146, 8); + this.groupBoxY.Name = "groupBoxY"; + this.groupBoxY.Size = new System.Drawing.Size(131, 90); + this.groupBoxY.TabIndex = 7; + this.groupBoxY.TabStop = false; + this.groupBoxY.Text = "Y"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(7, 55); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(30, 13); + this.label3.TabIndex = 6; + this.label3.Text = "Max."; + // + // numericUpDownYMax + // + this.numericUpDownYMax.DecimalPlaces = 2; + this.numericUpDownYMax.Location = new System.Drawing.Point(40, 53); + this.numericUpDownYMax.Maximum = new decimal(new int[] { + -559939585, + 902409669, + 54, + 0}); + this.numericUpDownYMax.Minimum = new decimal(new int[] { + -559939585, + 902409669, + 54, + -2147483648}); + this.numericUpDownYMax.Name = "numericUpDownYMax"; + this.numericUpDownYMax.Size = new System.Drawing.Size(81, 20); + this.numericUpDownYMax.TabIndex = 5; + this.numericUpDownYMax.ValueChanged += new System.EventHandler(this.numericUpDownYMax_ValueChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(7, 23); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(27, 13); + this.label4.TabIndex = 4; + this.label4.Text = "Min."; + // + // numericUpDownYMin + // + this.numericUpDownYMin.DecimalPlaces = 2; + this.numericUpDownYMin.Location = new System.Drawing.Point(40, 21); + this.numericUpDownYMin.Maximum = new decimal(new int[] { + -559939585, + 902409669, + 54, + 0}); + this.numericUpDownYMin.Minimum = new decimal(new int[] { + -559939585, + 902409669, + 54, + -2147483648}); + this.numericUpDownYMin.Name = "numericUpDownYMin"; + this.numericUpDownYMin.Size = new System.Drawing.Size(81, 20); + this.numericUpDownYMin.TabIndex = 3; + this.numericUpDownYMin.ValueChanged += new System.EventHandler(this.numericUpDownYMin_ValueChanged); + // + // FormForXYMinMax + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(286, 133); + this.Controls.Add(this.groupBoxY); + this.Controls.Add(this.groupBoxX); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForXYMinMax"; + this.Text = "(X,Y) min-max"; + this.groupBoxX.ResumeLayout(false); + this.groupBoxX.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownXMin)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownXMax)).EndInit(); + this.groupBoxY.ResumeLayout(false); + this.groupBoxY.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownYMax)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownYMin)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.GroupBox groupBoxX; + private System.Windows.Forms.Label label2; + public System.Windows.Forms.NumericUpDown numericUpDownXMax; + private System.Windows.Forms.Label label1; + public System.Windows.Forms.NumericUpDown numericUpDownXMin; + private System.Windows.Forms.GroupBox groupBoxY; + private System.Windows.Forms.Label label3; + public System.Windows.Forms.NumericUpDown numericUpDownYMax; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDownYMin; + } +} \ No newline at end of file diff --git a/Classes/Base Classes/GUI/FormForXYMinMax.cs b/Classes/Base Classes/GUI/FormForXYMinMax.cs new file mode 100644 index 0000000..a1c5157 --- /dev/null +++ b/Classes/Base Classes/GUI/FormForXYMinMax.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + public partial class FormForXYMinMax : Form + { + public FormForXYMinMax() + { + InitializeComponent(); + } + + private void numericUpDownXMin_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownXMax.Value < numericUpDownXMin.Value) numericUpDownXMax.Value = numericUpDownXMin.Value; + } + + private void numericUpDownXMax_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownXMax.Value < numericUpDownXMin.Value) numericUpDownXMax.Value = numericUpDownXMin.Value; + } + + private void numericUpDownYMin_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownYMax.Value < numericUpDownYMin.Value) numericUpDownYMax.Value = numericUpDownYMin.Value; + } + + private void numericUpDownYMax_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownYMax.Value < numericUpDownYMin.Value) numericUpDownYMax.Value = numericUpDownYMin.Value; + } + } +} diff --git a/Forms/FormDendogram.resx b/Classes/Base Classes/GUI/FormForXYMinMax.resx similarity index 100% rename from Forms/FormDendogram.resx rename to Classes/Base Classes/GUI/FormForXYMinMax.resx diff --git a/Classes/Base Classes/GUI/cComponentGUI.cs b/Classes/Base Classes/GUI/cComponentGUI.cs new file mode 100644 index 0000000..ccbe23f --- /dev/null +++ b/Classes/Base Classes/GUI/cComponentGUI.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + public abstract class cComponentGUI : cComponent + { + + } +} diff --git a/Classes/Base Classes/GUI/cGUI_2ClassesSelection.cs b/Classes/Base Classes/GUI/cGUI_2ClassesSelection.cs new file mode 100644 index 0000000..798eb67 --- /dev/null +++ b/Classes/Base Classes/GUI/cGUI_2ClassesSelection.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Forms; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + class cGUI_2ClassesSelection : cComponentGUI + { + + public cGUI_2ClassesSelection() + { + this.Title = "GUI - 2 Classes selection"; + } + + public eClassType ClassType = eClassType.WELL; + cExtendedTable ListSelectedClass = null; + + + public cExtendedTable GetOutPut() + { + return this.ListSelectedClass; + } + + public cFeedBackMessage Run(cGlobalInfo GlobalInfo) + { + FormForDisplay WindowToDisplay = new FormForDisplay(); + WindowToDisplay.Text = "2 Classes Selection"; + WindowToDisplay.FormBorderStyle = FormBorderStyle.FixedSingle; + + PanelForClassSelection ClassSelectionPanel1 = new PanelForClassSelection(GlobalInfo, false, this.ClassType); + ClassSelectionPanel1.UnSelectAll(); + ClassSelectionPanel1.Select(0); + ClassSelectionPanel1.Location = new System.Drawing.Point(10, 10); + ClassSelectionPanel1.Width = 140; + ClassSelectionPanel1.Height = ClassSelectionPanel1.ListRadioButtons.Count*25; + ClassSelectionPanel1.BorderStyle = BorderStyle.Fixed3D; + + + PanelForClassSelection ClassSelectionPanel2 = new PanelForClassSelection(GlobalInfo, false, this.ClassType); + ClassSelectionPanel2.UnSelectAll(); + ClassSelectionPanel2.Select(1); + ClassSelectionPanel2.Location = new System.Drawing.Point(10 + ClassSelectionPanel1.Width, 10); + ClassSelectionPanel2.Width = 140; + ClassSelectionPanel2.Height = ClassSelectionPanel1.ListRadioButtons.Count * 25; + ClassSelectionPanel2.BorderStyle = BorderStyle.Fixed3D; + + + + + Button ReturnButton = new Button(); + ReturnButton.Text = "Ok"; + ReturnButton.DialogResult = DialogResult.OK; + ReturnButton.Location = new System.Drawing.Point(ClassSelectionPanel1.Location.X, ClassSelectionPanel1.Location.Y + ClassSelectionPanel1.Height + 5); + WindowToDisplay.Controls.Add(ReturnButton); + + WindowToDisplay.Controls.Add(ClassSelectionPanel1); + WindowToDisplay.Controls.Add(ClassSelectionPanel2); + WindowToDisplay.Width = ClassSelectionPanel1.Width + ClassSelectionPanel2.Width + 28; + WindowToDisplay.Height = ClassSelectionPanel1.Height + ReturnButton.Height+ 48; + + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (WindowToDisplay.ShowDialog() != System.Windows.Forms.DialogResult.OK) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "Selection aborded !"; + return FeedBackMessage; + } + + List ListBool1 = ClassSelectionPanel1.GetListSelectedClass(); + List ListBool2 = ClassSelectionPanel2.GetListSelectedClass(); + + int NumSelected = 0; + this.ListSelectedClass = new cExtendedTable(); + + foreach (var item in ListBool1) + { + this.ListSelectedClass.Add(new cExtendedList()); + if (item) + { + this.ListSelectedClass[0].Add(1); + NumSelected++; + } + else + this.ListSelectedClass[0].Add(0); + } + foreach (var item in ListBool2) + { + this.ListSelectedClass.Add(new cExtendedList()); + if (item) + { + this.ListSelectedClass[1].Add(1); + NumSelected++; + } + else + this.ListSelectedClass[1].Add(0); + } + + + return FeedBackMessage; + + } + + + } +} diff --git a/Classes/Base Classes/GUI/cGUI_ListClasses.cs b/Classes/Base Classes/GUI/cGUI_ListClasses.cs new file mode 100644 index 0000000..267eb49 --- /dev/null +++ b/Classes/Base Classes/GUI/cGUI_ListClasses.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Forms; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + public enum eClassType { WELL, PHENOTYPE }; + + + class cGUI_ListClasses : cComponentGUI + { + + public bool IsCheckBoxes = true; + public bool IsSelectAll = false; + public eClassType ClassType = eClassType.WELL; + + public cGUI_ListClasses() + { + this.Title = "GUI - Classes selection"; + } + + cExtendedList ListSelectedClass = null; + + public cExtendedList GetOutPut() + { + return this.ListSelectedClass; + } + + public cFeedBackMessage Run(cGlobalInfo GlobalInfo) + { + FormForDisplay WindowToDisplay = new FormForDisplay(); + WindowToDisplay.Text = "Class Selection"; + WindowToDisplay.FormBorderStyle = FormBorderStyle.FixedSingle; + + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, this.IsCheckBoxes, this.ClassType); + + //ClassSelectionPanel.Height = WindowToDisplay.Height; + if (this.IsSelectAll && this.IsCheckBoxes) + { + ClassSelectionPanel.SelectAll(); + } + else + { + ClassSelectionPanel.UnSelectAll(); + ClassSelectionPanel.Select(0); + ClassSelectionPanel.Select(1); + } + ClassSelectionPanel.Location = new System.Drawing.Point(10, 10); + ClassSelectionPanel.Width = 150; + + if(IsCheckBoxes) + ClassSelectionPanel.Height = ClassSelectionPanel.ListCheckBoxes.Count*25; + else + ClassSelectionPanel.Height = ClassSelectionPanel.ListRadioButtons.Count * 25; + ClassSelectionPanel.BorderStyle = BorderStyle.Fixed3D; + // MyPanel.Controls.Add(ClassSelectionPanel); + + + + Button ReturnButton = new Button(); + ReturnButton.Text = "Ok"; + ReturnButton.DialogResult = DialogResult.OK; + ReturnButton.Location = new System.Drawing.Point(ClassSelectionPanel.Location.X, ClassSelectionPanel.Location.Y + ClassSelectionPanel.Height + 5); + WindowToDisplay.Controls.Add(ReturnButton); + + WindowToDisplay.Controls.Add(ClassSelectionPanel); + WindowToDisplay.Width = ClassSelectionPanel.Width + 28; + WindowToDisplay.Height = ClassSelectionPanel.Height + ReturnButton.Height+ 48; + + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (WindowToDisplay.ShowDialog() != System.Windows.Forms.DialogResult.OK) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "Selection aborded !"; + return FeedBackMessage; + } + + List ListBool = ClassSelectionPanel.GetListSelectedClass(); + + int NumSelected = 0; + this.ListSelectedClass=new cExtendedList(); + foreach (var item in ListBool) + { + if (item) + { + this.ListSelectedClass.Add(1); + NumSelected++; + } + else + this.ListSelectedClass.Add(0); + } + + if (NumSelected==0) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No class selected !"; + return FeedBackMessage; + } + + + return FeedBackMessage; + + } + + + } +} diff --git a/Classes/Base Classes/GUI/cGUI_ListSingleClasse.cs b/Classes/Base Classes/GUI/cGUI_ListSingleClasse.cs new file mode 100644 index 0000000..de80bf3 --- /dev/null +++ b/Classes/Base Classes/GUI/cGUI_ListSingleClasse.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; + +namespace HCSAnalyzer.Classes.Base_Classes.GUI +{ + public class cGUI_ListSingleClasse : cComponentGUI + { + + public cGUI_ListSingleClasse() + { + this.Title = "GUI - Classes selection"; + } + + + cExtendedList ListSelectedClass = null; + + public cExtendedList GetOutPut() + { + return this.ListSelectedClass; + } + + public bool IsCheckBoxes = true; + public eClassType ClassType = eClassType.WELL; + + public cFeedBackMessage Run(cGlobalInfo GlobalInfo) + { + FormForDisplay WindowToDisplay = new FormForDisplay(); + WindowToDisplay.Text = "Class Selection"; + WindowToDisplay.FormBorderStyle = FormBorderStyle.FixedSingle; + + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, this.IsCheckBoxes, this.ClassType); + //ClassSelectionPanel.Height = WindowToDisplay.Height; + ClassSelectionPanel.UnSelectAll(); + ClassSelectionPanel.Select(0); + ClassSelectionPanel.Select(1); + ClassSelectionPanel.Location = new System.Drawing.Point(10, 10); + ClassSelectionPanel.Width = 150; + ClassSelectionPanel.Height = ClassSelectionPanel.ListCheckBoxes.Count * 25; + ClassSelectionPanel.BorderStyle = BorderStyle.Fixed3D; + // MyPanel.Controls.Add(ClassSelectionPanel); + + Button ReturnButton = new Button(); + ReturnButton.Text = "Ok"; + ReturnButton.DialogResult = DialogResult.OK; + ReturnButton.Location = new System.Drawing.Point(ClassSelectionPanel.Location.X, ClassSelectionPanel.Location.Y + ClassSelectionPanel.Height + 5); + WindowToDisplay.Controls.Add(ReturnButton); + + WindowToDisplay.Controls.Add(ClassSelectionPanel); + WindowToDisplay.Width = ClassSelectionPanel.Width + 28; + WindowToDisplay.Height = ClassSelectionPanel.Height + ReturnButton.Height + 48; + + cFeedBackMessage FeedBackMessage = new cFeedBackMessage(true); + + if (WindowToDisplay.ShowDialog() != System.Windows.Forms.DialogResult.OK) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "Selection aborded !"; + return FeedBackMessage; + } + + List ListBool = ClassSelectionPanel.GetListSelectedClass(); + + int NumSelected = 0; + this.ListSelectedClass = new cExtendedList(); + foreach (var item in ListBool) + { + if (item) + { + this.ListSelectedClass.Add(1); + NumSelected++; + } + else + this.ListSelectedClass.Add(0); + } + + if (NumSelected == 0) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No class selected !"; + return FeedBackMessage; + } + + + return FeedBackMessage; + + } + } +} diff --git a/Classes/Base Classes/General/cLookUpTable.cs b/Classes/Base Classes/General/cLookUpTable.cs new file mode 100644 index 0000000..b7b1ab9 --- /dev/null +++ b/Classes/Base Classes/General/cLookUpTable.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Classes.Base_Classes.General +{ + class cLookUpTable + { + + public byte[][] LUT_HSV = { new byte[]{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,246,240,234,228,222,216,210,204,198,192,186,180,174,168,162,156,150,144,138,132,126,120,114,108,102,96,90,84,78,72,66,60,54,48,42,36,30,24,18,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,204,210,216,222,228,234,240,246,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,204,210,216,222,228,234,240,246,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,246,240,234,228,222,216,210,204,198,192,186,180,174,168,162,156,150,144,138,132,126,120,114,108,102,96,90,84,78,72,66,60,54,48,42,36,30,24,18,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,204,210,216,222,228,234,240,246,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,246,240,234,228,222,216,210,204,198,192,186,180,174,168,162,156,150,144,138,132,126,120,114,108,102,96,90,84,78,72,66,60,54,48,42,36,30,24,18,12,6,0}}; + + public byte[][] LUT_FIRE = { new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,148,150,152,154,156,158,160,162,163,164,166,167,168,170,171,173,174,175,177,178,179,181,182,184,185,186,188,189,190,192,193,195,196,198,199,201,202,204,205,207,208,209,210,212,213,214,215,217,218,220,221,223,224,226,227,229,230,231,233,234,235,237,238,240,241,243,244,246,247,249,250,252,252,252,253,253,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,5,7,8,10,12,14,16,19,21,24,27,29,32,35,37,40,43,46,48,51,54,57,59,62,65,68,70,73,76,79,81,84,87,90,92,95,98,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133,134,136,138,140,141,143,145,147,148,150,152,154,155,157,159,161,162,164,166,168,169,171,173,175,176,178,180,182,184,186,188,190,191,193,195,197,199,201,203,205,206,208,210,212,213,215,217,219,220,222,224,226,228,230,232,234,235,237,239,241,242,244,246,248,248,249,250,251,252,253,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{31,34,38,42,46,49,53,57,61,65,69,74,78,82,87,91,96,100,104,108,113,117,121,125,130,134,138,143,147,151,156,160,165,168,171,175,178,181,185,188,192,195,199,202,206,209,213,216,220,220,221,222,223,224,225,226,227,224,222,220,218,216,214,212,210,206,202,199,195,191,188,184,181,177,173,169,166,162,158,154,151,147,143,140,136,132,129,125,122,118,114,111,107,103,100,96,93,89,85,82,78,74,71,67,64,60,56,53,49,45,42,38,35,31,27,23,20,16,12,8,5,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,13,17,21,26,30,35,42,50,58,66,74,82,90,98,105,113,121,129,136,144,152,160,167,175,183,191,199,207,215,223,227,231,235,239,243,247,251,255,255,255,255,255,255,255,255}}; + + public byte[][] LUT_GREEN_TO_RED = {new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181,183,185,187,189,191,193,195,197,199,201,203,205,207,209,211,213,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247,249,251,253,255}, + new byte[]{255,253,251,249,247,245,243,241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,45,43,41,39,37,35,33,31,29,27,25,23,21,19,17,15,13,11,9,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + + public byte[][] LUT_JET = {new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128}, + new byte[]{0,0,0,0,0,0,0,0,16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0,0,0,0,0,0,0,0,0}, + new byte[]{143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + public byte[][] LUT_HOT = {new byte[]{11,21,32,43,53,64,74,85,96,106,117,128,138,149,159,170,181,191,202,213,223,234,244,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,21,32,43,53,64,74,85,96,106,117,128,138,149,159,170,181,191,202,213,223,234,244,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255}}; + + public byte[][] LUT_COOL = {new byte[]{0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}, + new byte[]{255,251,247,243,239,235,231,227,223,219,215,210,206,202,198,194,190,186,182,178,174,170,166,162,158,154,150,146,142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,81,77,73,69,65,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0}, + new byte[]{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}}; + public byte[][] LUT_SPRING = {new byte[]{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}, + new byte[]{255,251,247,243,239,235,231,227,223,219,215,210,206,202,198,194,190,186,182,178,174,170,166,162,158,154,150,146,142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,81,77,73,69,65,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0}}; + public byte[][] LUT_SUMMER = {new byte[]{0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}, + new byte[]{128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247,249,251,253,255}, + new byte[]{102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102}}; + public byte[][] LUT_AUTOMN = {new byte[]{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}, + new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + public byte[][] LUT_WINTER = {new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + new byte[]{0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255}, + new byte[]{255,253,251,249,247,245,243,241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,210,208,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128}}; + public byte[][] LUT_BONE = {new byte[]{0,4,7,11,14,18,21,25,28,32,35,39,43,46,50,53,57,60,64,67,71,74,78,81,85,89,92,96,99,103,106,110,113,117,120,124,128,131,135,138,142,145,149,152,156,159,163,166,172,178,183,189,194,200,205,211,216,222,227,233,238,244,249,255}, + new byte[]{0,4,7,11,14,18,21,25,28,32,35,39,43,46,50,53,57,60,64,67,71,74,78,81,86,91,96,101,106,111,116,120,125,130,135,140,145,150,155,159,164,169,174,179,184,189,193,198,202,205,209,213,216,220,223,227,230,234,237,241,244,248,251,255}, + new byte[]{1,6,11,16,21,26,31,35,40,45,50,55,60,65,70,74,79,84,89,94,99,104,108,113,117,120,124,128,131,135,138,142,145,149,152,156,159,163,166,170,174,177,181,184,188,191,195,198,202,205,209,213,216,220,223,227,230,234,237,241,244,248,251,255}}; + public byte[][] LUT_COPPER = {new byte[]{0,5,10,15,20,25,30,35,40,46,51,56,61,66,71,76,81,86,91,96,101,106,111,116,121,126,132,137,142,147,152,157,162,167,172,177,182,187,192,197,202,207,212,218,223,228,233,238,243,248,253,255,255,255,255,255,255,255,255,255,255,255,255,255}, + new byte[]{0,3,6,9,13,16,19,22,25,28,32,35,38,41,44,47,51,54,57,60,63,66,70,73,76,79,82,85,89,92,95,98,101,104,108,111,114,117,120,123,126,130,133,136,139,142,145,149,152,155,158,161,164,168,171,174,177,180,183,187,190,193,196,199}, + new byte[]{0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127}}; + + public byte[][] LUT_LINEAR = {new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}, + new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}, + new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}}; + + + + } +} diff --git a/Classes/Base Classes/Viewers/1D/cChart1DBoxPlot.cs b/Classes/Base Classes/Viewers/1D/cChart1DBoxPlot.cs new file mode 100644 index 0000000..347a21f --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cChart1DBoxPlot.cs @@ -0,0 +1,284 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + + public class cChart1DBoxPlot : cGraphGeneral + { + protected ToolStripMenuItem SpecificContextMenu = null; + + FormForSingleSlider SliderForMarkerSize = new FormForSingleSlider("Marker Size"); + FormForSingleSlider SliderForOpacity = new FormForSingleSlider("Marker Opacity"); + public int Opacity = 255; + public int MarkerSize = 10; + + public cChart1DBoxPlot() + { + base.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AssociatedChart_MouseClick); + } + + public void Run() + { + this.SliderForMarkerSize.trackBar.Value = this.MarkerSize; + this.SliderForMarkerSize.numericUpDown.Value = this.MarkerSize; + this.SliderForOpacity.numericUpDown.Maximum = this.SliderForOpacity.trackBar.Maximum = 255; + this.SliderForOpacity.trackBar.Value = this.Opacity; + this.SliderForOpacity.numericUpDown.Value = this.Opacity; + + for (int IdxSerie = 0; IdxSerie < input.Count; IdxSerie++) + { + Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + + + NewSerie.ChartType = SeriesChartType.BoxPlot; + NewSerie["BoxPlotShowMedian"] = "true"; + NewSerie["BoxPlotShowAverage"] = "true"; + NewSerie["BoxPlotShowUnusualValues"] = "true"; + + + //Chart1.Series["Series1"]["BoxPlotShowMedian"] = "false"; + //Chart1.Series["Series1"]["BoxPlotShowAverage"] = "false"; + + + //for (int j = 0; j < this.input[IdxSerie].Count; j++) + { + //this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay); + DataPoint DP = new DataPoint(); + // double[] Value = new double[1]; + // Value[0] = this.input[IdxSerie][j]; + DP.YValues = this.input[IdxSerie].ToArray(); + + // NewSerie.YValuesPerPoint = 6; + + //NewSerie.Points.DataBindY(this.input[IdxSerie].ToArray()); + + + + + // Specify data series name for the Box Plot. + // Chart1.Series["BoxPlotSeries"]["BoxPlotSeries"] = "DataSeries"; + + + DP.XValue = IdxSerie; + + DP.MarkerSize = this.MarkerSize; + DP.MarkerStyle = MarkerStyle.Circle; + + if (IsBorder) + { + DP.MarkerBorderColor = Color.Black; + DP.MarkerBorderWidth = 1; + } + + //if (this.input[IdxSerie].ListTags != null) + //{ + // if (j >= this.input[IdxSerie].ListTags.Count) continue; + // DP.Tag = this.input[IdxSerie].ListTags[j]; + + // if (DP.Tag.GetType() == typeof(cWell)) + // { + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cWell)(DP.Tag)).GetShortInfo() + Value[0]; + // } + // if (DP.Tag.GetType() == typeof(cDescriptorsType)) + // { + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cDescriptorsType)(DP.Tag)).GetShortInfo() + Value[0]; + // DP.AxisLabel = ((cDescriptorsType)(DP.Tag)).GetName(); + // base.CurrentChartArea.AxisX.Interval = 1; + + // } + // if (DP.Tag.GetType() == typeof(cPlate)) + // { + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cPlate)(DP.Tag)).Name + " : " + Value[0]; + // DP.AxisLabel = ((cPlate)(DP.Tag)).Name; + // base.CurrentChartArea.AxisX.Interval = 1; + + // } + + //} + NewSerie.Points.Add(DP); + // if (Input[idxCol].ListTags != null) + //NewSerie.Points[IdxValue].Tag = Input[idxCol].ListTags[idxRow]; + // if (this.IsDisplayValues) CurrentSeries.Points[IdxValue].Label = Value.ToString("N2");// string.Format("{0:0.###}", Math.Abs(Value)); + //this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize; + } + base.CurrentSeries.Add(NewSerie); + } + base.Run(); + } + + + public ToolStripMenuItem GetContextMenu() + { + SpecificContextMenu = new ToolStripMenuItem("Graph Options"); + + + //SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_ChartOpacity = new ToolStripMenuItem("Opacity"); + ToolStripMenuItem_ChartOpacity.Click += new System.EventHandler(this.ToolStripMenuItem_ChartOpacity); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartOpacity); + + ToolStripMenuItem ToolStripMenuItem_MarkerSize = new ToolStripMenuItem("Marker Size"); + ToolStripMenuItem_MarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_MarkerSize); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSize); + + return this.SpecificContextMenu; + } + + + + private void ToolStripMenuItem_MarkerSize(object sender, EventArgs e) + { + if (this.SliderForMarkerSize.ShowDialog() != DialogResult.OK) return; + this.MarkerSize = (int)this.SliderForMarkerSize.numericUpDown.Value; + + for (int j = 0; j < this.input.Count; j++) + { + foreach (var item in this.Series[j].Points) + item.MarkerSize = this.MarkerSize; + } + } + + private void ToolStripMenuItem_ChartOpacity(object sender, EventArgs e) + { + if (this.SliderForOpacity.ShowDialog() != DialogResult.OK) return; + this.Opacity = (int)this.SliderForOpacity.numericUpDown.Value; + + + for (int j = 0; j < this.input.Count; j++) + foreach (var item in this.Series[j].Points) + { + Color C = item.Color; + item.Color = Color.FromArgb(this.Opacity, C); + } + + } + + + + + private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Clicks != 1) return; + + if (e.Button != MouseButtons.Right) return; + + ContextMenuStrip NewMenu = new ContextMenuStrip(); + foreach (var item in base.GetContextMenu(e)) + NewMenu.Items.Add(item); + NewMenu.Items.Add(this.GetContextMenu()); + + #region Selection process + double MaxX = this.ChartAreas[0].CursorX.SelectionEnd; + double MinX = this.ChartAreas[0].CursorX.SelectionStart; + + if (MaxX < MinX) + { + MinX = this.ChartAreas[0].CursorX.SelectionEnd; + MaxX = this.ChartAreas[0].CursorX.SelectionStart; + } + + double MaxY = this.ChartAreas[0].CursorY.SelectionEnd; + double MinY = this.ChartAreas[0].CursorY.SelectionStart; + + if (MaxY < MinY) + { + MinY = this.ChartAreas[0].CursorY.SelectionEnd; + MaxY = this.ChartAreas[0].CursorY.SelectionStart; + } + + //cListWell ListWells = new cListWell(); + List LDP = new List(); + + foreach (DataPoint item in this.Series[0].Points) + { + if ((item.XValue >= MinX) && (item.XValue <= MaxX) && (item.YValues[0] >= MinY) && (item.YValues[0] <= MaxY)) + { + if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWell))) + { + // ListWells.Add((cWell)(item.Tag)); + LDP.Add(item); + + //((cWell)(item.Tag)).SetClass(5); + //item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + } + } + + if (LDP.Count > 0) + { + ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("List " + LDP.Count + " wells"); + ToolStripMenuItem ToolStripMenuItem_ChangeClass = new ToolStripMenuItem("Classes"); + //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + cWell TmpWell = (cWell)(LDP[0].Tag); + + for (int i = 0; i < TmpWell.Parent.GlobalInfo.ListWellClasses.Count; i++) + { + ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(TmpWell.Parent.GlobalInfo.ListWellClasses[i].Name); + ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + ToolStripMenuItem_NewClass.Tag = LDP; + ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + } + NewMenu.Items.Add(SpecificContextMenu); + } + #endregion + + NewMenu.DropShadowEnabled = true; + NewMenu.Show(Control.MousePosition); + } + + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + ToolStripMenuItem ParentMenu = (ToolStripMenuItem)(sender); + int Classe = 0; + int ResultClasse = -1; + + List DP = (List)(ParentMenu.Tag); + + + foreach (var Class in ((cWell)(DP[0].Tag)).Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + + Classe++; + } + + foreach (var item in DP) + { + ((cWell)(item.Tag)).SetClass(ResultClasse); + item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + + ((cWell)(DP[0].Tag)).Parent.GetCurrentDisplayPlate().DisplayDistribution(((cWell)(DP[0].Tag)).Parent.ListDescriptors.CurrentSelectedDescriptorIdx, false); + + } + + + + + } + +} diff --git a/Classes/Base Classes/Viewers/1D/cChart1DGraph.cs b/Classes/Base Classes/Viewers/1D/cChart1DGraph.cs new file mode 100644 index 0000000..f4f7b75 --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cChart1DGraph.cs @@ -0,0 +1,312 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + + public class cChart1DGraph : cGraphGeneral + { + protected ToolStripMenuItem SpecificContextMenu = null; + public bool IsLine = false; + public bool IsBar = false; + public bool ISPoint = true; + FormForSingleSlider SliderForMarkerSize = new FormForSingleSlider("Marker Size"); + FormForSingleSlider SliderForOpacity = new FormForSingleSlider("Marker Opacity"); + public int Opacity = 255; + public int MarkerSize = 10; + + public cChart1DGraph() + { + base.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AssociatedChart_MouseClick); + } + + public void Run() + { + this.SliderForMarkerSize.trackBar.Value = this.MarkerSize; + this.SliderForMarkerSize.numericUpDown.Value = this.MarkerSize; + this.SliderForOpacity.numericUpDown.Maximum = this.SliderForOpacity.trackBar.Maximum = 255; + this.SliderForOpacity.trackBar.Value = this.Opacity; + this.SliderForOpacity.numericUpDown.Value = this.Opacity; + + for (int IdxSerie = 0; IdxSerie < input.Count; IdxSerie++) + { + Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + + + if (ISPoint) + NewSerie.ChartType = SeriesChartType.Point; + if (IsLine) + NewSerie.ChartType = SeriesChartType.Line; + if (IsBar) + NewSerie.ChartType = SeriesChartType.Column; + + for (int j = 0; j < this.input[IdxSerie].Count; j++) + { + //this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay); + DataPoint DP = new DataPoint(); + double[] Value = new double[1]; + Value[0] = this.input[IdxSerie][j]; + DP.YValues = Value; + DP.XValue = j; + + DP.MarkerSize = this.MarkerSize; + DP.MarkerStyle = MarkerStyle.Circle; + + if (IsBorder) + { + DP.MarkerBorderColor = Color.Black; + DP.MarkerBorderWidth = 1; + } + + if (this.input[IdxSerie].ListTags != null) + { + if (j >= this.input[IdxSerie].ListTags.Count) continue; + DP.Tag = this.input[IdxSerie].ListTags[j]; + + if (DP.Tag.GetType() == typeof(cWell)) + { + DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cWell)(DP.Tag)).GetShortInfo() + Value[0]; + } + if (DP.Tag.GetType() == typeof(cDescriptorsType)) + { + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cDescriptorsType)(DP.Tag)).GetShortInfo() + Value[0]; + DP.AxisLabel = ((cDescriptorsType)(DP.Tag)).GetName(); + base.CurrentChartArea.AxisX.Interval = 1; + + } + if (DP.Tag.GetType() == typeof(cPlate)) + { + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cPlate)(DP.Tag)).Name + " : " + Value[0]; + DP.AxisLabel = ((cPlate)(DP.Tag)).Name; + base.CurrentChartArea.AxisX.Interval = 1; + + } + + } + NewSerie.Points.Add(DP); + // if (Input[idxCol].ListTags != null) + //NewSerie.Points[IdxValue].Tag = Input[idxCol].ListTags[idxRow]; + // if (this.IsDisplayValues) CurrentSeries.Points[IdxValue].Label = Value.ToString("N2");// string.Format("{0:0.###}", Math.Abs(Value)); + //this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize; + } + base.CurrentSeries.Add(NewSerie); + } + base.Run(); + } + + #region Context Menu + public ToolStripMenuItem GetContextMenu() + { + SpecificContextMenu = new ToolStripMenuItem("Graph Options"); + + ToolStripMenuItem ToolStripMenuItem_ChartLine = new ToolStripMenuItem("Line"); + ToolStripMenuItem_ChartLine.CheckOnClick = true; + ToolStripMenuItem_ChartLine.Click += new System.EventHandler(this.ToolStripMenuItem_ChartLine); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartLine); + + ToolStripMenuItem ToolStripMenuItem_ChartBar = new ToolStripMenuItem("Bar"); + ToolStripMenuItem_ChartBar.CheckOnClick = true; + ToolStripMenuItem_ChartBar.Click += new System.EventHandler(this.ToolStripMenuItem_ChartBar); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartBar); + + ToolStripMenuItem ToolStripMenuItem_ChartPoint = new ToolStripMenuItem("Point"); + ToolStripMenuItem_ChartPoint.CheckOnClick = true; + ToolStripMenuItem_ChartPoint.Click += new System.EventHandler(this.ToolStripMenuItem_ChartPoint); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartPoint); + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_ChartOpacity = new ToolStripMenuItem("Opacity"); + ToolStripMenuItem_ChartOpacity.Click += new System.EventHandler(this.ToolStripMenuItem_ChartOpacity); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartOpacity); + + ToolStripMenuItem ToolStripMenuItem_MarkerSize = new ToolStripMenuItem("Marker Size"); + ToolStripMenuItem_MarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_MarkerSize); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSize); + + return this.SpecificContextMenu; + } + + private void ToolStripMenuItem_MarkerSize(object sender, EventArgs e) + { + if (this.SliderForMarkerSize.ShowDialog() != DialogResult.OK) return; + this.MarkerSize = (int)this.SliderForMarkerSize.numericUpDown.Value; + + for (int j = 0; j < this.input.Count; j++) + { + foreach (var item in this.Series[j].Points) + item.MarkerSize = this.MarkerSize; + } + } + + private void ToolStripMenuItem_ChartOpacity(object sender, EventArgs e) + { + if (this.SliderForOpacity.ShowDialog() != DialogResult.OK) return; + this.Opacity = (int)this.SliderForOpacity.numericUpDown.Value; + + + for (int j = 0; j < this.input.Count; j++) + foreach (var item in this.Series[j].Points) + { + Color C = item.Color; + item.Color = Color.FromArgb(this.Opacity, C); + } + + } + + private void ToolStripMenuItem_ChartBar(object sender, EventArgs e) + { + IsBar = !IsBar; + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Column; + } + base.Update(); + } + + private void ToolStripMenuItem_ChartPoint(object sender, EventArgs e) + { + ISPoint = !ISPoint; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Point; + + foreach (var item in base.CurrentSeries[IdxSerie].Points) + { + item.MarkerStyle = MarkerStyle.Circle; + } + } + base.Update(); + } + + private void ToolStripMenuItem_ChartLine(object sender, EventArgs e) + { + IsLine = !IsLine; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Line; + } + base.Update(); + } + + private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Clicks != 1) return; + + if (e.Button != MouseButtons.Right) return; + + ContextMenuStrip NewMenu = new ContextMenuStrip(); + foreach (var item in base.GetContextMenu(e)) + NewMenu.Items.Add(item); + NewMenu.Items.Add(this.GetContextMenu()); + + #region Selection process + double MaxX = this.ChartAreas[0].CursorX.SelectionEnd; + double MinX = this.ChartAreas[0].CursorX.SelectionStart; + + if (MaxX < MinX) + { + MinX = this.ChartAreas[0].CursorX.SelectionEnd; + MaxX = this.ChartAreas[0].CursorX.SelectionStart; + } + + double MaxY = this.ChartAreas[0].CursorY.SelectionEnd; + double MinY = this.ChartAreas[0].CursorY.SelectionStart; + + if (MaxY < MinY) + { + MinY = this.ChartAreas[0].CursorY.SelectionEnd; + MaxY = this.ChartAreas[0].CursorY.SelectionStart; + } + + //cListWell ListWells = new cListWell(); + List LDP = new List(); + + foreach (DataPoint item in this.Series[0].Points) + { + if ((item.XValue >= MinX) && (item.XValue <= MaxX) && (item.YValues[0] >= MinY) && (item.YValues[0] <= MaxY)) + { + if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWell))) + { + // ListWells.Add((cWell)(item.Tag)); + LDP.Add(item); + + //((cWell)(item.Tag)).SetClass(5); + //item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + } + } + + if (LDP.Count > 0) + { + ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("List " + LDP.Count + " wells"); + ToolStripMenuItem ToolStripMenuItem_ChangeClass = new ToolStripMenuItem("Classes"); + //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + cWell TmpWell = (cWell)(LDP[0].Tag); + + for (int i = 0; i < TmpWell.Parent.GlobalInfo.ListWellClasses.Count; i++) + { + ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(TmpWell.Parent.GlobalInfo.ListWellClasses[i].Name); + ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + ToolStripMenuItem_NewClass.Tag = LDP; + ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + } + NewMenu.Items.Add(SpecificContextMenu); + } + #endregion + + NewMenu.DropShadowEnabled = true; + NewMenu.Show(Control.MousePosition); + } + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + ToolStripMenuItem ParentMenu = (ToolStripMenuItem)(sender); + int Classe = 0; + int ResultClasse = -1; + + List DP = (List)(ParentMenu.Tag); + + foreach (var Class in ((cWell)(DP[0].Tag)).Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + Classe++; + } + + foreach (var item in DP) + { + ((cWell)(item.Tag)).SetClass(ResultClasse); + item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + ((cWell)(DP[0].Tag)).Parent.GetCurrentDisplayPlate().DisplayDistribution(((cWell)(DP[0].Tag)).Parent.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + #endregion + } + +} diff --git a/Classes/Base Classes/Viewers/1D/cChart1DHistogram.cs b/Classes/Base Classes/Viewers/1D/cChart1DHistogram.cs new file mode 100644 index 0000000..ef43350 --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cChart1DHistogram.cs @@ -0,0 +1,450 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; +using HCSAnalyzer.Classes.Base_Classes.DataProcessing; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + + public class cChart1DHistogram : cGraphGeneral + { + protected ToolStripMenuItem SpecificContextMenu = null; + public bool IsLine = false; + public bool IsBar = false; + public bool ISPoint = true; + FormForSingleSlider SliderForMarkerSize = new FormForSingleSlider("Marker Size"); + FormForSingleSlider SliderForMarkerSizeBinSize = new FormForSingleSlider("Bin number"); + FormForSingleSlider SliderForOpacity = new FormForSingleSlider("Marker Opacity"); + public int Opacity = 255; + public int MarkerSize = 10; + public int BinNumber = 100; + + + + public cChart1DHistogram() + { + base.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AssociatedChart_MouseClick); + base.IsZoomableX = true; + base.IsZoomableY = false; + } + + + + + void Refresh() + { + + base.CurrentSeries.Clear(); + + + + + for (int IdxSerie = 0; IdxSerie < input.Count; IdxSerie++) + { + Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name + "_Histogram"); + + cHistogramBuilder HB = new cHistogramBuilder(); + HB.SetInputData(new cExtendedTable(input[IdxSerie])); + HB.BinNumber = this.BinNumber; + + HB.Run(); + + cExtendedTable CurrentHistogram = HB.GetOutPut(); + + //if (ISPoint) + // NewSerie.ChartType = SeriesChartType.Point; + //if (IsLine) + // NewSerie.ChartType = SeriesChartType.Line; + //if (IsBar) + // NewSerie.ChartType = SeriesChartType.Column; + + NewSerie.ChartType = SeriesChartType.Column; + + + + + for (int j = 0; j < CurrentHistogram[0].Count; j++) + { + //this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay); + DataPoint DP = new DataPoint(); + double[] Value = new double[1]; + Value[0] = CurrentHistogram[1][j]; + DP.YValues = Value; + if (Value[0] == 0) continue; + DP.XValue = CurrentHistogram[0][j]; + DP.Tag = CurrentHistogram[0].Tag; + + // DP.MarkerSize = this.MarkerSize; + // DP.MarkerStyle = MarkerStyle.Circle; + + if (IsBorder) + { + DP.MarkerBorderColor = Color.Black; + DP.MarkerBorderWidth = 1; + DP.BorderColor = Color.Black; + DP.BorderWidth = 1; + } + else + { + DP.BorderWidth = 0; + DP.MarkerBorderWidth = 0; + } + + if (input[IdxSerie].Tag != null) + { + //if (j >= this.input[0].ListTags.Count) continue; + + if (input[IdxSerie].Tag.GetType() == typeof(cWellClass)) + { + DP.Color = ((cWellClass)(input[IdxSerie].Tag)).ColourForDisplay; + DP.ToolTip = ((cWellClass)(input[IdxSerie].Tag)).Name + "\n"; + } + //DP.Tag = this.input[0].ListTags[j]; + + //if (DP.Tag.GetType() == typeof(cWell)) + //{ + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cWell)(DP.Tag)).GetShortInfo() + Value[0]; + //} + //if (DP.Tag.GetType() == typeof(cDescriptorsType)) + //{ + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cDescriptorsType)(DP.Tag)).GetShortInfo() + Value[0]; + // DP.AxisLabel = ((cDescriptorsType)(DP.Tag)).GetName(); + // base.CurrentChartArea.AxisX.Interval = 1; + + //} + //if (DP.Tag.GetType() == typeof(cPlate)) + //{ + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cPlate)(DP.Tag)).Name + " : " + Value[0]; + // DP.AxisLabel = ((cPlate)(DP.Tag)).Name; + // base.CurrentChartArea.AxisX.Interval = 1; + + //} + + } + + DP.ToolTip += DP.XValue.ToString("N2") + " :\n" + DP.YValues[0]; + + NewSerie.Points.Add(DP); + // if (Input[idxCol].ListTags != null) + //NewSerie.Points[IdxValue].Tag = Input[idxCol].ListTags[idxRow]; + // if (this.IsDisplayValues) CurrentSeries.Points[IdxValue].Label = Value.ToString("N2");// string.Format("{0:0.###}", Math.Abs(Value)); + //this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize; + } + base.CurrentSeries.Add(NewSerie); + } + base.Update(); + + + } + + + + public void Run() + { + this.SliderForMarkerSize.trackBar.Value = this.MarkerSize; + this.SliderForMarkerSize.numericUpDown.Value = this.MarkerSize; + this.SliderForOpacity.numericUpDown.Maximum = this.SliderForOpacity.trackBar.Maximum = 255; + this.SliderForOpacity.trackBar.Value = this.Opacity; + this.SliderForOpacity.numericUpDown.Value = this.Opacity; + + this.SliderForMarkerSizeBinSize.numericUpDown.Maximum = this.SliderForMarkerSizeBinSize.trackBar.Maximum = 1000; + this.SliderForMarkerSizeBinSize.trackBar.Value = this.BinNumber; + this.SliderForMarkerSizeBinSize.numericUpDown.Value = this.BinNumber; + + base.IsYAxis = true; + base.IsBorder = true; + + this.Refresh(); + + base.Run(); + base.CurrentTitle.Text = "Histogram(" + base.CurrentTitle.Text + ")"; + } + + + public ToolStripMenuItem GetContextMenu() + { + SpecificContextMenu = new ToolStripMenuItem("Graph Options"); + + ToolStripMenuItem ToolStripMenuItem_ChartLine = new ToolStripMenuItem("Line"); + ToolStripMenuItem_ChartLine.CheckOnClick = true; + ToolStripMenuItem_ChartLine.Click += new System.EventHandler(this.ToolStripMenuItem_ChartLine); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartLine); + + ToolStripMenuItem ToolStripMenuItem_ChartBar = new ToolStripMenuItem("Column"); + ToolStripMenuItem_ChartBar.CheckOnClick = true; + ToolStripMenuItem_ChartBar.Click += new System.EventHandler(this.ToolStripMenuItem_ChartBar); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartBar); + + ToolStripMenuItem ToolStripMenuItem_ChartPoint = new ToolStripMenuItem("Point"); + ToolStripMenuItem_ChartPoint.CheckOnClick = true; + ToolStripMenuItem_ChartPoint.Click += new System.EventHandler(this.ToolStripMenuItem_ChartPoint); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartPoint); + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_ChartOpacity = new ToolStripMenuItem("Opacity"); + ToolStripMenuItem_ChartOpacity.Click += new System.EventHandler(this.ToolStripMenuItem_ChartOpacity); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartOpacity); + + ToolStripMenuItem ToolStripMenuItem_MarkerSize = new ToolStripMenuItem("Marker Size"); + ToolStripMenuItem_MarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_MarkerSize); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSize); + + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_BinNumber = new ToolStripMenuItem("Bin number"); + ToolStripMenuItem_BinNumber.Click += new System.EventHandler(this.ToolStripMenuItem_BinNumber); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_BinNumber); + + + return this.SpecificContextMenu; + } + + + private void ToolStripMenuItem_BinNumber(object sender, EventArgs e) + { + if (this.SliderForMarkerSizeBinSize.ShowDialog() != DialogResult.OK) return; + this.BinNumber = (int)this.SliderForMarkerSizeBinSize.numericUpDown.Value; + this.Run(); + //base.Run(); + } + + + private void ToolStripMenuItem_MarkerSize(object sender, EventArgs e) + { + if (this.SliderForMarkerSize.ShowDialog() != DialogResult.OK) return; + this.MarkerSize = (int)this.SliderForMarkerSize.numericUpDown.Value; + + for (int j = 0; j < this.input.Count; j++) + { + foreach (var item in this.Series[j].Points) + item.MarkerSize = this.MarkerSize; + } + } + + private void ToolStripMenuItem_ChartOpacity(object sender, EventArgs e) + { + if (this.SliderForOpacity.ShowDialog() != DialogResult.OK) return; + this.Opacity = (int)this.SliderForOpacity.numericUpDown.Value; + + + for (int j = 0; j < this.input.Count; j++) + foreach (var item in this.Series[j].Points) + { + Color C = item.Color; + item.Color = Color.FromArgb(this.Opacity, C); + } + + } + + private void ToolStripMenuItem_ChartBar(object sender, EventArgs e) + { + IsBar = !IsBar; + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Column; + } + base.Update(); + } + + private void ToolStripMenuItem_ChartPoint(object sender, EventArgs e) + { + ISPoint = !ISPoint; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Point; + + foreach (var item in base.CurrentSeries[IdxSerie].Points) + { + item.MarkerStyle = MarkerStyle.Circle; + } + } + base.Update(); + } + + private void ToolStripMenuItem_ChartLine(object sender, EventArgs e) + { + IsLine = !IsLine; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Line; + } + base.Update(); + } + + + private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Clicks != 1) return; + + if (e.Button != MouseButtons.Right) return; + + ContextMenuStrip NewMenu = new ContextMenuStrip(); + foreach (var item in base.GetContextMenu(e)) + NewMenu.Items.Add(item); + NewMenu.Items.Add(this.GetContextMenu()); + + #region Selection process + double MaxX = this.ChartAreas[0].CursorX.SelectionEnd; + double MinX = this.ChartAreas[0].CursorX.SelectionStart; + + if (MaxX < MinX) + { + MinX = this.ChartAreas[0].CursorX.SelectionEnd; + MaxX = this.ChartAreas[0].CursorX.SelectionStart; + } + + double MaxY = this.ChartAreas[0].CursorY.SelectionEnd; + double MinY = this.ChartAreas[0].CursorY.SelectionStart; + + if (MaxY < MinY) + { + MinY = this.ChartAreas[0].CursorY.SelectionEnd; + MaxY = this.ChartAreas[0].CursorY.SelectionStart; + } + + //cListWell ListWells = new cListWell(); + List LDP = new List(); + + foreach (DataPoint item in this.Series[0].Points) + { + if ((item.XValue >= MinX) && (item.XValue <= MaxX) && (item.YValues[0] >= MinY) && (item.YValues[0] <= MaxY)) + { + if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWell))) + { + // ListWells.Add((cWell)(item.Tag)); + LDP.Add(item); + + //((cWell)(item.Tag)).SetClass(5); + //item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + } + } + + if (LDP.Count > 0) + { + ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("List " + LDP.Count + " wells"); + ToolStripMenuItem ToolStripMenuItem_ChangeClass = new ToolStripMenuItem("Classes"); + //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + cWell TmpWell = (cWell)(LDP[0].Tag); + + for (int i = 0; i < TmpWell.Parent.GlobalInfo.ListWellClasses.Count; i++) + { + ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(TmpWell.Parent.GlobalInfo.ListWellClasses[i].Name); + ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + ToolStripMenuItem_NewClass.Tag = LDP; + ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + } + NewMenu.Items.Add(SpecificContextMenu); + } + #endregion + + //HitTestResult Res = this.HitTest(e.X, e.Y, ChartElementType.DataPoint); + //if (Res.Series != null) + //{ + // DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + + // if (PtToTransfer.Tag != null) + // { + // if (PtToTransfer.Tag.GetType() == typeof(cWell)) + // { + // cWell TmpWell = (cWell)(PtToTransfer.Tag); + // foreach (var item in TmpWell.GetExtendedContextMenu()) + // NewMenu.Items.Add(item); + // } + // if (PtToTransfer.Tag.GetType() == typeof(cDescriptorsType)) + // { + // cDescriptorsType TmpDesc = (cDescriptorsType)(PtToTransfer.Tag); + // foreach (var itemDesc in TmpDesc.GetExtendedContextMenu()) + // NewMenu.Items.Add(itemDesc); + // } + // if (PtToTransfer.Tag.GetType() == typeof(cPlate)) + // { + // cPlate TmpPlate = (cPlate)(PtToTransfer.Tag); + // NewMenu.Items.Add(TmpPlate.GetExtendedContextMenu()); + // } + + + // } + //} + + HitTestResult ResForTitle = this.HitTest(e.X, e.Y, ChartElementType.Title); + if ((ResForTitle != null) && (ResForTitle.ChartElementType == ChartElementType.Title)) + { + Title TmpTitle = (Title)ResForTitle.Object; + + if ((TmpTitle.Tag != null) && (TmpTitle.Tag.GetType() == typeof(cPlate))) + { + cPlate TmpPlate = (cPlate)(TmpTitle.Tag); + if (TmpPlate.GetContextMenu() != null) + NewMenu.Items.Add(TmpPlate.GetContextMenu()); + + + } + + } + NewMenu.DropShadowEnabled = true; + NewMenu.Show(Control.MousePosition); + } + + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + ToolStripMenuItem ParentMenu = (ToolStripMenuItem)(sender); + int Classe = 0; + int ResultClasse = -1; + + List DP = (List)(ParentMenu.Tag); + + + foreach (var Class in ((cWell)(DP[0].Tag)).Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + + Classe++; + } + + foreach (var item in DP) + { + ((cWell)(item.Tag)).SetClass(ResultClasse); + item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + + ((cWell)(DP[0].Tag)).Parent.GetCurrentDisplayPlate().DisplayDistribution(((cWell)(DP[0].Tag)).Parent.ListDescriptors.CurrentSelectedDescriptorIdx, false); + + } + + + + + + + } + +} diff --git a/Classes/Base Classes/Viewers/1D/cChart1DStackedHistogram.cs b/Classes/Base Classes/Viewers/1D/cChart1DStackedHistogram.cs new file mode 100644 index 0000000..fdfcb5e --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cChart1DStackedHistogram.cs @@ -0,0 +1,461 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; +using HCSAnalyzer.Classes.Base_Classes.DataProcessing; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + + public class cChart1DStackedHistogram : cGraphGeneral + { + protected ToolStripMenuItem SpecificContextMenu = null; + public bool IsLine = false; + public bool IsBar = false; + public bool ISPoint = true; + // FormForSingleSlider SliderForMarkerSize = new FormForSingleSlider("Marker Size"); + FormForSingleSlider SliderForMarkerSizeBinSize = new FormForSingleSlider("Bin number"); + // FormForSingleSlider SliderForOpacity = new FormForSingleSlider("Marker Opacity"); + // public int Opacity = 255; + // public int MarkerSize = 10; + public int BinNumber = 100; + + + + public cChart1DStackedHistogram() + { + base.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AssociatedChart_MouseClick); + base.IsZoomableX = true; + base.IsZoomableY = false; + base.IsAllowDisplayValue = false; + base.IsAllowDisplayTable = false; + } + + void Refresh() + { + base.CurrentSeries.Clear(); + + //for (int i = 0; i < ListValuesForHisto.Length; i++) + //{ + // HistoPos[i] = new List(); + // if (ListSelectedClass[i]) + // HistoPos[i] = ListValuesForHisto[i].CreateHistogram(MinValue, MaxValue, (int)GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); + + // SeriesPos[i] = new Series(); + //} + + //for (int i = 0; i < SeriesPos.Length; i++) + //{ + // int Max = 0; + // if (HistoPos[i].Count > 0) + // Max = HistoPos[i][0].Length; + + // for (int IdxValue = 0; IdxValue < Max; IdxValue++) + // { + // SeriesPos[i].Points.AddXY(MinValue + ((MaxValue - MinValue) * IdxValue) / Max, HistoPos[i][1][IdxValue]); + // SeriesPos[i].Points[IdxValue].ToolTip = HistoPos[i][1][IdxValue].ToString(); + // if (CompleteScreening.SelectedClass == -1) + // SeriesPos[i].Points[IdxValue].Color = Color.Black; + // else + // SeriesPos[i].Points[IdxValue].Color = CompleteScreening.GlobalInfo.ListWellClasses[i].ColourForDisplay; + // } + //} + + double GlobalMinX = this.input.Min(); + double GlobalMaxX = this.input.Max(); + + for (int IdxSerie = 0; IdxSerie < input.Count; IdxSerie++) + { + if (input[IdxSerie].Count == 0) continue; + + Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name + "_Histogram"); + + cHistogramBuilder HB = new cHistogramBuilder(); + HB.SetInputData(new cExtendedTable(input[IdxSerie])); + HB.Min = GlobalMinX; + HB.Max = GlobalMaxX; + HB.BinNumber = this.BinNumber; + HB.Run(); + + cExtendedTable CurrentHistogram = HB.GetOutPut(); + + //if (ISPoint) + // NewSerie.ChartType = SeriesChartType.Point; + //if (IsLine) + // NewSerie.ChartType = SeriesChartType.Line; + //if (IsBar) + // NewSerie.ChartType = SeriesChartType.Column; + + NewSerie.ChartType = SeriesChartType.StackedColumn; + + //SeriesPos[i].ChartType = SeriesChartType.StackedColumn; + + double Step = (GlobalMaxX - GlobalMinX) / CurrentHistogram[0].Count; + + for (int j = 0; j < CurrentHistogram[0].Count; j++) + { + //this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(128, GlobalInfo.ListCellularPhenotypes[(int)MachineLearning.Classes[j]].ColourForDisplay); + double[] Value = new double[1]; + Value[0] = CurrentHistogram[1][j]; + // if (Value[0] == 0) continue; + + + DataPoint DP = new DataPoint(); + + // SeriesPos[i].Points.AddXY(MinValue + ((MaxValue - MinValue) * IdxValue) / Max, HistoPos[i][1][IdxValue]); + + DP.SetValueXY(Step * j + GlobalMinX, Value[0]); + + //double[] Value = new double[1]; + //Value[0] = CurrentHistogram[1][j]; + // DP.YValues = Value; + // if (Value[0] == 0) continue; + // DP.XValue = Step * j + GlobalMinX; + DP.Tag = input[IdxSerie].Tag; + + // DP.MarkerSize = this.MarkerSize; + // DP.MarkerStyle = MarkerStyle.Circle; + + if (IsBorder) + { + DP.MarkerBorderColor = Color.Black; + DP.MarkerBorderWidth = 1; + DP.BorderColor = Color.Black; + DP.BorderWidth = 1; + } + else + { + DP.BorderWidth = 0; + DP.MarkerBorderWidth = 0; + } + + if (input[IdxSerie].Tag != null) + { + //if (j >= this.input[0].ListTags.Count) continue; + + if (input[IdxSerie].Tag.GetType() == typeof(cWellClass)) + { + DP.Color = ((cWellClass)(input[IdxSerie].Tag)).ColourForDisplay; + DP.ToolTip = ((cWellClass)(input[IdxSerie].Tag)).Name + "\n"; + } + if (input[IdxSerie].Tag.GetType() == typeof(cCellularPhenotype)) + { + DP.Color = ((cCellularPhenotype)(input[IdxSerie].Tag)).ColourForDisplay; + DP.ToolTip = ((cCellularPhenotype)(input[IdxSerie].Tag)).Name + "\n"; + } + + //DP.Tag = this.input[0].ListTags[j]; + + //if (DP.Tag.GetType() == typeof(cWell)) + //{ + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cWell)(DP.Tag)).GetShortInfo() + Value[0]; + //} + //if (DP.Tag.GetType() == typeof(cDescriptorsType)) + //{ + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cDescriptorsType)(DP.Tag)).GetShortInfo() + Value[0]; + // DP.AxisLabel = ((cDescriptorsType)(DP.Tag)).GetName(); + // base.CurrentChartArea.AxisX.Interval = 1; + + //} + //if (DP.Tag.GetType() == typeof(cPlate)) + //{ + // // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + // DP.ToolTip = ((cPlate)(DP.Tag)).Name + " : " + Value[0]; + // DP.AxisLabel = ((cPlate)(DP.Tag)).Name; + // base.CurrentChartArea.AxisX.Interval = 1; + + //} + + } + + DP.ToolTip += DP.XValue.ToString("N2") + " :\n" + DP.YValues[0]; + + NewSerie.Points.Add(DP); + // if (Input[idxCol].ListTags != null) + //NewSerie.Points[IdxValue].Tag = Input[idxCol].ListTags[idxRow]; + // if (this.IsDisplayValues) CurrentSeries.Points[IdxValue].Label = Value.ToString("N2");// string.Format("{0:0.###}", Math.Abs(Value)); + //this.chartForPoints.Series[0].Points[j].MarkerBorderWidth = BorderSize; + } + base.CurrentSeries.Add(NewSerie); + } + base.LabelAxisY = "Frequency"; + base.Update(); + + + } + + + + public void Run() + { + //this.SliderForMarkerSize.trackBar.Value = this.MarkerSize; + //this.SliderForMarkerSize.numericUpDown.Value = this.MarkerSize; + //this.SliderForOpacity.numericUpDown.Maximum = this.SliderForOpacity.trackBar.Maximum = 255; + //this.SliderForOpacity.trackBar.Value = this.Opacity; + //this.SliderForOpacity.numericUpDown.Value = this.Opacity; + + this.SliderForMarkerSizeBinSize.numericUpDown.Maximum = this.SliderForMarkerSizeBinSize.trackBar.Maximum = 1000; + this.SliderForMarkerSizeBinSize.trackBar.Value = this.BinNumber; + this.SliderForMarkerSizeBinSize.numericUpDown.Value = this.BinNumber; + + base.IsYAxis = true; + base.IsBorder = true; + + this.Refresh(); + + base.Run(); + // base.CurrentTitle.Text = "Stacked histogram(" + base.CurrentTitle.Text + ")"; + } + + + public ToolStripMenuItem GetContextMenu() + { + SpecificContextMenu = new ToolStripMenuItem("Graph Options"); + + ToolStripMenuItem ToolStripMenuItem_ChartLine = new ToolStripMenuItem("Line"); + ToolStripMenuItem_ChartLine.CheckOnClick = true; + ToolStripMenuItem_ChartLine.Click += new System.EventHandler(this.ToolStripMenuItem_ChartLine); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartLine); + + ToolStripMenuItem ToolStripMenuItem_ChartBar = new ToolStripMenuItem("Column"); + ToolStripMenuItem_ChartBar.CheckOnClick = true; + ToolStripMenuItem_ChartBar.Click += new System.EventHandler(this.ToolStripMenuItem_ChartBar); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartBar); + + ToolStripMenuItem ToolStripMenuItem_ChartPoint = new ToolStripMenuItem("Point"); + ToolStripMenuItem_ChartPoint.CheckOnClick = true; + ToolStripMenuItem_ChartPoint.Click += new System.EventHandler(this.ToolStripMenuItem_ChartPoint); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartPoint); + + //SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + //ToolStripMenuItem ToolStripMenuItem_ChartOpacity = new ToolStripMenuItem("Opacity"); + //ToolStripMenuItem_ChartOpacity.Click += new System.EventHandler(this.ToolStripMenuItem_ChartOpacity); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartOpacity); + + //ToolStripMenuItem ToolStripMenuItem_MarkerSize = new ToolStripMenuItem("Marker Size"); + //ToolStripMenuItem_MarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_MarkerSize); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSize); + + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_BinNumber = new ToolStripMenuItem("Bin number"); + ToolStripMenuItem_BinNumber.Click += new System.EventHandler(this.ToolStripMenuItem_BinNumber); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_BinNumber); + + + return this.SpecificContextMenu; + } + + + private void ToolStripMenuItem_BinNumber(object sender, EventArgs e) + { + if (this.SliderForMarkerSizeBinSize.ShowDialog() != DialogResult.OK) return; + this.BinNumber = (int)this.SliderForMarkerSizeBinSize.numericUpDown.Value; + this.Run(); + //base.Run(); + } + + + //private void ToolStripMenuItem_MarkerSize(object sender, EventArgs e) + //{ + // if (this.SliderForMarkerSize.ShowDialog() != DialogResult.OK) return; + // this.MarkerSize = (int)this.SliderForMarkerSize.numericUpDown.Value; + + // for (int j = 0; j < this.input.Count; j++) + // { + // foreach (var item in this.Series[j].Points) + // item.MarkerSize = this.MarkerSize; + // } + //} + + //private void ToolStripMenuItem_ChartOpacity(object sender, EventArgs e) + //{ + // if (this.SliderForOpacity.ShowDialog() != DialogResult.OK) return; + // this.Opacity = (int)this.SliderForOpacity.numericUpDown.Value; + + + // for (int j = 0; j < this.input.Count; j++) + // foreach (var item in this.Series[j].Points) + // { + // Color C = item.Color; + // item.Color = Color.FromArgb(this.Opacity, C); + // } + + //} + + private void ToolStripMenuItem_ChartBar(object sender, EventArgs e) + { + IsBar = !IsBar; + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Column; + } + base.Update(); + } + + private void ToolStripMenuItem_ChartPoint(object sender, EventArgs e) + { + ISPoint = !ISPoint; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Point; + + foreach (var item in base.CurrentSeries[IdxSerie].Points) + { + item.MarkerStyle = MarkerStyle.Circle; + } + } + base.Update(); + } + + private void ToolStripMenuItem_ChartLine(object sender, EventArgs e) + { + IsLine = !IsLine; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Line; + } + base.Update(); + } + + + private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Clicks != 1) return; + + if (e.Button != MouseButtons.Right) return; + + ContextMenuStrip NewMenu = new ContextMenuStrip(); + foreach (var item in base.GetContextMenu(e)) + NewMenu.Items.Add(item); + + NewMenu.Items.Add(this.GetContextMenu()); + + #region Selection process + double MaxX = this.ChartAreas[0].CursorX.SelectionEnd; + double MinX = this.ChartAreas[0].CursorX.SelectionStart; + + if (MaxX < MinX) + { + MinX = this.ChartAreas[0].CursorX.SelectionEnd; + MaxX = this.ChartAreas[0].CursorX.SelectionStart; + } + + double MaxY = this.ChartAreas[0].CursorY.SelectionEnd; + double MinY = this.ChartAreas[0].CursorY.SelectionStart; + + if (MaxY < MinY) + { + MinY = this.ChartAreas[0].CursorY.SelectionEnd; + MaxY = this.ChartAreas[0].CursorY.SelectionStart; + } + + //cListWell ListWells = new cListWell(); + //List LDP = new List(); + + //foreach (DataPoint item in this.Series[0].Points) + //{ + // if ((item.XValue >= MinX) && (item.XValue <= MaxX) && (item.YValues[0] >= MinY) && (item.YValues[0] <= MaxY)) + // { + // if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWell))) + // { + // // ListWells.Add((cWell)(item.Tag)); + // LDP.Add(item); + + // //((cWell)(item.Tag)).SetClass(5); + // //item.Color = ((cWell)(item.Tag)).GetClassColor(); + // } + // if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWellClass))) + // { + // // ListWells.Add((cWell)(item.Tag)); + // LDP.Add(item); + + // //((cWell)(item.Tag)).SetClass(5); + // //item.Color = ((cWell)(item.Tag)).GetClassColor(); + // } + + // } + //} + + //if (LDP.Count > 0) + //{ + // ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("List " + LDP.Count + " wells"); + // ToolStripMenuItem ToolStripMenuItem_ChangeClass = new ToolStripMenuItem("Classes"); + // //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + // cWell TmpWell = (cWell)(LDP[0].Tag); + + // for (int i = 0; i < TmpWell.Parent.GlobalInfo.ListWellClasses.Count; i++) + // { + // ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(TmpWell.Parent.GlobalInfo.ListWellClasses[i].Name); + // ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + // ToolStripMenuItem_NewClass.Tag = LDP; + // ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + // } + // NewMenu.Items.Add(SpecificContextMenu); + //} + #endregion + + NewMenu.DropShadowEnabled = true; + NewMenu.Show(Control.MousePosition); + } + + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + ToolStripMenuItem ParentMenu = (ToolStripMenuItem)(sender); + int Classe = 0; + int ResultClasse = -1; + + List DP = (List)(ParentMenu.Tag); + + + foreach (var Class in ((cWell)(DP[0].Tag)).Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + + Classe++; + } + + foreach (var item in DP) + { + ((cWell)(item.Tag)).SetClass(ResultClasse); + item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + + ((cWell)(DP[0].Tag)).Parent.GetCurrentDisplayPlate().DisplayDistribution(((cWell)(DP[0].Tag)).Parent.ListDescriptors.CurrentSelectedDescriptorIdx, false); + + } + + + + + + + } + +} diff --git a/Classes/Base Classes/Viewers/1D/cViewerBoxPlot.cs b/Classes/Base Classes/Viewers/1D/cViewerBoxPlot.cs new file mode 100644 index 0000000..d0d0a50 --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cViewerBoxPlot.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerBoxPlot : cDataDisplay + { + //cPanelHisto CurrentPanelHisto; + //public eOrientation Orientation = eOrientation.HORIZONTAL; + + public cChart1DBoxPlot Chart = new cChart1DBoxPlot(); + + + public cViewerBoxPlot() + { + this.Title = "Box plot"; + } + + public void SetInputData(cExtendedTable input) + { + //CurrentPanelHisto = new cPanelHisto(ListValues, true, eGraphType.LINE, this.Orientation); + // Chart = new cChart1DGraph(); + Chart.input = input; + + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + this.CurrentPanel.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); + + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Width = CurrentPanel.Width-50; + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Height = CurrentPanel.Height-5; + Chart.Run(); + + CurrentPanel.Controls.Add(Chart); + return ToReturn; + } + + + + + + + } +} diff --git a/Classes/Base Classes/Viewers/1D/cViewerGraph1D.cs b/Classes/Base Classes/Viewers/1D/cViewerGraph1D.cs new file mode 100644 index 0000000..0566c34 --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cViewerGraph1D.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerGraph1D : cDataDisplay + { + //cPanelHisto CurrentPanelHisto; + //public eOrientation Orientation = eOrientation.HORIZONTAL; + + public cChart1DGraph Chart = new cChart1DGraph(); + + + public cViewerGraph1D() + { + this.Title = "Graph Viewer"; + } + + public void SetInputData(cExtendedTable input) + { + //CurrentPanelHisto = new cPanelHisto(ListValues, true, eGraphType.LINE, this.Orientation); + // Chart = new cChart1DGraph(); + Chart.input = input; + + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + this.CurrentPanel.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); + + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Width = CurrentPanel.Width-50; + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Height = CurrentPanel.Height-5; + Chart.Run(); + + CurrentPanel.Controls.Add(Chart); + return ToReturn; + } + + + + + + + } +} diff --git a/Classes/Base Classes/Viewers/1D/cViewerHistogram.cs b/Classes/Base Classes/Viewers/1D/cViewerHistogram.cs new file mode 100644 index 0000000..1453bcc --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cViewerHistogram.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerHistogram : cDataDisplay + { + //cPanelHisto CurrentPanelHisto; + //public eOrientation Orientation = eOrientation.HORIZONTAL; + + public cChart1DHistogram Chart = new cChart1DHistogram(); + + + public cViewerHistogram() + { + this.Title = "Histogram Viewer"; + } + + public void SetInputData(cExtendedTable input) + { + //CurrentPanelHisto = new cPanelHisto(ListValues, true, eGraphType.LINE, this.Orientation); + // Chart = new cChart1DGraph(); + Chart.input = input; + + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + this.CurrentPanel.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); + + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Width = CurrentPanel.Width-50; + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Height = CurrentPanel.Height-5; + Chart.Run(); + + CurrentPanel.Controls.Add(Chart); + return ToReturn; + } + + + + + + + } +} diff --git a/Classes/Base Classes/Viewers/1D/cViewerStackedHistogram.cs b/Classes/Base Classes/Viewers/1D/cViewerStackedHistogram.cs new file mode 100644 index 0000000..b6d65ee --- /dev/null +++ b/Classes/Base Classes/Viewers/1D/cViewerStackedHistogram.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerStackedHistogram : cDataDisplay + { + //cPanelHisto CurrentPanelHisto; + //public eOrientation Orientation = eOrientation.HORIZONTAL; + + public cChart1DStackedHistogram Chart = new cChart1DStackedHistogram(); + + + public cViewerStackedHistogram() + { + this.Title = "Stacked Histogram Viewer"; + } + + public void SetInputData(cExtendedTable input) + { + //CurrentPanelHisto = new cPanelHisto(ListValues, true, eGraphType.LINE, this.Orientation); + // Chart = new cChart1DGraph(); + Chart.input = input; + + + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + this.CurrentPanel.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); + + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Width = CurrentPanel.Width-50; + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Height = CurrentPanel.Height-5; + Chart.Run(); + + CurrentPanel.Controls.Add(Chart); + return ToReturn; + } + + + + + + + } +} diff --git a/Classes/Base Classes/Viewers/2D/FormPanelForHisto.Designer.cs b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.Designer.cs new file mode 100644 index 0000000..e6a9e2c --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.Designer.cs @@ -0,0 +1,261 @@ +namespace HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic +{ + partial class FormPanelForHisto + { + /// + /// 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(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + this.panelForGraphContainer = new System.Windows.Forms.Panel(); + this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gridToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.majorXAxisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.majorYAxisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.backColorToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.shadowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.markerBorderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.axisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.yAxisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.xAxisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.infoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.displayStatisticsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.copyToClipboardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.panelForGraphContainer.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // panelForGraphContainer + // + this.panelForGraphContainer.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.panelForGraphContainer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelForGraphContainer.Controls.Add(this.chart); + this.panelForGraphContainer.Location = new System.Drawing.Point(3, 4); + this.panelForGraphContainer.Name = "panelForGraphContainer"; + this.panelForGraphContainer.Size = new System.Drawing.Size(471, 227); + this.panelForGraphContainer.TabIndex = 0; + // + // chart + // + this.chart.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.chart.ContextMenuStrip = this.contextMenuStrip; + legend1.Name = "Legend1"; + this.chart.Legends.Add(legend1); + this.chart.Location = new System.Drawing.Point(-1, -1); + this.chart.Name = "chart"; + this.chart.Size = new System.Drawing.Size(471, 227); + this.chart.TabIndex = 2; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayToolStripMenuItem, + this.axisToolStripMenuItem, + this.infoToolStripMenuItem, + this.toolStripSeparator1, + this.copyToClipboardToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(170, 98); + // + // displayToolStripMenuItem + // + this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.gridToolStripMenuItem, + this.backColorToolStripMenuItem1, + this.shadowToolStripMenuItem, + this.markerBorderToolStripMenuItem}); + this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; + this.displayToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.displayToolStripMenuItem.Text = "Display"; + // + // gridToolStripMenuItem + // + this.gridToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.majorXAxisToolStripMenuItem, + this.majorYAxisToolStripMenuItem}); + this.gridToolStripMenuItem.Name = "gridToolStripMenuItem"; + this.gridToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.gridToolStripMenuItem.Text = "Grid"; + // + // majorXAxisToolStripMenuItem + // + this.majorXAxisToolStripMenuItem.Checked = true; + this.majorXAxisToolStripMenuItem.CheckOnClick = true; + this.majorXAxisToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.majorXAxisToolStripMenuItem.Name = "majorXAxisToolStripMenuItem"; + this.majorXAxisToolStripMenuItem.Size = new System.Drawing.Size(139, 22); + this.majorXAxisToolStripMenuItem.Text = "Major X Axis"; + this.majorXAxisToolStripMenuItem.Click += new System.EventHandler(this.majorXAxisToolStripMenuItem_Click); + // + // majorYAxisToolStripMenuItem + // + this.majorYAxisToolStripMenuItem.Checked = true; + this.majorYAxisToolStripMenuItem.CheckOnClick = true; + this.majorYAxisToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.majorYAxisToolStripMenuItem.Name = "majorYAxisToolStripMenuItem"; + this.majorYAxisToolStripMenuItem.Size = new System.Drawing.Size(139, 22); + this.majorYAxisToolStripMenuItem.Text = "Major Y Axis"; + this.majorYAxisToolStripMenuItem.Click += new System.EventHandler(this.majorYAxisToolStripMenuItem_Click); + // + // backColorToolStripMenuItem1 + // + this.backColorToolStripMenuItem1.Name = "backColorToolStripMenuItem1"; + this.backColorToolStripMenuItem1.Size = new System.Drawing.Size(149, 22); + this.backColorToolStripMenuItem1.Text = "Back Color"; + this.backColorToolStripMenuItem1.Click += new System.EventHandler(this.backColorToolStripMenuItem1_Click); + // + // shadowToolStripMenuItem + // + this.shadowToolStripMenuItem.Checked = true; + this.shadowToolStripMenuItem.CheckOnClick = true; + this.shadowToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.shadowToolStripMenuItem.Name = "shadowToolStripMenuItem"; + this.shadowToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.shadowToolStripMenuItem.Text = "Shadow"; + this.shadowToolStripMenuItem.Click += new System.EventHandler(this.shadowToolStripMenuItem_Click); + // + // markerBorderToolStripMenuItem + // + this.markerBorderToolStripMenuItem.Checked = true; + this.markerBorderToolStripMenuItem.CheckOnClick = true; + this.markerBorderToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.markerBorderToolStripMenuItem.Name = "markerBorderToolStripMenuItem"; + this.markerBorderToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.markerBorderToolStripMenuItem.Text = "Marker Border"; + this.markerBorderToolStripMenuItem.Click += new System.EventHandler(this.markerBorderToolStripMenuItem_Click); + // + // axisToolStripMenuItem + // + this.axisToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.yAxisToolStripMenuItem, + this.xAxisToolStripMenuItem}); + this.axisToolStripMenuItem.Name = "axisToolStripMenuItem"; + this.axisToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.axisToolStripMenuItem.Text = "Axis"; + // + // yAxisToolStripMenuItem + // + this.yAxisToolStripMenuItem.Name = "yAxisToolStripMenuItem"; + this.yAxisToolStripMenuItem.Size = new System.Drawing.Size(105, 22); + this.yAxisToolStripMenuItem.Text = "Y Axis"; + this.yAxisToolStripMenuItem.Click += new System.EventHandler(this.yAxisToolStripMenuItem_Click); + // + // xAxisToolStripMenuItem + // + this.xAxisToolStripMenuItem.Enabled = false; + this.xAxisToolStripMenuItem.Name = "xAxisToolStripMenuItem"; + this.xAxisToolStripMenuItem.Size = new System.Drawing.Size(105, 22); + this.xAxisToolStripMenuItem.Text = "X Axis"; + this.xAxisToolStripMenuItem.Click += new System.EventHandler(this.xAxisToolStripMenuItem_Click); + // + // infoToolStripMenuItem + // + this.infoToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayStatisticsToolStripMenuItem}); + this.infoToolStripMenuItem.Name = "infoToolStripMenuItem"; + this.infoToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.infoToolStripMenuItem.Text = "Info"; + // + // displayStatisticsToolStripMenuItem + // + this.displayStatisticsToolStripMenuItem.CheckOnClick = true; + this.displayStatisticsToolStripMenuItem.Name = "displayStatisticsToolStripMenuItem"; + this.displayStatisticsToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.displayStatisticsToolStripMenuItem.Text = "Display Statistics"; + this.displayStatisticsToolStripMenuItem.Click += new System.EventHandler(this.displayStatisticsToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(166, 6); + // + // copyToClipboardToolStripMenuItem + // + this.copyToClipboardToolStripMenuItem.Name = "copyToClipboardToolStripMenuItem"; + this.copyToClipboardToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.copyToClipboardToolStripMenuItem.Text = "Copy to clipboard"; + this.copyToClipboardToolStripMenuItem.Click += new System.EventHandler(this.copyToClipboardToolStripMenuItem_Click); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Location = new System.Drawing.Point(497, 70); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(200, 100); + this.tableLayoutPanel1.TabIndex = 1; + // + // FormPanelForHisto + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(722, 337); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.panelForGraphContainer); + this.Name = "FormPanelForHisto"; + this.Text = "FormPanelForHisto"; + this.panelForGraphContainer.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit(); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panelForGraphContainer; + private System.Windows.Forms.ToolStripMenuItem copyToClipboardToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem backColorToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem gridToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem majorXAxisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem majorYAxisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem axisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem yAxisToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + public System.Windows.Forms.ContextMenuStrip contextMenuStrip; + public System.Windows.Forms.DataVisualization.Charting.Chart chart; + private System.Windows.Forms.ToolStripMenuItem xAxisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem shadowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem markerBorderToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem infoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem displayStatisticsToolStripMenuItem; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} \ No newline at end of file diff --git a/Classes/Base Classes/Viewers/2D/FormPanelForHisto.cs b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.cs new file mode 100644 index 0000000..50f377b --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.cs @@ -0,0 +1,440 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; +using System.IO; +using System.Windows.Forms.DataVisualization.Charting; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using LibPlateAnalysis; + +namespace HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic +{ + public partial class FormPanelForHisto : Form + { + //int BinSize = 10; + + List ListValues; + + FormForMaxMinRequest RequestWindowForYAxis = new FormForMaxMinRequest(); + FormForMaxMinRequest RequestWindowForXAxis = new FormForMaxMinRequest(); + public ChartArea CurrentChartArea; + bool IsStacked; + eOrientation HistoOrientation; + eGraphType GraphType = eGraphType.HISTOGRAM; + bool IsMarkerBorder = true; + + int PointSize = 10; + + + ToolStripMenuItem ToolStripMenuItem_Stacked; + ToolStripMenuItem ToolStripMenuItem_BinNumber; + int NumBin = 100; + + private void ChangeStackedState(object sender, EventArgs e) + { + IsStacked = ToolStripMenuItem_Stacked.Checked; + RedrawHisto(); + //((cWindowToDisplayEntireScreening)ParentWindow).RemovePlate(this.PlateToDisplay); + //WindowToDisplayEntireScreening.RemovePlate(this.PlateToDisplay); + } + + public FormPanelForHisto(List ListValues, bool IsStacked, eGraphType GraphType, eOrientation HistoOrientation) + { + InitializeComponent(); + this.IsStacked = IsStacked; + this.HistoOrientation = HistoOrientation; + this.ListValues = ListValues; + + #region adapt the context menu + if (this.ListValues.Count > 1) + { + ToolStripMenuItem_Stacked = new ToolStripMenuItem("Stacked"); + ToolStripMenuItem_Stacked.CheckOnClick = true; + ToolStripMenuItem_Stacked.Checked = IsStacked; + ToolStripMenuItem_Stacked.Click += new System.EventHandler(this.ChangeStackedState); + + contextMenuStrip.Items.Add(ToolStripMenuItem_Stacked); + } + + this.GraphType = GraphType; + if (this.GraphType == eGraphType.HISTOGRAM) + { + ToolStripMenuItem_BinNumber = new ToolStripMenuItem("Bin Number"); + // ToolStripMenuItem_Stacked.CheckOnClick = true; + // ToolStripMenuItem_Stacked.Checked = IsStacked; + ToolStripMenuItem_BinNumber.Click += new System.EventHandler(this.ChangeBinNumber); + + contextMenuStrip.Items.Add(ToolStripMenuItem_BinNumber); + + } + #endregion + + CurrentChartArea = new ChartArea(); + CurrentChartArea.BorderColor = Color.Black; + + this.chart.ChartAreas.Add(CurrentChartArea); + + this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDoubleClick); + this.chart.MouseClick += new System.Windows.Forms.MouseEventHandler(this.chart_MouseClick); + RedrawHisto(); + } + + + public bool IsShadow = true; + public bool UserEnable = true; + public bool IsDisplayStat = false; + + void RedrawHisto() + { + int IdxSerie = 0; + this.chart.Series.Clear(); + //this.chart.ChartAreas.Clear(); + //this.chart.Legends[0] = new System.Windows.Forms.DataVisualization.Charting.Legend("Test"); + + //CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + //if (CompleteScreening != null) + // CurrentChartArea.Axes[0].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); + if (this.GraphType == eGraphType.LINE) + CurrentChartArea.Axes[1].Title = "Value"; + else if (this.GraphType == eGraphType.HISTOGRAM) + CurrentChartArea.Axes[1].Title = "Sum"; + + CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + this.chart.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + //if (CompleteScreening != null) + CurrentChartArea.BackColor = Color.FromArgb(255, 230, 230, 230); + CurrentChartArea.BackSecondaryColor = Color.White; + + CurrentChartArea.CursorX.IsUserEnabled = this.UserEnable; + CurrentChartArea.CursorX.IsUserSelectionEnabled = this.UserEnable; + CurrentChartArea.AxisX.ScaleView.Zoomable = this.UserEnable; + CurrentChartArea.AxisX.ScrollBar.IsPositionedInside = true; + + //if ((CompleteScreening != null) && (CompleteScreening.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked)) + //{ + // StripLine AverageLine = new StripLine(); + // AverageLine.BackColor = Color.Black; + // AverageLine.IntervalOffset = RawValues.Mean(); + // AverageLine.StripWidth = double.Epsilon; + // CurrentChartArea.AxisX.StripLines.Add(AverageLine); + // AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); + + // StripLine StdLine = new StripLine(); + // StdLine.BackColor = Color.FromArgb(64, Color.Black); + // double Std = RawValues.Std(); + // StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; + // StdLine.StripWidth = Std; + // CurrentChartArea.AxisX.StripLines.Add(StdLine); + // AverageLine.StripWidth = 0.0001; + //} + + + // if (CompleteScreening != null) + // SerieForHisto.Color = CompleteScreening.GlobalInfo.ListWellClasses[1].ColourForDisplay; + + // List HistoPos = RawValues.CreateHistogram(this.BinNumber); + // if (HistoPos.Count == 0) return; + + + chart.Legends.Clear(); + foreach (var CurrentList in this.ListValues) + { + List ListValuesHisto = null; + + if (this.GraphType == eGraphType.HISTOGRAM) ListValuesHisto = CurrentList.CreateHistogram(NumBin); + else if (this.GraphType == eGraphType.LINE) + { + ListValuesHisto = new List(); + ListValuesHisto.Add(CurrentList.ToArray()); + } + // CurrentChartArea = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + Series SerieForHisto = null; + if (CurrentList.Name != null) + SerieForHisto = new Series(CurrentList.Name); + else + SerieForHisto = new Series(); + + if (IsShadow) + SerieForHisto.ShadowOffset = 1; + else + SerieForHisto.ShadowOffset = 0; + + if (this.GraphType == eGraphType.LINE) + { + SerieForHisto.ChartType = SeriesChartType.Line; + } + else + { + if (this.HistoOrientation == eOrientation.HORIZONTAL) + { + if (IsStacked) + SerieForHisto.ChartType = SeriesChartType.StackedColumn; + else + SerieForHisto.ChartType = SeriesChartType.Column; + } + else if (this.HistoOrientation == eOrientation.VERTICAL) + { + if (IsStacked) + SerieForHisto.ChartType = SeriesChartType.StackedBar; + else + SerieForHisto.ChartType = SeriesChartType.Bar; + } + } + + if ((CurrentList.Name != null) && (CurrentList.Name != "")) + { + Legend CurrentLegend = new Legend(CurrentList.Name); + chart.Legends.Add(CurrentLegend); + } + + + int MarkerBorderSize = 0; + if (this.IsMarkerBorder) + MarkerBorderSize = 1; + else + MarkerBorderSize = 0; + + if (this.GraphType == eGraphType.HISTOGRAM) + { + for (int IdxValue = 0; IdxValue < ListValuesHisto[0].Length; IdxValue++) + { + SerieForHisto.Points.AddXY(ListValuesHisto[0][IdxValue], ListValuesHisto[1][IdxValue]); + SerieForHisto.Points[IdxValue].ToolTip = ListValuesHisto[1][IdxValue].ToString(); + + SerieForHisto.Points[IdxValue].BorderWidth = MarkerBorderSize; + SerieForHisto.Points[IdxValue].BorderColor = Color.Black; + } + + if ((this.IsDisplayStat) && (this.ListValues.Count == 1)) + { + StripLine AverageLine = new StripLine(); + AverageLine.BackColor = Color.Black; + AverageLine.IntervalOffset = this.ListValues[0].Mean(); + AverageLine.StripWidth = double.Epsilon; + CurrentChartArea.AxisX.StripLines.Add(AverageLine); + AverageLine.Text = AverageLine.IntervalOffset.ToString("N2"); + + StripLine StdLine = new StripLine(); + StdLine.BackColor = Color.FromArgb(64, Color.Black); + double Std = this.ListValues[0].Std(); + StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; + StdLine.StripWidth = Std; + CurrentChartArea.AxisX.StripLines.Add(StdLine); + AverageLine.StripWidth = 0.0001; + } + } + else if (this.GraphType == eGraphType.LINE) + { + for (int IdxValue = 0; IdxValue < ListValuesHisto[0].Length; IdxValue++) + { + SerieForHisto.Points.Add(ListValuesHisto[0][IdxValue]); + SerieForHisto.Points[IdxValue].ToolTip = ListValuesHisto[0][IdxValue].ToString("N2"); + SerieForHisto.Points[IdxValue].MarkerStyle = MarkerStyle.Circle; + SerieForHisto.Points[IdxValue].MarkerSize = PointSize; + + if ((this.ListValues[0].ListTags != null) && (this.ListValues[0].ListTags[IdxValue].GetType() == typeof(cWell))) + { + cWell TmpWell = (cWell)(this.ListValues[0].ListTags[IdxValue]); + + SerieForHisto.Points[IdxValue].MarkerColor = TmpWell.GetClassColor(); + SerieForHisto.Points[IdxValue].Tag = TmpWell; + } + SerieForHisto.Points[IdxValue].BorderWidth = MarkerBorderSize; + SerieForHisto.Points[IdxValue].BorderColor = Color.Black; + } + } + + this.chart.Series.Add(SerieForHisto); + this.chart.Series[IdxSerie].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.UInt32; + IdxSerie++; + } + + + + } + + //private void numericUpDownBinSize_ValueChanged(object sender, EventArgs e) + //{ + // // RedrawHisto(); + //} + + + + private void ChangeBinNumber(object sender, EventArgs e) + { + FormForPointSize WindowForValue = new FormForPointSize(); + WindowForValue.trackBarPointSize.Maximum = 500; + WindowForValue.trackBarPointSize.Value = this.NumBin; + + WindowForValue.Text = "Bin Number"; + + if (WindowForValue.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + this.NumBin = (int)WindowForValue.trackBarPointSize.Value; + + RedrawHisto(); + } + + private void copyToClipboardToolStripMenuItem_Click(object sender, EventArgs e) + { + MemoryStream ms = new MemoryStream(); + this.chart.SaveImage(ms, ChartImageFormat.Bmp); + Bitmap bm = new Bitmap(ms); + Clipboard.SetImage(bm); + } + + private void backColorToolStripMenuItem1_Click(object sender, EventArgs e) + { + ColorDialog ColorDia = new ColorDialog(); + ColorDia.ShowDialog(); + + CurrentChartArea.BackColor = ColorDia.Color; + this.chart.BackColor = ColorDia.Color; + } + + private void majorXAxisToolStripMenuItem_Click(object sender, EventArgs e) + { + CurrentChartArea.AxisX.MajorGrid.Enabled = majorXAxisToolStripMenuItem.Checked; + } + + private void majorYAxisToolStripMenuItem_Click(object sender, EventArgs e) + { + CurrentChartArea.AxisY.MajorGrid.Enabled = majorYAxisToolStripMenuItem.Checked; + } + + private void yAxisToolStripMenuItem_Click(object sender, EventArgs e) + { + RequestWindowForYAxis.numericUpDownMax.Value = (decimal)CurrentChartArea.AxisY.Maximum; + RequestWindowForYAxis.numericUpDownMin.Value = (decimal)CurrentChartArea.AxisY.Minimum; + + if (this.GraphType == eGraphType.HISTOGRAM) + { + RequestWindowForYAxis.label3.Visible = false; + RequestWindowForYAxis.numericUpDownMarkerSize.Visible = false; + } + + if (RequestWindowForYAxis.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + if (RequestWindowForYAxis.numericUpDownMax.Value <= RequestWindowForYAxis.numericUpDownMin.Value) return; + + CurrentChartArea.AxisY.Maximum = (double)RequestWindowForYAxis.numericUpDownMax.Value; + CurrentChartArea.AxisY.Minimum = (double)RequestWindowForYAxis.numericUpDownMin.Value; + + RedrawHisto(); + } + + private void xAxisToolStripMenuItem_Click(object sender, EventArgs e) + { + RequestWindowForXAxis.numericUpDownMax.Value = (decimal)CurrentChartArea.AxisX.Maximum; + RequestWindowForXAxis.numericUpDownMin.Value = (decimal)CurrentChartArea.AxisX.Minimum; + + if (this.GraphType == eGraphType.HISTOGRAM) + { + RequestWindowForXAxis.label3.Visible = false; + RequestWindowForXAxis.numericUpDownMarkerSize.Visible = false; + } + + + if (RequestWindowForXAxis.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + if (RequestWindowForXAxis.numericUpDownMax.Value <= RequestWindowForXAxis.numericUpDownMin.Value) return; + + CurrentChartArea.AxisX.Maximum = (double)RequestWindowForXAxis.numericUpDownMax.Value; + CurrentChartArea.AxisX.Minimum = (double)RequestWindowForXAxis.numericUpDownMin.Value; + + RedrawHisto(); + } + + private void shadowToolStripMenuItem_Click(object sender, EventArgs e) + { + this.IsShadow = shadowToolStripMenuItem.Checked; + RedrawHisto(); + } + + private void markerBorderToolStripMenuItem_Click(object sender, EventArgs e) + { + this.IsMarkerBorder = markerBorderToolStripMenuItem.Checked; + RedrawHisto(); + } + + private void displayStatisticsToolStripMenuItem_Click(object sender, EventArgs e) + { + this.IsDisplayStat = displayStatisticsToolStripMenuItem.Checked; + RedrawHisto(); + } + + + private void chart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + // contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(); + + + HitTestResult Res = this.chart.HitTest(e.X, e.Y, ChartElementType.DataPoint); + if (Res.Series == null) return; + + + + DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + + if ((PtToTransfer.Tag != null) && (PtToTransfer.Tag.GetType() == typeof(cWell))) + { + cWell TmpWell = (cWell)(PtToTransfer.Tag); + //ContextMenuStrip NewMenu = new System.Windows.Forms.ContextMenuStrip(); + + foreach (var item in TmpWell.GetExtendedContextMenu()) + contextMenuStrip.Items.Add(item); + + contextMenuStrip.Show(Control.MousePosition); + } + } + } + + private void chart_MouseDoubleClick(object sender, MouseEventArgs e) + { + HitTestResult Res = this.chart.HitTest(e.X, e.Y, ChartElementType.DataPoint); + if (Res.Series == null) return; + + DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + cExtendedList CurrentList = new cExtendedList(); + CurrentList.Name = Res.Series.Name; + + foreach (var item in Res.Series.Points) + { + CurrentList.Add(item.YValues[0]); + } + + cExtendedTable CT = new cExtendedTable(CurrentList); + CT.ListRowNames = new List(); + //foreach (var item in Res.Series.Points) + //{ + //} + + + + cViewerTable MyTable = new cViewerTable(); + MyTable.SetInputData(CT); + MyTable.Run(); + + cDesignerSinglePanel MyDesigner = new cDesignerSinglePanel(); + MyDesigner.SetInputData(MyTable.GetOutPut()); + MyDesigner.Run(); + + cDisplayToWindow MyDisplay = new cDisplayToWindow(); + MyDisplay.SetInputData(MyDesigner.GetOutPut()); + MyDisplay.Run(); + MyDisplay.Display(); + } + + + + } +} diff --git a/Classes/Base Classes/Viewers/2D/FormPanelForHisto.resx b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.resx new file mode 100644 index 0000000..2d8292b --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/FormPanelForHisto.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/Classes/Base Classes/Viewers/2D/cChart2DScatterPoint.cs b/Classes/Base Classes/Viewers/2D/cChart2DScatterPoint.cs new file mode 100644 index 0000000..4774762 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cChart2DScatterPoint.cs @@ -0,0 +1,431 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + + public class cChart2DScatterPoint : cGraphGeneral + { + protected ToolStripMenuItem SpecificContextMenu = null; + public bool IsLine = false; + public bool IsBar = false; + public bool ISPoint = true; + FormForSingleSlider SliderForMarkerSize = new FormForSingleSlider("Marker Size"); + FormForSingleSlider SliderForOpacity = new FormForSingleSlider("Marker Opacity"); + public int Opacity = 255; + public int MarkerSize = 10; + + public cChart2DScatterPoint() + { + base.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AssociatedChart_MouseClick); + } + + public void Run() + { + this.SliderForMarkerSize.trackBar.Value = this.MarkerSize; + this.SliderForMarkerSize.numericUpDown.Value = this.MarkerSize; + this.SliderForOpacity.numericUpDown.Maximum = this.SliderForOpacity.trackBar.Maximum = 255; + this.SliderForOpacity.trackBar.Value = this.Opacity; + this.SliderForOpacity.numericUpDown.Value = this.Opacity; + RefreshDisplay(); + } + + + public int IdxDesc0 = 0; + public int IdxDesc1 = 1; + public int IdxDescForMarkerSize = -1; + + public void RefreshDisplay() + { + if (input.Count == 0) return; + + Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input.Name); + + base.LabelAxisX = input[IdxDesc0].Name; + if (this.input.Count <= IdxDesc1) IdxDesc1 = this.input.Count - 1; + base.LabelAxisY = input[IdxDesc1].Name; + + NewSerie.ChartType = SeriesChartType.Point; + + double _MinY = double.MaxValue; + double _MinX = double.MaxValue; + double _MaxX = double.MinValue; + double _MaxY = double.MinValue; + + double TmpMinX, TmpMinY, TmpMaxX, TmpMaxY; + double TMp; + + double MinVolume = 0; + double MaxVolume = 0; + if (this.IdxDescForMarkerSize >= 0) + { + MinVolume = this.input[this.IdxDescForMarkerSize].Min(); + MaxVolume = this.input[this.IdxDescForMarkerSize].Max(); + } + + + + for (int j = 0; j < this.input[0].Count; j++) + { + DataPoint DP = new DataPoint(); + + TMp = this.input[IdxDesc0][j]; + if (TMp < _MinX) _MinX = TMp; + else if (TMp > _MaxX) _MaxX = TMp; + DP.XValue = TMp; + + double[] Value = new double[1]; + TMp = this.input[IdxDesc1][j]; + + if (TMp < _MinY) _MinY = TMp; + else if (TMp > _MaxY) _MaxY = TMp; + + Value[0] = TMp; + DP.YValues = Value; + if (this.IdxDescForMarkerSize < 0) + DP.MarkerSize = this.MarkerSize; + else + { + // DP.MarkerSize = this.MarkerSize * 2; + int MarkerArea = (int)((50 * (this.input[this.IdxDescForMarkerSize][j] - MinVolume)) / (MaxVolume - MinVolume)); + DP.MarkerSize = MarkerArea + this.MarkerSize; + + } + + DP.MarkerStyle = MarkerStyle.Circle; + + if (IsBorder) + { + DP.MarkerBorderColor = Color.Black; + DP.MarkerBorderWidth = 1; + } + + if (this.input[0].ListTags != null) + { + if (j >= this.input[0].ListTags.Count) continue; + DP.Tag = this.input[0].ListTags[j]; + + if (DP.Tag.GetType() == typeof(cWell)) + { + DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cWell)(DP.Tag)).GetShortInfo() + Value[0]; + } + if (DP.Tag.GetType() == typeof(cSingleBiologicalObject)) + { + DP.Color = ((cSingleBiologicalObject)(DP.Tag)).GetColor(); + DP.ToolTip = ((cSingleBiologicalObject)(DP.Tag)).GetAssociatedPhenotype().Name + "\nValue: (" + DP.XValue.ToString("N2") + ":" + DP.YValues[0].ToString("N2") + ")"; + } + if (DP.Tag.GetType() == typeof(cDescriptorsType)) + { + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cDescriptorsType)(DP.Tag)).GetShortInfo() + Value[0]; + DP.AxisLabel = ((cDescriptorsType)(DP.Tag)).GetName(); + base.CurrentChartArea.AxisX.Interval = 1; + } + if (DP.Tag.GetType() == typeof(cPlate)) + { + // DP.Color = ((cWell)(DP.Tag)).GetClassColor(); + DP.ToolTip = ((cPlate)(DP.Tag)).Name + " : " + Value[0]; + DP.AxisLabel = ((cPlate)(DP.Tag)).Name; + base.CurrentChartArea.AxisX.Interval = 1; + } + } + NewSerie.Points.Add(DP); + } + + base.CurrentSeries.Clear(); + base.CurrentSeries.Add(NewSerie); + base.Run(); + base.ChartAreas[0].AxisX.Minimum = _MinX; + base.ChartAreas[0].AxisY.Minimum = _MinY; + + base.ChartAreas[0].AxisX.Maximum = _MaxX; + base.ChartAreas[0].AxisY.Maximum = _MaxY; + + base.CurrentTitle.Text = input.Name + " - " + base.LabelAxisX + " vs. " + base.LabelAxisY + " (" + this.input[0].Count + " points)"; + + } + + #region Context Menu + public ToolStripMenuItem GetContextMenu() + { + SpecificContextMenu = new ToolStripMenuItem("Graph Options"); + + //ToolStripMenuItem ToolStripMenuItem_ChartLine = new ToolStripMenuItem("Line"); + //ToolStripMenuItem_ChartLine.CheckOnClick = true; + //ToolStripMenuItem_ChartLine.Click += new System.EventHandler(this.ToolStripMenuItem_ChartLine); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartLine); + + //ToolStripMenuItem ToolStripMenuItem_ChartBar = new ToolStripMenuItem("Bar"); + //ToolStripMenuItem_ChartBar.CheckOnClick = true; + //ToolStripMenuItem_ChartBar.Click += new System.EventHandler(this.ToolStripMenuItem_ChartBar); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartBar); + + //ToolStripMenuItem ToolStripMenuItem_ChartPoint = new ToolStripMenuItem("Point"); + //ToolStripMenuItem_ChartPoint.CheckOnClick = true; + //ToolStripMenuItem_ChartPoint.Click += new System.EventHandler(this.ToolStripMenuItem_ChartPoint); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartPoint); + + // SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_ChartOpacity = new ToolStripMenuItem("Opacity"); + ToolStripMenuItem_ChartOpacity.Click += new System.EventHandler(this.ToolStripMenuItem_ChartOpacity); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChartOpacity); + + ToolStripMenuItem ToolStripMenuItem_MarkerSize = new ToolStripMenuItem("Marker Size"); + ToolStripMenuItem_MarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_MarkerSize); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSize); + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_XAxis = new ToolStripMenuItem("X-Axis"); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_XAxis); + + int IdxDesc = 0; + foreach (var item in this.input) + { + ToolStripMenuItem ToolStripMenuItem_DescX = new ToolStripMenuItem(item.Name); + ToolStripMenuItem_DescX.Tag = IdxDesc++; + ToolStripMenuItem_DescX.Click += new System.EventHandler(this.ToolStripMenuItem_DescX); + ToolStripMenuItem_XAxis.DropDownItems.Add(ToolStripMenuItem_DescX); + + } + + ToolStripMenuItem ToolStripMenuItem_YAxis = new ToolStripMenuItem("Y-Axis"); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_YAxis); + + IdxDesc = 0; + foreach (var item in this.input) + { + ToolStripMenuItem ToolStripMenuItem_DescY = new ToolStripMenuItem(item.Name); + ToolStripMenuItem_DescY.Tag = IdxDesc++; + ToolStripMenuItem_DescY.Click += new System.EventHandler(this.ToolStripMenuItem_DescY); + ToolStripMenuItem_YAxis.DropDownItems.Add(ToolStripMenuItem_DescY); + + } + + + ToolStripMenuItem ToolStripMenuItem_MarkerSizeType = new ToolStripMenuItem("Marker Size Type"); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_MarkerSizeType); + + IdxDesc = -1; + + ToolStripMenuItem ToolStripMenuItem_DescMarkerSize = new ToolStripMenuItem("Constant"); + ToolStripMenuItem_DescMarkerSize.Tag = IdxDesc++; + ToolStripMenuItem_DescMarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_DescMarkerSize); + ToolStripMenuItem_MarkerSizeType.DropDownItems.Add(ToolStripMenuItem_DescMarkerSize); + + ToolStripSeparator TS = new ToolStripSeparator(); + ToolStripMenuItem_MarkerSizeType.DropDownItems.Add(TS); + + foreach (var item in this.input) + { + ToolStripMenuItem_DescMarkerSize = new ToolStripMenuItem(item.Name); + ToolStripMenuItem_DescMarkerSize.Tag = IdxDesc++; + ToolStripMenuItem_DescMarkerSize.Click += new System.EventHandler(this.ToolStripMenuItem_DescMarkerSize); + ToolStripMenuItem_MarkerSizeType.DropDownItems.Add(ToolStripMenuItem_DescMarkerSize); + + } + return this.SpecificContextMenu; + } + + private void ToolStripMenuItem_DescMarkerSize(object sender, EventArgs e) + { + this.IdxDescForMarkerSize = (int)(((ToolStripMenuItem)(sender)).Tag); + RefreshDisplay(); + } + + private void ToolStripMenuItem_DescX(object sender, EventArgs e) + { + this.IdxDesc0 = (int)(((ToolStripMenuItem)(sender)).Tag); + RefreshDisplay(); + } + + private void ToolStripMenuItem_DescY(object sender, EventArgs e) + { + this.IdxDesc1 = (int)(((ToolStripMenuItem)(sender)).Tag); + RefreshDisplay(); + } + + + private void ToolStripMenuItem_MarkerSize(object sender, EventArgs e) + { + if (this.SliderForMarkerSize.ShowDialog() != DialogResult.OK) return; + this.MarkerSize = (int)this.SliderForMarkerSize.numericUpDown.Value; + + // for (int j = 0; j < this.input.Count; j++) + { + foreach (var item in this.Series[0].Points) + item.MarkerSize = this.MarkerSize; + } + } + + private void ToolStripMenuItem_ChartOpacity(object sender, EventArgs e) + { + if (this.SliderForOpacity.ShowDialog() != DialogResult.OK) return; + this.Opacity = (int)this.SliderForOpacity.numericUpDown.Value; + + + //for (int j = 0; j < this.input.Count; j++) + foreach (var item in this.Series[0].Points) + { + Color C = item.Color; + item.Color = Color.FromArgb(this.Opacity, C); + } + + } + + //private void ToolStripMenuItem_ChartBar(object sender, EventArgs e) + //{ + // IsBar = !IsBar; + // for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + // { + // // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + // base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Column; + // } + // base.Update(); + //} + + private void ToolStripMenuItem_ChartPoint(object sender, EventArgs e) + { + ISPoint = !ISPoint; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Point; + + foreach (var item in base.CurrentSeries[IdxSerie].Points) + { + item.MarkerStyle = MarkerStyle.Circle; + } + } + base.Update(); + } + + private void ToolStripMenuItem_ChartLine(object sender, EventArgs e) + { + IsLine = !IsLine; + + for (int IdxSerie = 0; IdxSerie < base.CurrentSeries.Count; IdxSerie++) + { + // Series NewSerie = new System.Windows.Forms.DataVisualization.Charting.Series(base.input[IdxSerie].Name); + base.CurrentSeries[IdxSerie].ChartType = SeriesChartType.Line; + } + base.Update(); + } + + private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) + { + if (e.Clicks != 1) return; + + if (e.Button != MouseButtons.Right) return; + + ContextMenuStrip NewMenu = new ContextMenuStrip(); + foreach (var item in base.GetContextMenu(e)) + NewMenu.Items.Add(item); + + NewMenu.Items.Add(this.GetContextMenu()); + + #region Selection process + double MaxX = this.ChartAreas[0].CursorX.SelectionEnd; + double MinX = this.ChartAreas[0].CursorX.SelectionStart; + + if (MaxX < MinX) + { + MinX = this.ChartAreas[0].CursorX.SelectionEnd; + MaxX = this.ChartAreas[0].CursorX.SelectionStart; + } + + double MaxY = this.ChartAreas[0].CursorY.SelectionEnd; + double MinY = this.ChartAreas[0].CursorY.SelectionStart; + + if (MaxY < MinY) + { + MinY = this.ChartAreas[0].CursorY.SelectionEnd; + MaxY = this.ChartAreas[0].CursorY.SelectionStart; + } + + cListWell ListWells = new cListWell(this); + List LDP = new List(); + //cListWell ListWellsToProcess = new cListWell(); + + + foreach (DataPoint item in this.Series[0].Points) + { + if ((item.XValue >= MinX) && (item.XValue <= MaxX) && (item.YValues[0] >= MinY) && (item.YValues[0] <= MaxY)) + { + if ((item.Tag != null) && (item.Tag.GetType() == typeof(cWell))) + { + ListWells.Add((cWell)(item.Tag)); + LDP.Add(item); + } + } + } + + if (LDP.Count > 0) + { + ToolStripMenuItem SpecificContextMenu = ListWells.GetContextMenu(); //new ToolStripMenuItem("List " + LDP.Count + " wells"); + //ToolStripMenuItem ToolStripMenuItem_ChangeClass = ListWells.GetContextMenu();// new ToolStripMenuItem("Classes"); + //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + //cWell TmpWell = (cWell)(LDP[0].Tag); + + //for (int i = 0; i < TmpWell.Parent.GlobalInfo.ListWellClasses.Count; i++) + //{ + // ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(TmpWell.Parent.GlobalInfo.ListWellClasses[i].Name); + // ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + // ToolStripMenuItem_NewClass.Tag = LDP; + // ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + //} + NewMenu.Items.Add(SpecificContextMenu); + } + #endregion + + + NewMenu.DropShadowEnabled = true; + NewMenu.Show(Control.MousePosition); + } + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + ToolStripMenuItem ParentMenu = (ToolStripMenuItem)(sender); + int Classe = 0; + int ResultClasse = -1; + + List DP = (List)(ParentMenu.Tag); + + foreach (var Class in ((cWell)(DP[0].Tag)).Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + Classe++; + } + + foreach (var item in DP) + { + ((cWell)(item.Tag)).SetClass(ResultClasse); + item.Color = ((cWell)(item.Tag)).GetClassColor(); + } + ((cWell)(DP[0].Tag)).Parent.GetCurrentDisplayPlate().DisplayDistribution(((cWell)(DP[0].Tag)).Parent.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + #endregion + } + +} diff --git a/Classes/Base Classes/Viewers/2D/cPanelHisto.cs b/Classes/Base Classes/Viewers/2D/cPanelHisto.cs new file mode 100644 index 0000000..5860bef --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cPanelHisto.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using HCSAnalyzer.Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic +{ + public enum eOrientation { HORIZONTAL, VERTICAL }; + public enum eGraphType { HISTOGRAM, LINE }; + + class cPanelHisto + { + public FormPanelForHisto WindowForPanelHisto;// = new FormPanelForHisto(List ListValues); + + public cPanelHisto(List ListValues, bool IsStacked, eGraphType GraphType, eOrientation HistoOrientation) + { + WindowForPanelHisto = new FormPanelForHisto(ListValues, IsStacked,GraphType, HistoOrientation); + } + + public cPanelHisto(cExtendedList ListValues,eGraphType GraphType, eOrientation HistoOrientation) + { + WindowForPanelHisto = new FormPanelForHisto(new List(){ListValues}, false,GraphType, HistoOrientation); + } + + //public System.Windows.Forms.Control GetPanel() + //{ + // return this.WindowForPanelHisto.panel.Controls["panel"]; + //} + } +} diff --git a/Classes/Base Classes/Viewers/2D/cViewer2DScatterPoint.cs b/Classes/Base Classes/Viewers/2D/cViewer2DScatterPoint.cs new file mode 100644 index 0000000..a3205d7 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cViewer2DScatterPoint.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewer2DScatterPoint : cDataDisplay + { + public cChart2DScatterPoint Chart = new cChart2DScatterPoint(); + + public cViewer2DScatterPoint() + { + this.Title = "2D scatter point viewer"; + } + + public void SetInputData(cExtendedTable input) + { + Chart.input = input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + this.CurrentPanel.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); + + Chart.Run(); + + CurrentPanel.Controls.Add(Chart); + return ToReturn; + } + } +} diff --git a/Classes/Base Classes/Viewers/2D/cViewerGraph.cs b/Classes/Base Classes/Viewers/2D/cViewerGraph.cs new file mode 100644 index 0000000..948bd64 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cViewerGraph.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerGraph : cDataDisplay + { + cPanelHisto CurrentPanelHisto; + public eOrientation Orientation = eOrientation.HORIZONTAL; + + public cViewerGraph() + { + this.Title = "Graph Viewer"; + } + + public void SetInputData(cExtendedTable ListValues) + { + CurrentPanelHisto = new cPanelHisto(ListValues, true, eGraphType.LINE, this.Orientation); + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Title = this.Title; + + this.CurrentPanel.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); + + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Width = CurrentPanel.Width-50; + //CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer.Height = CurrentPanel.Height-5; + + CurrentPanel.Controls.Add(CurrentPanelHisto.WindowForPanelHisto.panelForGraphContainer); + return ToReturn; + } + + } +} diff --git a/Classes/Base Classes/Viewers/2D/cViewerHeatMap.cs b/Classes/Base Classes/Viewers/2D/cViewerHeatMap.cs new file mode 100644 index 0000000..8609eb1 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cViewerHeatMap.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms.DataVisualization.Charting; +using System.Drawing; +using HCSAnalyzer.Classes.Base_Classes.General; +using System.Windows.Forms; +using HCSAnalyzer.Classes.MetaComponents; +using LibPlateAnalysis; +using System.IO; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerHeatMap : cDataDisplay + { + public cViewerHeatMap() + { + base.Title = "Heat Map Viewer"; + CurrentLUT = LUT.LUT_JET; + } + + public cGlobalInfo GlobalInfo; + + cExtendedTable Input; + //cExtendedControl CurrentPanel; + cLookUpTable LUT = new cLookUpTable(); + public byte[][] CurrentLUT; + + #region public Parameters + public int DigitNumber = 2; + public int SquareSize = 35; + public bool IsDisplayValues = false; + + public double Max = 1; + public double Min = 0; + public bool IsAutomatedMinMax = true; + + public MarkerStyle Marker_Style = MarkerStyle.Square; + #endregion + + public void SetInputData(cExtendedTable InputTable) + { + base.Title += ": " + InputTable.Name; + this.Input = InputTable; + } + + Chart ChartToBeIncluded; + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + ChartToBeIncluded = GenerateGraph(); + ChartToBeIncluded.MouseClick += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown); + + ChartToBeIncluded.Width = base.CurrentPanel.Width; + ChartToBeIncluded.Height = base.CurrentPanel.Height; + + base.CurrentPanel.Title = this.Title; + base.CurrentPanel.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))); + + CurrentPanel.Controls.Add(ChartToBeIncluded); + // CurrentPanel.Height = ChartToBeIncluded.Height; + // CurrentPanel.Width = ChartToBeIncluded.Width; + + return ToReturn; + } + + ToolStripMenuItem ToolStripMenuItem_DisplayOptionsDispValues; + + private void chart_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + CompleteMenu = new ContextMenuStrip(); + + ToolStripMenuItem ToolStripMenuItem_DisplayTable = new ToolStripMenuItem("Display Table"); + CompleteMenu.Items.Add(ToolStripMenuItem_DisplayTable); + ToolStripMenuItem_DisplayTable.Click += new System.EventHandler(this.DisplayTable); + ToolStripMenuItem ToolStripMenuItem_DisplayElevationMap = new ToolStripMenuItem("Display Elevation Map"); + CompleteMenu.Items.Add(ToolStripMenuItem_DisplayElevationMap); + ToolStripMenuItem_DisplayElevationMap.Click += new System.EventHandler(this.DisplayElevationMap); + + + #region display options + + ToolStripMenuItem ToolStripMenuItem_DisplayOptions = new ToolStripMenuItem("Display options"); + CompleteMenu.Items.Add(ToolStripMenuItem_DisplayOptions); + + this.ToolStripMenuItem_DisplayOptionsDispValues = new ToolStripMenuItem("Display values"); + ToolStripMenuItem_DisplayOptionsDispValues.CheckOnClick = true; + ToolStripMenuItem_DisplayOptionsDispValues.Checked = this.IsDisplayValues; + ToolStripMenuItem_DisplayOptions.DropDownItems.Add(ToolStripMenuItem_DisplayOptionsDispValues); + ToolStripMenuItem_DisplayOptionsDispValues.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayOptionsDisValues); + + #endregion + + HitTestResult Res = this.ChartToBeIncluded.HitTest(e.X, e.Y, ChartElementType.DataPoint); + + if (Res.Series != null) + { + DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + + if ((PtToTransfer.Tag != null) && (PtToTransfer.Tag.GetType() == typeof(cWell))) + { + cWell TmpWell = (cWell)(PtToTransfer.Tag); + foreach (var item in TmpWell.GetExtendedContextMenu()) + CompleteMenu.Items.Add(item); + } + } + CompleteMenu.Show(Control.MousePosition); + } + } + + private void DisplayTable(object sender, EventArgs e) + { + cDisplayExtendedTable CDET = new cDisplayExtendedTable(); + CDET.Set_Data(this.Input); + CDET.Title = this.Title; + CDET.Run(); + } + + private void ToolStripMenuItem_DisplayOptionsDisValues(object sender, EventArgs e) + { + this.IsDisplayValues = ToolStripMenuItem_DisplayOptionsDispValues.Checked; + + foreach (var item in this.ChartToBeIncluded.Series) + foreach (var Pt in item.Points) + { + Pt.LabelFormat = "N" + DigitNumber; + Pt.IsValueShownAsLabel = this.IsDisplayValues; + } + } + + private void DisplayElevationMap(object sender, EventArgs e) + { + cViewerElevationMap3D VE = new cViewerElevationMap3D(); + VE.SetInputData(this.Input); + if (VE.Run().IsSucceed == false) return; + + cDesignerSinglePanel CD = new cDesignerSinglePanel(); + CD.SetInputData(VE.GetOutPut()); + if (CD.Run().IsSucceed == false) return; + + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(CD.GetOutPut()); + CDW.Title = this.Title + ": Elevation Map"; + if (CDW.Run().IsSucceed == false) return; + CDW.Display(); + } + + Series CurrentSeries; + + private Chart GenerateGraph() + { + Chart ChartToBeReturned = new Chart(); + int IdxValue = 0; + + if (IsAutomatedMinMax) + { + Max = this.Input.Max(); + Min = this.Input.Min(); + } + + CurrentSeries = new Series(); + CurrentSeries.ChartType = SeriesChartType.Point; + // loop on all the desciptors + for (int idxCol = 0; idxCol < Input.Count; idxCol++) + { + for (int idxRow = 0; idxRow < Input[idxCol].Count; idxRow++) + { + CurrentSeries.Points.AddXY(idxCol + 1, idxRow + 1); + CurrentSeries.Points[IdxValue].MarkerStyle = Marker_Style; + CurrentSeries.Points[IdxValue].MarkerSize = SquareSize; + CurrentSeries.Points[IdxValue].BorderColor = Color.Black; + CurrentSeries.Points[IdxValue].BorderWidth = 1; + if (Input[idxCol].ListTags != null) + CurrentSeries.Points[IdxValue].Tag = Input[idxCol].ListTags[idxRow]; + + double Value = this.Input[idxCol][idxRow]; + + if (this.IsDisplayValues) + CurrentSeries.Points[IdxValue].Label = Value.ToString("N" + DigitNumber);// string.Format("{0:0.###}", Math.Abs(Value)); + + CurrentSeries.Points[IdxValue].ToolTip = Value.ToString("N" + DigitNumber); + + + if (Max != Min) + { + int ConvertedValue = (int)((Value - Min) / (Max - Min) * (CurrentLUT[0].Length - 1)); + CurrentSeries.Points[IdxValue].Color = Color.FromArgb(CurrentLUT[0][ConvertedValue], CurrentLUT[1][ConvertedValue], CurrentLUT[2][ConvertedValue]); + + if (this.IsDisplayValues) + { + CurrentSeries.Points[IdxValue].LabelFormat = "N" + DigitNumber; + CurrentSeries.Points[IdxValue].IsValueShownAsLabel = true; + CurrentSeries.Points[IdxValue].Font = new Font("Arial", 8); + } + } + else + CurrentSeries.Points[IdxValue].Color = Color.Transparent; + + CurrentSeries.Points[IdxValue++].AxisLabel = this.Input[idxCol].Name; + } + } + + + SmartLabelStyle SStyle = new SmartLabelStyle(); + + ChartArea CurrentChartArea = new ChartArea("Default"); + for (int i = 0; i < this.Input.ListRowNames.Count; i++) + { + CustomLabel lblY = new CustomLabel(); + lblY.ToPosition = i * 2 + 2; + lblY.Text = this.Input.ListRowNames[i]; + CurrentChartArea.AxisY.CustomLabels.Add(lblY); + } + + CurrentChartArea.AxisY.LabelAutoFitStyle = LabelAutoFitStyles.LabelsAngleStep30; + CurrentChartArea.BorderColor = Color.Black; + ChartToBeReturned.ChartAreas.Add(CurrentChartArea); + CurrentSeries.SmartLabelStyle.Enabled = true; + + ChartToBeReturned.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + ChartToBeReturned.Series.Add(CurrentSeries); + + CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + CurrentChartArea.Axes[0].Minimum = 0; + CurrentChartArea.Axes[0].Maximum = this.Input.Count + 1; + CurrentChartArea.Axes[1].MajorGrid.Enabled = false; + CurrentChartArea.Axes[1].Minimum = 0; + CurrentChartArea.Axes[1].Maximum = this.Input.ListRowNames.Count + 1; + CurrentChartArea.AxisX.Interval = 1; + CurrentChartArea.AxisY.Interval = 1; + + Title CurrentTitle = new Title(this.Input.Name); + ChartToBeReturned.Titles.Add(CurrentTitle); + ChartToBeReturned.Titles[0].Font = new Font("Arial", 9); + + ChartToBeReturned.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); + + if ((IsWellClassLegend) || (IsCellularPhenotypeLegend)) + { + Legend MyLegend = new Legend(); + ChartToBeReturned.Legends.Add(MyLegend); + ChartToBeReturned.Legends[0].ShadowOffset = 5; + ChartToBeReturned.CustomizeLegend += new EventHandler(ChartToBeReturned_CustomizeLegend); + } + return ChartToBeReturned; + } + + public bool IsWellClassLegend = false; + public bool IsCellularPhenotypeLegend = false; + + void ChartToBeReturned_CustomizeLegend(object sender, CustomizeLegendEventArgs e) + { + + + e.LegendItems.Clear(); + + if (IsWellClassLegend) + { + foreach (var item in GlobalInfo.ListWellClasses) + { + LegendItem newItem = new LegendItem(); + newItem.ImageStyle = LegendImageStyle.Marker; + newItem.MarkerStyle = MarkerStyle.Square; + newItem.MarkerSize = 8; + newItem.MarkerBorderColor = newItem.MarkerColor = item.ColourForDisplay; + newItem.ShadowColor = Color.Black; + newItem.ShadowOffset = 1; + newItem.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.MiddleLeft); + newItem.Cells.Add(LegendCellType.Text, item.Name, ContentAlignment.MiddleLeft); + e.LegendItems.Add(newItem); + } + } + if (IsCellularPhenotypeLegend) + { + foreach (var item in GlobalInfo.ListCellularPhenotypes) + { + LegendItem newItem = new LegendItem(); + newItem.ImageStyle = LegendImageStyle.Marker; + newItem.MarkerStyle = MarkerStyle.Square; + newItem.MarkerSize = 8; + newItem.MarkerBorderColor = newItem.MarkerColor = item.ColourForDisplay; + newItem.ShadowColor = Color.Black; + newItem.ShadowOffset = 1; + newItem.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.MiddleLeft); + newItem.Cells.Add(LegendCellType.Text, item.Name, ContentAlignment.MiddleLeft); + e.LegendItems.Add(newItem); + } + + + } + + //e.LegendItems.Add( + + } + + + + + + } +} diff --git a/Classes/Base Classes/Viewers/2D/cViewerHisto.cs b/Classes/Base Classes/Viewers/2D/cViewerHisto.cs new file mode 100644 index 0000000..5960b43 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cViewerHisto.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.TMP_ToBeRemoved; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerHisto : cDataDisplay + { + public cViewerHisto() + { + + } + + FormTMP TMPWin = new FormTMP(); + + public void SetInputData(List ListValues) + { + cPanelHisto PanelHisto = new cPanelHisto(ListValues, true, eGraphType.HISTOGRAM, eOrientation.HORIZONTAL); + + // cDisplayHisto CpdToDisplayHisto = new cDisplayHisto(); + TMPWin.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + + //TMPWin.panel.Controls.Add(CpdToDisplayHisto); + + + } + + public void Display() + { + TMPWin.Show(); + } + + } +} diff --git a/Classes/Base Classes/Viewers/2D/cViewerScatter2D.cs b/Classes/Base Classes/Viewers/2D/cViewerScatter2D.cs new file mode 100644 index 0000000..2611e39 --- /dev/null +++ b/Classes/Base Classes/Viewers/2D/cViewerScatter2D.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + public class cViewerScatter2D : cDataDisplay + { + public cViewerScatter2D() + { + Title = "New Viewer Scatter"; + } + + cExtendedTable InputData = null; + + public void SetInputData(cExtendedTable Input) + { + this.InputData = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + return ToReturn; + } + } +} diff --git a/Classes/Base Classes/Viewers/3D/cViewerElevationMap3D.cs b/Classes/Base Classes/Viewers/3D/cViewerElevationMap3D.cs new file mode 100644 index 0000000..00d73b4 --- /dev/null +++ b/Classes/Base Classes/Viewers/3D/cViewerElevationMap3D.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.MetaComponents; +using Kitware.VTK; +using System.Windows.Forms; +using System.Drawing; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerElevationMap3D : cDataDisplay + { + public cViewerElevationMap3D() + { + base.Title = "3D Elevation Map Viewer"; + } + + cExtendedTable Input; + + #region public Parameters + public Color BackGroundColor = Color.White; + #endregion + + public void SetInputData(cExtendedTable InputTable) + { + base.Title += ": " + InputTable.Name; + this.Input = InputTable; + } + RenderWindowControl renderWindowControl1; + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + //CurrentLUT = LUT.LUT_JET; + // Kitware.VTK.RenderWindowControl VTKView = GenerateGraph(); + renderWindowControl1 = new RenderWindowControl(); + renderWindowControl1.Load += new EventHandler(renderWindowControl1_Load); + + renderWindowControl1.Width = base.CurrentPanel.Width; + renderWindowControl1.Height = base.CurrentPanel.Height; + + base.CurrentPanel.Title = this.Title; + base.CurrentPanel.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); + + + renderWindowControl1.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); + + ContextMenuStrip HeatMapContextMenu = new ContextMenuStrip(); + ToolStripMenuItem ToolStripMenuItem_DisplayTable = new ToolStripMenuItem("Display Table"); + HeatMapContextMenu.Items.Add(ToolStripMenuItem_DisplayTable); + ToolStripMenuItem_DisplayTable.Click += new System.EventHandler(this.DisplayTable); + CurrentPanel.ContextMenuStrip = HeatMapContextMenu; + + CurrentPanel.Controls.Add(renderWindowControl1); + + return ToReturn; + } + + private void DisplayTable(object sender, EventArgs e) + { + cDisplayExtendedTable CDET = new cDisplayExtendedTable(); + CDET.Set_Data(this.Input); + CDET.Run(); + + } + + private void renderWindowControl1_Load(object sender, EventArgs e) + { + try + { + GenerateGraph(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK); + } + } + + + private void GenerateGraph() + { + // get a reference to the renderwindow of our renderWindowControl1 + vtkRenderWindow RenderWindow = renderWindowControl1.RenderWindow; + // get a reference to the renderer + vtkRenderer Renderer = RenderWindow.GetRenderers().GetFirstRenderer(); + vtkPoints points = vtkPoints.New(); + + + double MaxZ = this.Input.Max(); + double MinZ = this.Input.Min(); + + + for (int IdxY = 0; IdxY < this.Input.Count; IdxY++) + for (int IdxX = 0; IdxX < this.Input[IdxY].Count; IdxX++) + { + points.InsertNextPoint(IdxY, IdxX, ((this.Input[IdxY][IdxX]-MinZ)/(MaxZ-MinZ)*this.Input.Count)/2); + } + + double[] bounds = points.GetBounds(); + + // Add the grid points to a polydata object + vtkPolyData inputPolyData = vtkPolyData.New(); + inputPolyData.SetPoints(points); + + // Triangulate the grid points + vtkDelaunay2D delaunay = vtkDelaunay2D.New(); + delaunay.SetInput(inputPolyData); + delaunay.Update(); + + vtkElevationFilter elevationFilter = vtkElevationFilter.New(); + elevationFilter.SetInputConnection(delaunay.GetOutputPort()); + elevationFilter.SetLowPoint(0.0, 0.0, bounds[4]); + elevationFilter.SetHighPoint(0.0, 0.0, bounds[5]); + elevationFilter.Update(); + + vtkPolyData output = vtkPolyData.New(); + output.ShallowCopy(vtkPolyData.SafeDownCast(elevationFilter.GetOutput())); + + // Create the color map + vtkLookupTable colorLookupTable = vtkLookupTable.New(); + colorLookupTable.SetTableRange(bounds[4], bounds[5]); + colorLookupTable.Build(); + + // Generate the colors for each point based on the color map + //vtkUnsignedCharArray colors = vtkUnsignedCharArray.New(); + //colors.SetNumberOfComponents(3); + //colors.SetName("Colors"); + //output.GetPointData().AddArray(colors); + + // Visualize + vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); + + mapper.SetInput(output); + vtkActor NewActor = vtkActor.New(); + NewActor.SetMapper(mapper); + Renderer.AddActor(NewActor); + + // set background color + Renderer.SetBackground(BackGroundColor.R / 255.0, BackGroundColor.G / 255.0, BackGroundColor.B / 255.0); + + // ensure all actors are visible (in this example not necessarely needed, + // but in case more than one actor needs to be shown it might be a good idea) + Renderer.ResetCamera(); + } + } +} diff --git a/Classes/Base Classes/Viewers/3D/cViewerScatter3D.cs b/Classes/Base Classes/Viewers/3D/cViewerScatter3D.cs new file mode 100644 index 0000000..924ca5c --- /dev/null +++ b/Classes/Base Classes/Viewers/3D/cViewerScatter3D.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Forms; +using System.Windows.Forms; +using HCSAnalyzer.Forms._3D; +using LibPlateAnalysis; +using Kitware.VTK; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using System.Windows.Forms.DataVisualization.Charting; +using System.Drawing; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerScatter3D : cDataDisplay + { + cGlobalInfo GlobalInfo; + + public cViewerScatter3D(cGlobalInfo GlobalInfo) + { + Title = "New Viewer Scatter 3D"; + this.GlobalInfo = GlobalInfo; + } + + FormFor3DDataDisplay FormToDisplayXYZ; + + public void SetInputData(List MyData) + { + //FDT = new FormToDisplayDataTable(MyData); + } + + public void Run() + { + FormToDisplayXYZ = new FormFor3DDataDisplay(false, this.GlobalInfo.CurrentScreen); + for (int i = 0; i < (int)this.GlobalInfo.CurrentScreen.ListDescriptors.Count; i++) + { + FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(this.GlobalInfo.CurrentScreen.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(this.GlobalInfo.CurrentScreen.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(this.GlobalInfo.CurrentScreen.ListDescriptors[i].GetName()); + } + } + + public void Display() + { + FormToDisplayXYZ.Show(); + } + } +} diff --git a/Classes/Base Classes/Viewers/Designers/cDesignerColumn.cs b/Classes/Base Classes/Viewers/Designers/cDesignerColumn.cs new file mode 100644 index 0000000..d851511 --- /dev/null +++ b/Classes/Base Classes/Viewers/Designers/cDesignerColumn.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.Viewers; + +namespace HCSAnalyzer.Classes.Base_Classes + { + class cDesignerColumn : cDesignerParent + { + + public Orientation Orientation = Orientation.Horizontal; + List xListControl = new List(); + + public cDesignerColumn() + { + this.Title = "Column Designer"; + } + + public void SetInputData(cExtendedControl ControlToAdd) + { + this.xListControl.Add(ControlToAdd); + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + if (xListControl.Count == 0) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + + this.OutPut = new cExtendedControl(); + + TableLayoutPanel NewPanel = new TableLayoutPanel(); + + //NewPanel.columns + //NewPanel.ColumnStyles = new TableLayoutColumnStyleCollection(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F); + + NewPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; + NewPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink; + NewPanel.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); + + + for (int IDx = 0; IDx < this.xListControl.Count; IDx++) + { + NewPanel.Controls.Add(this.xListControl[IDx], IDx, 0); + } + + + + + // Panel NewPanel = new Panel(); + // NewPanel.Location = new System.Drawing.Point(0, 0); + // NewPanel.Width = 100; + // NewPanel.Height = 100 * this.xListControl.Count; + // NewPanel.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); + + // //cExtendedControl Tmp1 = this.CreatePanel(xListControl[0], xListControl[1]); + + // for (int IDx = 0; IDx < this.xListControl.Count; IDx++) + // { + // this.xListControl[IDx].Anchor = AnchorStyles.None; + // Panel TmpPanel = new Panel(); + // TmpPanel.Location = new System.Drawing.Point(0, IDx * 100); + // TmpPanel.Width = 100; + // TmpPanel.Height = 100; + // TmpPanel.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); + + // TmpPanel.BorderStyle = BorderStyle.FixedSingle; + // TmpPanel.Controls.Add(this.xListControl[IDx]); + // TmpPanel.Dock = (DockStyle)( DockStyle.Top | DockStyle.Bottom); + + // //this.xListControl[IDx].Width = 100; + // //this.xListControl[IDx].Height = 100; + // //this.xListControl[IDx].Location = new System.Drawing.Point(0, 0); + // this.xListControl[IDx].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); + // NewPanel.Controls.Add(TmpPanel); + + // //Tmp1 = this.CreatePanel(Tmp1, xListControl[IDx]); + // } + // NewPanel.AutoScroll = true; + this.OutPut.Controls.Add(NewPanel); + return ToReturn; + } + + } + +} diff --git a/Classes/Base Classes/Viewers/Designers/cDesignerParent.cs b/Classes/Base Classes/Viewers/Designers/cDesignerParent.cs new file mode 100644 index 0000000..3623764 --- /dev/null +++ b/Classes/Base Classes/Viewers/Designers/cDesignerParent.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + public abstract class cDesignerParent : cComponent + { + + protected cExtendedControl OutPut; + + public cExtendedControl GetOutPut() + { + return this.OutPut; + } + + } +} diff --git a/Classes/Base Classes/Viewers/Designers/cDesignerSinglePanel.cs b/Classes/Base Classes/Viewers/Designers/cDesignerSinglePanel.cs new file mode 100644 index 0000000..3d3ce6d --- /dev/null +++ b/Classes/Base Classes/Viewers/Designers/cDesignerSinglePanel.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cDesignerSinglePanel : cDesignerParent + { + public cDesignerSinglePanel() + { + this.Title = "Simple Display Designer"; + } + + public void SetInputData(cExtendedControl Input) + { + base.OutPut = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + if (base.OutPut == null) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + this.Title = base.OutPut.Title; + return ToReturn; + } + } +} diff --git a/Classes/Base Classes/Viewers/Designers/cDesignerSplitter.cs b/Classes/Base Classes/Viewers/Designers/cDesignerSplitter.cs new file mode 100644 index 0000000..e92d35f --- /dev/null +++ b/Classes/Base Classes/Viewers/Designers/cDesignerSplitter.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cDesignerSplitter : cDesignerParent + { + public Orientation Orientation = Orientation.Horizontal; + List xListControl = new List(); + + public cDesignerSplitter() + { + this.Title = "Column Splitter Designer"; + } + + public void SetInputData(cExtendedControl ControlToAdd) + { + this.xListControl.Add(ControlToAdd); + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + if (xListControl.Count == 0) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + if (xListControl.Count == 1) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": At least 2 inputs have to be defined for this control!"; + return ToReturn; + } + + this.OutPut = new cExtendedControl(); + + cExtendedControl Tmp1 = this.CreateSplitter(xListControl[0], xListControl[1]); + + for(int IDx=2;IDx xListControl = new List(); + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + + if (xListControl.Count == 0) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + + //if (xListControl.Count == 1) + // this.Title = xListControl[0].Title; + + TabControl TC = new TabControl(); + + + + TC.Multiline = true; + + + foreach (cExtendedControl item in this.xListControl) + { + TabPage TP = new TabPage(); + TP.Text = item.Title; + // TP.AutoScroll = true; + // TP.Width = item.Width; + // TP.Height = item.Height; + + // item.Controls[0].Width = TP.Width - 50; + // item.Controls[0].Height = TP.Height; + TP.Width = 1000;// TC.Width * 5; + TP.Height = 500;// TC.Height * 5; + + TP.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); + + + item.Width = TP.Width; + item.Height = TP.Height; + item.Controls[0].Width = item.Width; + item.Controls[0].Height = item.Height; + + + TP.Controls.Add(item); + TC.TabPages.Add(TP); + } + + TC.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.OutPut = new cExtendedControl(); + this.OutPut.Controls.Add(TC); + this.OutPut.Title = this.Title; + return ToReturn; + } + + + + } +} diff --git a/Classes/Base Classes/Viewers/Display/FormForDisplay.Designer.cs b/Classes/Base Classes/Viewers/Display/FormForDisplay.Designer.cs new file mode 100644 index 0000000..bf1a207 --- /dev/null +++ b/Classes/Base Classes/Viewers/Display/FormForDisplay.Designer.cs @@ -0,0 +1,47 @@ +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + partial class FormForDisplay + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForDisplay)); + this.SuspendLayout(); + // + // FormForDisplay + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(514, 298); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormForDisplay"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Classes/Base Classes/Viewers/Display/FormForDisplay.cs b/Classes/Base Classes/Viewers/Display/FormForDisplay.cs new file mode 100644 index 0000000..b5857a6 --- /dev/null +++ b/Classes/Base Classes/Viewers/Display/FormForDisplay.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + public partial class FormForDisplay : Form + { + public FormForDisplay() + { + InitializeComponent(); + } + } +} diff --git a/Forms/FormForCellbyCellClassif.resx b/Classes/Base Classes/Viewers/Display/FormForDisplay.resx similarity index 100% rename from Forms/FormForCellbyCellClassif.resx rename to Classes/Base Classes/Viewers/Display/FormForDisplay.resx diff --git a/Classes/Base Classes/Viewers/Display/cDisplayToClipBoard.cs b/Classes/Base Classes/Viewers/Display/cDisplayToClipBoard.cs new file mode 100644 index 0000000..8c0a924 --- /dev/null +++ b/Classes/Base Classes/Viewers/Display/cDisplayToClipBoard.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using System.Windows; +using System.Windows.Forms; +using System.IO; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + public class cDisplayToClipBoard : cComponent + { + //FormForDisplay WindowToDisplay; + + public bool IsModal = false; + cExtendedControl ControlToDisplay = null; + + public cDisplayToClipBoard() + { + // ControlsToDisplay = new List(); + } + + public void SetInputData(cExtendedControl Input) + { + // foreach (var item in Input) + this.ControlToDisplay = Input; + //{ + // ControlsToDisplay.Add(item); + // } + + } + + + //public void SetInputData(cExtendedControl Input) + //{ + // ControlsToDisplay.Add(Input); + + //} + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + //WindowToDisplay = new FormForDisplay(); + + if (ControlToDisplay == null) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + return ToReturn; + } + + public void Display() + { + ControlToDisplay.CreateGraphics(); + + // ControlToDisplay.Show(); + + ControlToDisplay.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); + + ControlToDisplay.Width = 300; + ControlToDisplay.Height = 200; + + ControlToDisplay.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); + + + Bitmap bmp = new Bitmap(ControlToDisplay.Width, ControlToDisplay.Height); + + //Drawing control to the bitmap + ControlToDisplay.DrawToBitmap(bmp, new Rectangle(0, 0, ControlToDisplay.Width, ControlToDisplay.Height)); + + + MemoryStream ms = new MemoryStream(); + // this.chart.SaveImage(ms, ChartImageFormat.Bmp); + // Bitmap bm = new Bitmap(ms); + System.Windows.Forms.Clipboard.SetImage(bmp); + + // bmp.Save(fileName); + // bmp.Dispose(); + + + } + } +} + diff --git a/Classes/Base Classes/Viewers/Display/cDisplayToWindow.cs b/Classes/Base Classes/Viewers/Display/cDisplayToWindow.cs new file mode 100644 index 0000000..97f3145 --- /dev/null +++ b/Classes/Base Classes/Viewers/Display/cDisplayToWindow.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cDisplayToWindow : cComponent + { + FormForDisplay WindowToDisplay; + public bool IsModal = false; + cExtendedControl ControlToDisplay = null; + + public cDisplayToWindow() + { + ControlToDisplay = new cExtendedControl(); + } + + public void SetInputData(cExtendedControl Input) + { + this.ControlToDisplay = Input; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + WindowToDisplay = new FormForDisplay(); + + if ((ControlToDisplay == null)||(ControlToDisplay.Controls.Count==0)) + { + ToReturn.IsSucceed = false; + ToReturn.Message += ": No input defined!"; + return ToReturn; + } + else + { + //this.Title = ControlToDisplay.Title; + + ControlToDisplay.Width = WindowToDisplay.Width - 34; + ControlToDisplay.Height = WindowToDisplay.Height - 50; + + ControlToDisplay.Controls[0].Width = WindowToDisplay.Width - 34; + ControlToDisplay.Controls[0].Height = WindowToDisplay.Height - 50; + + ControlToDisplay.Location = new System.Drawing.Point(5, 5); + + ControlToDisplay.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); + } + WindowToDisplay.Controls.Add(ControlToDisplay); + WindowToDisplay.Text = base.Title; + return ToReturn; + } + + public void Display() + { + + + if (IsModal) + WindowToDisplay.ShowDialog(); + else + WindowToDisplay.Show(); + } + } +} diff --git a/Classes/Base Classes/Viewers/Table/cViewerTable.cs b/Classes/Base Classes/Viewers/Table/cViewerTable.cs new file mode 100644 index 0000000..0634449 --- /dev/null +++ b/Classes/Base Classes/Viewers/Table/cViewerTable.cs @@ -0,0 +1,477 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using System.Windows.Forms; +using System.Data; +using LibPlateAnalysis; +using HCSAnalyzer.Classes.Base_Classes.DataProcessing; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.Base_Classes.DataAnalysis; +using HCSAnalyzer.Classes.DataAnalysis; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + class cViewerTable : cDataDisplay + { + cExtendedTable Input = null; + DataGridView GridView = new DataGridView(); + ContextMenuStrip ColumnContextMenu; + + public int DigitNumber = 2; + + public cViewerTable() + { + Title = "Table Viewer"; + } + + public void SetInputData(cExtendedTable MyData) + { + this.Input = MyData; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage ToReturn = new cFeedBackMessage(true); + GridView.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect; + + GridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders; + + ContextMenuStrip GridViewContextMenu = new ContextMenuStrip(); + + ToolStripMenuItem ToolStripMenuItem_DisplayHeatMap= new ToolStripMenuItem("Display Heat Map"); + GridViewContextMenu.Items.Add(ToolStripMenuItem_DisplayHeatMap); + ToolStripMenuItem_DisplayHeatMap.Click += new System.EventHandler(this.DisplayHeatMap); + + ToolStripMenuItem ToolStripMenuItem_Display2DScatterGraph = new ToolStripMenuItem("Display 2D scatter graph"); + GridViewContextMenu.Items.Add(ToolStripMenuItem_Display2DScatterGraph); + ToolStripMenuItem_Display2DScatterGraph.Click += new System.EventHandler(this.ToolStripMenuItem_Display2DScatterGraph); + + GridView.ContextMenuStrip = GridViewContextMenu; + + ToolStripMenuItem ToolStripMenuItem_Operations = new ToolStripMenuItem("Operations"); + GridViewContextMenu.Items.Add(ToolStripMenuItem_Operations); + + ToolStripMenuItem ToolStripMenuItem_OperationsAbs = new ToolStripMenuItem("Abs."); + ToolStripMenuItem_Operations.DropDownItems.Add(ToolStripMenuItem_OperationsAbs); + ToolStripMenuItem_OperationsAbs.Click += new System.EventHandler(this.ToolStripMenuItem_OperationsAbs); + + ToolStripMenuItem ToolStripMenuItem_OperationsSquare = new ToolStripMenuItem("Square"); + ToolStripMenuItem_Operations.DropDownItems.Add(ToolStripMenuItem_OperationsSquare); + ToolStripMenuItem_OperationsSquare.Click += new System.EventHandler(this.ToolStripMenuItem_OperationsSquare); + + if (this.Input.Count == this.Input[0].Count) + { + ToolStripMenuItem ToolStripMenuItem_OperationsInverse = new ToolStripMenuItem("Inverse"); + ToolStripMenuItem_Operations.DropDownItems.Add(ToolStripMenuItem_OperationsInverse); + ToolStripMenuItem_OperationsInverse.Click += new System.EventHandler(this.ToolStripMenuItem_OperationsInverse); + } + + foreach (var Column in Input) + { + DataGridViewColumn DC = new DataGridViewColumn(new DataGridViewTextBoxCell()); + DC.CellTemplate = new DataGridViewTextBoxCell(); + DC.DefaultCellStyle.Format = "N"+this.DigitNumber; + DC.HeaderText = Column.Name; + DC.SortMode = DataGridViewColumnSortMode.NotSortable; + DC.Name = Column.Name; + //DC.Tag + + GridView.Columns.Add(DC); + GridView.Columns[GridView.Columns.Count - 1].SortMode = DataGridViewColumnSortMode.NotSortable; + + this.Title = this.Input.Name; + + ContextMenuStrip ColumnContextMenu = new ContextMenuStrip(); + + ToolStripMenuItem ToolStripMenuItem_DisplayGraph = new ToolStripMenuItem("Display graph"); + ColumnContextMenu.Items.Add(ToolStripMenuItem_DisplayGraph); + ToolStripMenuItem_DisplayGraph.Click += new System.EventHandler(this.DisplayGraph); + + ToolStripMenuItem ToolStripMenuItem_DisplayHisto = new ToolStripMenuItem("Display histogram"); + ColumnContextMenu.Items.Add(ToolStripMenuItem_DisplayHisto); + ToolStripMenuItem_DisplayHisto.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayHisto); + + ToolStripMenuItem ToolStripMenuItem_Statistics = new ToolStripMenuItem("Statistics"); + ColumnContextMenu.Items.Add(ToolStripMenuItem_Statistics); + ToolStripMenuItem_Statistics.Click += new System.EventHandler(this.ToolStripMenuItem_Statistics); + + + // if (GridView.SelectedColumns.Count >= 2) + { + ToolStripMenuItem ToolStripMenuItem_SimilarityMeasures = new ToolStripMenuItem("Similarity measures"); + + ToolStripMenuItem ToolStripMenuItem_ZFactor = new ToolStripMenuItem("Z-Factor"); + ToolStripMenuItem_SimilarityMeasures.DropDownItems.Add(ToolStripMenuItem_ZFactor); + ToolStripMenuItem_ZFactor.Click += new System.EventHandler(this.ToolStripMenuItem_ZFactor); + + ToolStripMenuItem ToolStripMenuItem_DotProduct = new ToolStripMenuItem("Dot product"); + ToolStripMenuItem_SimilarityMeasures.DropDownItems.Add(ToolStripMenuItem_DotProduct); + ToolStripMenuItem_DotProduct.Click += new System.EventHandler(this.ToolStripMenuItem_DotProduct); + + ToolStripMenuItem ToolStripMenuItem_DistEuclidean = new ToolStripMenuItem("Euclidean"); + ToolStripMenuItem_SimilarityMeasures.DropDownItems.Add(ToolStripMenuItem_DistEuclidean); + ToolStripMenuItem_DistEuclidean.Click += new System.EventHandler(this.ToolStripMenuItem_DistEuclidean); + + ColumnContextMenu.Items.Add(ToolStripMenuItem_SimilarityMeasures); + + + ToolStripMenuItem ToolStripMenuItem_CorrelationAnalysis = new ToolStripMenuItem("Correlation analysis"); + + ToolStripMenuItem ToolStripMenuItem_CorrelationMatrix = new ToolStripMenuItem("Correlation matrix"); + ToolStripMenuItem_CorrelationAnalysis.DropDownItems.Add(ToolStripMenuItem_CorrelationMatrix); + ToolStripMenuItem_CorrelationMatrix.Click += new System.EventHandler(this.ToolStripMenuItem_CorrelationMatrix); + + ToolStripMenuItem ToolStripMenuItem_MINEAnalysis = new ToolStripMenuItem("MINE analysis"); + ToolStripMenuItem_CorrelationAnalysis.DropDownItems.Add(ToolStripMenuItem_MINEAnalysis); + ToolStripMenuItem_MINEAnalysis.Click += new System.EventHandler(this.ToolStripMenuItem_MINEAnalysis); + + ColumnContextMenu.Items.Add(ToolStripMenuItem_CorrelationAnalysis); + } + + ToolStripMenuItem ToolStripMenuItem_DataManipulation = new ToolStripMenuItem("Data manipulations"); + + ToolStripMenuItem ToolStripMenuItem_AscendingSorting = new ToolStripMenuItem("Ascending sorting"); + ToolStripMenuItem_DataManipulation.DropDownItems.Add(ToolStripMenuItem_AscendingSorting); + ToolStripMenuItem_AscendingSorting.Click += new System.EventHandler(this.ToolStripMenuItem_AscendingSorting); + + ToolStripMenuItem ToolStripMenuItem_DescendingSorting = new ToolStripMenuItem("Descending sorting"); + ToolStripMenuItem_DataManipulation.DropDownItems.Add(ToolStripMenuItem_DescendingSorting); + ToolStripMenuItem_DescendingSorting.Click += new System.EventHandler(this.ToolStripMenuItem_DescendingSorting); + + ColumnContextMenu.Items.Add(ToolStripMenuItem_DataManipulation); + + if ((Column.Tag != null) && (Column.Tag.GetType() == typeof(cDescriptorsType))) + { + cDescriptorsType TmpDescType = (cDescriptorsType)Column.Tag; + + List MenuItemForDesc = TmpDescType.GetExtendedContextMenu(); + if (MenuItemForDesc != null) + foreach (var item in MenuItemForDesc) ColumnContextMenu.Items.Add(item); + } + + if ((Column.Tag != null) && (Column.Tag.GetType() == typeof(cDescriptorsLinearCombination))) + { + cDescriptorsLinearCombination TmpDescType = (cDescriptorsLinearCombination)Column.Tag; + + List MenuItemForDesc = TmpDescType.GetContextMenu(); + if (MenuItemForDesc != null) + foreach (var item in MenuItemForDesc) ColumnContextMenu.Items.Add(item); + } + + GridView.Columns[GridView.Columns.Count - 1].HeaderCell.ContextMenuStrip = ColumnContextMenu; + } + + for (int IdxRow = 0; IdxRow < Input[0].Count; IdxRow++) + GridView.Rows.Add(); + + if (Input.ListRowNames.Count > 0) + { + for (int IdxRow = 0; IdxRow < Input.ListRowNames.Count; IdxRow++) + GridView.Rows[IdxRow].HeaderCell.Value = Input.ListRowNames[IdxRow]; + } + else if((GridView.Columns.Count==1)&&(Input[0].ListTags!=null)) + { + for (int IdxRow = 0; IdxRow < Input[0].ListTags.Count; IdxRow++) + { + GridView.Rows[IdxRow].HeaderCell.Value = ((cGeneralComponent)(Input[0].ListTags[IdxRow])).GetShortInfo(); + } + } + + + for (int IdxRow = 0; IdxRow < Input[0].Count; IdxRow++) + { + for (int Col = 0; Col < Input.Count; Col++) + GridView[Col, IdxRow].Value = Input[Col][IdxRow]; + } + //CurrentPanel = new cExtendedControl(); + + CurrentPanel.Title = this.Title; + + this.CurrentPanel.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))); + + GridView.Width = CurrentPanel.Width; + GridView.Height = CurrentPanel.Height; + this.GridView.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))); + + GridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); + // GridView. + CurrentPanel.Controls.Add(GridView); + + return ToReturn; + } + + #region Column based operations + + private void DisplayGraph(object sender, EventArgs e) + { + cViewerGraph1D VG = new cViewerGraph1D(); + VG.Chart.IsLine = true; + VG.Chart.IsSelectable = false; + VG.Chart.IsZoomableX = true; + VG.Chart.IsLegend = true; + + cExtendedTable CET = new cExtendedTable(); + CET.Name = Input.Name; + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + VG.SetInputData(CET); + VG.Run(); + + cDesignerSinglePanel CD = new cDesignerSinglePanel(); + CD.SetInputData(VG.GetOutPut()); + CD.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.Title = CET.Name + " - Graph Viewer"; + DW.SetInputData(CD.GetOutPut()); + DW.Run(); + DW.Display(); + } + + private void ToolStripMenuItem_DisplayHisto(object sender, EventArgs e) + { + + cExtendedTable CET = new cExtendedTable(); + CET.Name = Input.Name; + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + + cViewerHistogram VH = new cViewerHistogram(); + VH.SetInputData(CET); + VH.Title = "Histogram"; + //CV1.Chart.IsBar = true; + //CV1.Chart.ISPoint = false; + // CV1.Chart.IsDisplayValues = true; + VH.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.Title = CET.Name + " - Histogram Viewer"; + DW.SetInputData(VH.GetOutPut()); + DW.Run(); + DW.Display(); + } + + private void ToolStripMenuItem_CorrelationMatrix(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cDisplayCorrelationMatrix DCM = new cDisplayCorrelationMatrix(); + DCM.Set_Data(CET); + DCM.SetCorrelationType(DataAnalysis.eCorrelationType.PEARSON); + DCM.Title = this.Title + " - Pearson correlation matrix"; + DCM.Run(); + } + + private void ToolStripMenuItem_MINEAnalysis(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cMineAnalysis MA = new cMineAnalysis(); + MA.SetInputData(CET); + MA.Is_BriefReport = true; + MA.Run(); + + cDesignerTab SubDT = new cDesignerTab(); + foreach (var item in MA.GetOutPut()) + { + cViewerTable SubTable = new cViewerTable(); + + SubTable.Title = "MINE - " + item.Name; + SubTable.SetInputData(item); + SubTable.Run(); + + SubDT.SetInputData(SubTable.GetOutPut()); + } + SubDT.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.SetInputData(SubDT.GetOutPut()); + DW.Title = CET.Name + " - MINE analysis"; + DW.Run(); + DW.Display(); + + } + + private void ToolStripMenuItem_AscendingSorting(object sender, EventArgs e) + { + if (GridView.SelectedColumns.Count == 0) return; + + cSort S = new cSort(); + S.SetInputData(this.Input); + S.ColumnIndexForSorting = GridView.SelectedColumns[0].Index; + S.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(S.GetOutPut()); + CDT.Run(); + + } + + private void ToolStripMenuItem_DescendingSorting(object sender, EventArgs e) + { + if (GridView.SelectedColumns.Count == 0) return; + + cSort S = new cSort(); + S.SetInputData(this.Input); + S.IsAscending = false; + S.ColumnIndexForSorting = GridView.SelectedColumns[0].Index; + S.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(S.GetOutPut()); + CDT.Run(); + + } + + + private void ToolStripMenuItem_DistEuclidean(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cDistances CD = new cDistances(); + CD.DistanceType = eDistances.EUCLIDEAN; + CD.SetInputData(CET); + CD.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(CD.GetOutPut()); + CDT.Run(); + } + + private void ToolStripMenuItem_ZFactor(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cZFactor S = new cZFactor(); + S.SetInputData(CET); + S.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(S.GetOutPut()); + CDT.Run(); + } + + private void ToolStripMenuItem_DotProduct(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cDotProduct S = new cDotProduct(); + S.SetInputData(CET); + S.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(S.GetOutPut()); + CDT.Run(); + } + private void ToolStripMenuItem_Statistics(object sender, EventArgs e) + { + cExtendedTable CET = new cExtendedTable(); + foreach (DataGridViewColumn item in GridView.SelectedColumns) + CET.Add(Input[item.Index]); + + cStatistics S = new cStatistics(); + S.IsMin = true; + S.IsMax = true; + S.IsSkewness = true; + S.IsKurtosis = true; + S.SetInputData(CET); + S.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(S.GetOutPut()); + CDT.Run(); + + } + + #endregion + + #region global table operations + + private void ToolStripMenuItem_OperationsAbs(object sender, EventArgs e) + { + cArithmetic_Abs CAA = new cArithmetic_Abs(); + CAA.SetInputData(this.Input); + CAA.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(CAA.GetOutPut()); + CDT.Run(); + } + + private void ToolStripMenuItem_OperationsSquare(object sender, EventArgs e) + { + cArithmetic_Power CAP = new cArithmetic_Power(); + + CAP.SetInputData(this.Input); + CAP.Set_Power(2); + CAP.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(CAP.GetOutPut()); + CDT.Run(); + } + + private void ToolStripMenuItem_OperationsInverse(object sender, EventArgs e) + { + cInverse CI = new cInverse(); + CI.SetInputData(this.Input); + CI.Run(); + + cDisplayExtendedTable CDT = new cDisplayExtendedTable(); + CDT.Set_Data(CI.GetOutPut()); + CDT.Run(); + } + + private void ToolStripMenuItem_Display2DScatterGraph(object sender, EventArgs e) + { + cViewer2DScatterPoint V2DSG = new cViewer2DScatterPoint(); + V2DSG.SetInputData(this.Input); + V2DSG.Run(); + + cDesignerSinglePanel CD = new cDesignerSinglePanel(); + CD.SetInputData(V2DSG.GetOutPut()); + CD.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.SetInputData(CD.GetOutPut()); + DW.Run(); + DW.Display(); + } + + private void DisplayHeatMap(object sender, EventArgs e) + { + cViewerHeatMap VHM = new cViewerHeatMap(); + VHM.SetInputData(this.Input); + VHM.Run(); + + cDesignerSinglePanel CD = new cDesignerSinglePanel(); + CD.SetInputData(VHM.GetOutPut()); + CD.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.SetInputData(CD.GetOutPut()); + DW.Run(); + DW.Display(); + } + #endregion + } +} diff --git a/Classes/Base Classes/Viewers/cGraphGeneral.cs b/Classes/Base Classes/Viewers/cGraphGeneral.cs new file mode 100644 index 0000000..f446c5f --- /dev/null +++ b/Classes/Base Classes/Viewers/cGraphGeneral.cs @@ -0,0 +1,435 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Drawing; +using LibPlateAnalysis; +using System.IO; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.General; +using HCSAnalyzer.Classes.Base_Classes.GUI; + +namespace HCSAnalyzer.Classes.Base_Classes.Viewers +{ + public abstract class cGraphGeneral : Chart + { + // protected ToolStripMenuItem SpecificContextMenu = null; + public cExtendedTable input; + protected ChartArea CurrentChartArea = new ChartArea("ChartArea"); + protected List CurrentSeries = new List(); + + public Color BackgroundColor = Color.FromArgb(250, 250, 250); + public bool IsShadow = false; + public bool IsBorder = true; + + public bool IsXAxis = false; + public bool IsYAxis = false; + + public string LabelAxisX = ""; + public string LabelAxisY = ""; + + public bool IsZoomableX = false; + public bool IsZoomableY = false; + public bool IsSelectable = false; + public bool IsDisplayValues = false; + public bool IsLegend = false; + + //FormForSingleSlider SliderForMinX = new FormForSingleSlider("Minimum X"); + FormForXYMinMax WindowForXYMinMax = new FormForXYMinMax(); + + + + protected bool IsAllowDisplayValue = true; + protected bool IsAllowDisplayTable = true; + + public Title CurrentTitle = new Title(); + //public SeriesChartType CurrentChartType; + + public cGraphGeneral() + { + this.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); + } + + + protected void Run() + { + base.ChartAreas.Clear(); + // CurrentSeries = new List(); + + this.BackColor = this.BackgroundColor; + + CurrentChartArea.BackColor = this.BackgroundColor; + CurrentTitle.Text = input.Name; + CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); + this.Titles.Clear(); + this.Titles.Add(CurrentTitle); + + // CurrentChartArea.Axes[1].Title = "Sum"; + CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + CurrentChartArea.AxisY.LabelStyle.Format = "N2"; + + CurrentChartArea.Axes[0].MajorGrid.Enabled = this.IsYAxis; + //CurrentChartArea.Axes[0].Enabled = AxisEnabled.True; + CurrentChartArea.Axes[0].LabelStyle.Enabled = true; + CurrentChartArea.Axes[0].MajorGrid.LineColor = Color.LightGray; + + if (this.LabelAxisX != "") + CurrentChartArea.Axes[0].Title = this.LabelAxisX; + if (this.LabelAxisY != "") + CurrentChartArea.Axes[1].Title = this.LabelAxisY; + + CurrentChartArea.Axes[1].LabelStyle.Enabled = true; + CurrentChartArea.Axes[1].MajorGrid.Enabled = this.IsXAxis; + CurrentChartArea.Axes[1].MajorGrid.LineColor = Color.LightGray; + //CurrentChartArea.Axes[1].Enabled = AxisEnabled.true; + + this.ChartAreas.Add(CurrentChartArea); + this.Series.Clear(); + //this.CurrentSeries.Clear(); + + foreach (var item in this.CurrentSeries) + { + if (this.IsShadow) + item.ShadowOffset = 1; + else + item.ShadowOffset = 0; + + //foreach (var Pt in item.Points) + // Pt.IsValueShownAsLabel = this.IsDisplayValues; + this.Series.Add(item); + } + + if (this.IsDisplayValues) + { + foreach (var item in this.Series) + foreach (var Pt in item.Points) + { + Pt.LabelFormat = "N2"; + Pt.IsValueShownAsLabel = true; + Pt.Font = new Font("Arial", 8); + } + } + + //CurrentChartArea.CursorX.IsUserEnabled = this.IsZoomableX; + CurrentChartArea.CursorX.IsUserSelectionEnabled = this.IsSelectable; + CurrentChartArea.CursorY.IsUserSelectionEnabled = this.IsSelectable; + + CurrentChartArea.CursorX.SelectionColor = Color.Black; + CurrentChartArea.CursorY.SelectionColor = Color.Black; + + CurrentChartArea.CursorX.LineColor = Color.Black; + CurrentChartArea.CursorY.LineColor = Color.Black; + CurrentChartArea.CursorX.LineWidth = 1; + CurrentChartArea.CursorY.LineWidth = 1; + + //CurrentChartArea.AxisX.ScaleView.Zoomable = this.IsZoomableX; + //CurrentChartArea.AxisX.ScrollBar.IsPositionedInside = true; + if (this.IsZoomableX) + { + this.ChartAreas[0].AxisX.ScaleView.Zoomable = this.IsZoomableX; + CurrentChartArea.CursorX.IsUserSelectionEnabled = this.IsZoomableX; + } + + if (this.IsZoomableX) + { + this.ChartAreas[0].AxisY.ScaleView.Zoomable = this.IsZoomableY; + CurrentChartArea.CursorY.IsUserSelectionEnabled = this.IsZoomableY; + } + if (this.IsSelectable) + { + this.ChartAreas[0].AxisX.ScaleView.Zoomable = false; + CurrentChartArea.CursorX.IsUserSelectionEnabled = true; + this.ChartAreas[0].AxisY.ScaleView.Zoomable = false; + CurrentChartArea.CursorY.IsUserSelectionEnabled = true; + } + + CurrentChartArea.AxisX.IsLabelAutoFit = true; + + if (this.IsLegend) + this.Legends.Add("Legend"); + + // this.Series[0].Sort(PointSortOrder.Ascending, "Y"); + + // CurrentChartArea.CursorY.IsUserEnabled = this.IsZoomableY; + //CurrentChartArea.CursorY.IsUserSelectionEnabled = this.IsZoomableY; + // CurrentChartArea.AxisY.ScaleView.Zoomable = this.IsZoomableY; + // CurrentChartArea.AxisY.ScrollBar.IsPositionedInside = true; + } + + + public List GetContextMenu(MouseEventArgs e) + { + List ToBeReturned = new List(); + + ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("General display"); + + ToolStripMenuItem ToolStripMenuItem_BackGroundColor = new ToolStripMenuItem("Background Color"); + ToolStripMenuItem_BackGroundColor.Click += new System.EventHandler(this.ToolStripMenuItem_BackGroundColor); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_BackGroundColor); + + ToolStripMenuItem ToolStripMenuItem_IsShadow = new ToolStripMenuItem("Shadow"); + ToolStripMenuItem_IsShadow.CheckOnClick = true; + ToolStripMenuItem_IsShadow.Checked = this.IsShadow; + ToolStripMenuItem_IsShadow.Click += new System.EventHandler(this.ToolStripMenuItem_IsShadow); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_IsShadow); + + ToolStripMenuItem ToolStripMenuItem_IsBorder = new ToolStripMenuItem("Border"); + ToolStripMenuItem_IsBorder.CheckOnClick = true; + ToolStripMenuItem_IsBorder.Checked = this.IsBorder; + ToolStripMenuItem_IsBorder.Click += new System.EventHandler(this.ToolStripMenuItem_IsBorder); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_IsBorder); + + if (IsAllowDisplayValue) + { + ToolStripMenuItem ToolStripMenuItem_IsDisplayValues = new ToolStripMenuItem("Values"); + ToolStripMenuItem_IsDisplayValues.CheckOnClick = true; + ToolStripMenuItem_IsDisplayValues.Checked = this.IsDisplayValues; + ToolStripMenuItem_IsDisplayValues.Click += new System.EventHandler(this.ToolStripMenuItem_IsDisplayValues); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_IsDisplayValues); + } + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_XAxis = new ToolStripMenuItem("X-Grid"); + ToolStripMenuItem_XAxis.CheckOnClick = true; + ToolStripMenuItem_XAxis.Checked = this.IsXAxis; + ToolStripMenuItem_XAxis.Click += new System.EventHandler(this.ToolStripMenuItem_XAxis); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_XAxis); + + ToolStripMenuItem ToolStripMenuItem_YAxis = new ToolStripMenuItem("Y-Grid"); + ToolStripMenuItem_YAxis.CheckOnClick = true; + ToolStripMenuItem_YAxis.Checked = this.IsYAxis; + ToolStripMenuItem_YAxis.Click += new System.EventHandler(this.ToolStripMenuItem_YAxis); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_YAxis); + + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_CopyToClipBoard = new ToolStripMenuItem("Copy To Clipboard"); + ToolStripMenuItem_CopyToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyToClipBoard); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_CopyToClipBoard); + + if (IsAllowDisplayTable) + { + ToolStripMenuItem ToolStripMenuItem_DisplayDataTable = new ToolStripMenuItem("Display Data Table"); + ToolStripMenuItem_DisplayDataTable.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayDataTable); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayDataTable); + } + SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem ToolStripMenuItem_Axis = new ToolStripMenuItem("Axis Min-Max"); + ToolStripMenuItem_Axis.Click += new System.EventHandler(this.ToolStripMenuItem_Axis); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Axis); + // ToolStripMenuItem ToolStripMenuItem_X = new ToolStripMenuItem("X"); + + //Axis.DropDownItems.Add(ToolStripMenuItem_X); + + + + //ToolStripMenuItem ToolStripMenuItem_X = new ToolStripMenuItem("X"); + // ToolStripMenuItem_X.Click += new System.EventHandler(this.ToolStripMenuItem_X); + // Axis.DropDownItems.Add(ToolStripMenuItem_X); + + ToBeReturned.Add(SpecificContextMenu); + + #region manage context menu on the graph elements + HitTestResult Res = this.HitTest(e.X, e.Y, ChartElementType.DataPoint); + if (Res.Series != null) + { + DataPoint PtToTransfer = Res.Series.Points[Res.PointIndex]; + + if (PtToTransfer.Tag != null) + { + if (PtToTransfer.Tag.GetType() == typeof(cWell)) + { + cWell TmpWell = (cWell)(PtToTransfer.Tag); + foreach (var item in TmpWell.GetExtendedContextMenu()) + ToBeReturned.Add(item); + } + if (PtToTransfer.Tag.GetType() == typeof(cSingleBiologicalObject)) + { + cSingleBiologicalObject TmpBiologicalObject = (cSingleBiologicalObject)(PtToTransfer.Tag); + foreach (var item in TmpBiologicalObject.GetExtendedContextMenu()) + ToBeReturned.Add(item); + } + if (PtToTransfer.Tag.GetType() == typeof(cDescriptorsType)) + { + cDescriptorsType TmpDesc = (cDescriptorsType)(PtToTransfer.Tag); + foreach (var itemDesc in TmpDesc.GetExtendedContextMenu()) + ToBeReturned.Add(itemDesc); + } + if (PtToTransfer.Tag.GetType() == typeof(cPlate)) + { + cPlate TmpPlate = (cPlate)(PtToTransfer.Tag); + ToBeReturned.Add(TmpPlate.GetExtendedContextMenu()); + } + if (PtToTransfer.Tag.GetType() == typeof(cWellClass)) + { + cWellClass TmpClass = (cWellClass)(PtToTransfer.Tag); + ToBeReturned.Add(TmpClass.GetExtendedContextMenu()); + } + } + } + + HitTestResult ResForTitle = this.HitTest(e.X, e.Y, ChartElementType.Title); + if ((ResForTitle != null) && (ResForTitle.Object != null)) + { + Title TmpTitle = (Title)ResForTitle.Object; + + if ((TmpTitle.Tag != null) && (TmpTitle.Tag.GetType() == typeof(cPlate))) + { + cPlate TmpPlate = (cPlate)(TmpTitle.Tag); + if (TmpPlate.GetContextMenu() != null) + ToBeReturned.Add(TmpPlate.GetContextMenu()); + } + } + + + // HitTestResult ResForLegend = this.HitTest(e.X, e.Y, ChartElementType.LegendArea); + //// if (ResForTitle.Series != null) + // { + // MemoryStream ms = new MemoryStream(); + // this.SaveImage(ms, ChartImageFormat.Bmp); + // Bitmap bm = new Bitmap(ms); + + // Rectangle Rec = new Rectangle((int)this.Legends[0].Position.X, + // (int)this.Legends[0].Position.Y, + // (int)this.Legends[0].Position.Width, + // (int)this.Legends[0].Position.Height); + + // System.Drawing.Imaging.PixelFormat format = bm.PixelFormat; + // Bitmap cloneBitmap = bm.Clone(Rec, System.Drawing.Imaging.PixelFormat.Format24bppRgb); + + // Clipboard.SetImage(cloneBitmap); + + // } + + #endregion + + //ToolStripMenuItem ToolStripMenuItem_CopyToClipBoard = new ToolStripMenuItem("Copy To ClipBoard"); + //ToolStripMenuItem_CopyToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyToClipBoard); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_CopyToClipBoard); + + return ToBeReturned; + } + + private void ToolStripMenuItem_Axis(object sender, EventArgs e) + { + WindowForXYMinMax.numericUpDownXMin.Value = (decimal)this.CurrentChartArea.AxisX.Minimum; + WindowForXYMinMax.numericUpDownXMax.Value = (decimal)this.CurrentChartArea.AxisX.Maximum; + + WindowForXYMinMax.numericUpDownYMin.Value = (decimal)this.CurrentChartArea.AxisY.Minimum; + WindowForXYMinMax.numericUpDownYMax.Value = (decimal)this.CurrentChartArea.AxisY.Maximum; + + + if (WindowForXYMinMax.ShowDialog() == DialogResult.OK) + { + this.CurrentChartArea.AxisX.Minimum = (double)WindowForXYMinMax.numericUpDownXMin.Value; + this.CurrentChartArea.AxisX.Maximum = (double)WindowForXYMinMax.numericUpDownXMax.Value; + + this.CurrentChartArea.AxisY.Minimum = (double)WindowForXYMinMax.numericUpDownYMin.Value; + this.CurrentChartArea.AxisY.Maximum = (double)WindowForXYMinMax.numericUpDownYMax.Value; + + } + + //this.SliderForMinX.numericUpDown.Minimum = -1000000000000000; + + //this.SliderForMinX.numericUpDown.Value = (decimal)this.CurrentChartArea.AxisX.Minimum;//this.SliderForMinX.trackBar.Value + //if (this.SliderForMinX.ShowDialog() == DialogResult.OK) + //{ + // this.CurrentChartArea.AxisX.Minimum = (double)this.SliderForMinX.numericUpDown.Value; + //} + } + + private void ToolStripMenuItem_CopyToClipBoard(object sender, EventArgs e) + { + MemoryStream ms = new MemoryStream(); + this.SaveImage(ms, ChartImageFormat.Bmp); + Bitmap bm = new Bitmap(ms); + Clipboard.SetImage(bm); + } + + private void ToolStripMenuItem_DisplayDataTable(object sender, EventArgs e) + { + cDisplayExtendedTable CDE = new cDisplayExtendedTable(); + CDE.Set_Data(this.input); + CDE.Run(); + } + + private void ToolStripMenuItem_XAxis(object sender, EventArgs e) + { + this.IsXAxis = !this.IsXAxis; + this.CurrentChartArea.Axes[1].MajorGrid.Enabled = IsXAxis; + } + + private void ToolStripMenuItem_YAxis(object sender, EventArgs e) + { + this.IsYAxis = !this.IsYAxis; + this.CurrentChartArea.Axes[0].MajorGrid.Enabled = IsYAxis; + } + + private void ToolStripMenuItem_IsShadow(object sender, EventArgs e) + { + this.IsShadow = !this.IsShadow; + if (IsShadow) + foreach (var item in this.Series) + item.ShadowOffset = 1; + else + foreach (var item in this.Series) + item.ShadowOffset = 0; + } + + protected void ToolStripMenuItem_IsDisplayValues(object sender, EventArgs e) + { + this.IsDisplayValues = !this.IsDisplayValues; + foreach (var item in this.Series) + foreach (var Pt in item.Points) + { + Pt.LabelFormat = "N2"; + Pt.IsValueShownAsLabel = this.IsDisplayValues; + } + } + + + private void ToolStripMenuItem_IsBorder(object sender, EventArgs e) + { + this.IsBorder = !this.IsBorder; + if (IsBorder) + foreach (var item in this.Series) + foreach (var Pt in item.Points) + { + //Pt.MarkerBorderWidth = 1; + //Pt.MarkerBorderColor = Color.Black; + //Pt.MarkerStyle = MarkerStyle.None; + Pt.MarkerBorderWidth = 1; + Pt.MarkerBorderColor = Color.Black; + } + else + foreach (var item in this.Series) + foreach (var Pt in item.Points) + { + Pt.MarkerBorderWidth = 0; + Pt.MarkerBorderColor = Color.Black; + } + + this.Update(); + } + + private void ToolStripMenuItem_BackGroundColor(object sender, EventArgs e) + { + ColorDialog CD = new ColorDialog(); + if (CD.ShowDialog() != DialogResult.OK) return; + this.BackgroundColor = CD.Color; + this.CurrentChartArea.BackColor = this.BackgroundColor; + this.BackColor = this.BackgroundColor; + + this.Update(); + } + } + + +} diff --git a/Classes/Base Classes/cComponent.cs b/Classes/Base Classes/cComponent.cs new file mode 100644 index 0000000..2fb0a01 --- /dev/null +++ b/Classes/Base Classes/cComponent.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using HCSAnalyzer.Classes._3D; +using HCSAnalyzer.Classes.Base_Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes +{ + + /// + /// Contains low level information and GUI for component display + /// + public abstract class cComponent + { + protected Color CurrentColor; + public cPoint3D Position; + + public string Title; + + } + + /// + /// Data Filtering Component + /// + public abstract class cDataAnalysisComponent : cComponent + { + public cDataAnalysisComponent() + { + CurrentColor = Color.DarkGreen; + } + } + + public abstract class cDataDisplay : cComponent + { + protected int Width = 200; + protected int Height = 100; + protected cExtendedControl CurrentPanel; + public ContextMenuStrip CompleteMenu = new ContextMenuStrip(); + + public cDataDisplay() + { + CurrentColor = Color.DarkRed; + this.CurrentPanel = new cExtendedControl(); + this.CurrentPanel.Width = Width; + this.CurrentPanel.Height = Height; + + ToolStripMenuItem ToolStripMenuItem_CopyDataToClipBoard = new ToolStripMenuItem("Copy Data To Clipboard"); + CompleteMenu.Items.Add(ToolStripMenuItem_CopyDataToClipBoard); + ToolStripMenuItem_CopyDataToClipBoard.Click += new System.EventHandler(this.CopyDataToClipBoard); + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + CompleteMenu.Items.Add(ToolStripSep); + + // CurrentPanel.ContextMenuStrip = DisplayContextMenu; + //CurrentPanel.Controls.Add(ToolStripMenuItem_CopyDataToClipBoard); + } + + + private void CopyDataToClipBoard(object sender, EventArgs e) + { + + } + + public cExtendedControl GetOutPut() + { + return CurrentPanel; + } + + } + + public abstract class cDataGenerator : cComponent + { + public cDataGenerator() + { + CurrentColor = Color.DarkBlue; + } + } + + + + + +} diff --git a/Forms/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs similarity index 96% rename from Forms/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs index e512973..30d4768 100644 --- a/Forms/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs +++ b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.Designer.cs @@ -154,9 +154,9 @@ private void InitializeComponent() // // dataGridViewForConcentration // - this.dataGridViewForConcentration.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.dataGridViewForConcentration.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.dataGridViewForConcentration.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridViewForConcentration.Location = new System.Drawing.Point(195, 6); this.dataGridViewForConcentration.Name = "dataGridViewForConcentration"; @@ -165,9 +165,9 @@ private void InitializeComponent() // // panelForDesignDisplay // - this.panelForDesignDisplay.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.panelForDesignDisplay.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.panelForDesignDisplay.BackColor = System.Drawing.Color.White; this.panelForDesignDisplay.Location = new System.Drawing.Point(6, 6); this.panelForDesignDisplay.Name = "panelForDesignDisplay"; @@ -177,9 +177,9 @@ private void InitializeComponent() // // tabControl1 // - this.tabControl1.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.tabControl1.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.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPageConcentrations); this.tabControl1.Location = new System.Drawing.Point(221, 12); @@ -333,7 +333,9 @@ private void InitializeComponent() this.Controls.Add(this.label1); this.Controls.Add(this.groupBox1); this.Controls.Add(this.buttonApply); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; this.Name = "FormForDRCDesign"; this.Text = "DRC Design"; this.groupBox1.ResumeLayout(false); diff --git a/Forms/FormsForDRCAnalysis/FormForDRCDesign.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.cs similarity index 97% rename from Forms/FormsForDRCAnalysis/FormForDRCDesign.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.cs index ba5806c..db9ceb7 100644 --- a/Forms/FormsForDRCAnalysis/FormForDRCDesign.cs +++ b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.cs @@ -34,14 +34,7 @@ public FormForDRCDesign() int PosYMax; - public void Reset() - { - if(!panelForDesignDisplay.IsDisposed) - panelForDesignDisplay.CreateGraphics().Clear(Color.White); - this.TemplateRegion = null; - this.ListWells = null; - - } + private void buttonApply_Click(object sender, EventArgs e) { @@ -119,7 +112,7 @@ private void buttonApply_Click(object sender, EventArgs e) } - CurrentScreen.GetCurrentDisplayPlate().Refresh3D(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor); + CurrentScreen.GetCurrentDisplayPlate().Refresh3D(CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx); } @@ -242,7 +235,6 @@ public void DrawSignature() private void buttonFill_Click(object sender, EventArgs e) { - if (TemplateRegion == null) return; int SizeX, SizeY; if (TemplateRegion.IsConcentrationHorizontal) { diff --git a/Forms/FormsForDRCAnalysis/FormForDRCDesign.resx b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.resx similarity index 100% rename from Forms/FormsForDRCAnalysis/FormForDRCDesign.resx rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCDesign.resx diff --git a/Forms/FormsForDRCAnalysis/FormForDRCSelection.Designer.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.Designer.cs similarity index 100% rename from Forms/FormsForDRCAnalysis/FormForDRCSelection.Designer.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.Designer.cs diff --git a/Forms/FormsForDRCAnalysis/FormForDRCSelection.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.cs similarity index 100% rename from Forms/FormsForDRCAnalysis/FormForDRCSelection.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.cs diff --git a/Forms/FormsForDRCAnalysis/FormForDRCSelection.resx b/Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.resx similarity index 100% rename from Forms/FormsForDRCAnalysis/FormForDRCSelection.resx rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormForDRCSelection.resx diff --git a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs similarity index 92% rename from Forms/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs index 06f3963..7739aea 100644 --- a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs +++ b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.Designer.cs @@ -34,6 +34,8 @@ private void InitializeComponent() this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fitHorizontalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fitVerticalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printDialog1 = new System.Windows.Forms.PrintDialog(); + this.printDocument1 = new System.Drawing.Printing.PrintDocument(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // @@ -83,6 +85,11 @@ private void InitializeComponent() this.fitVerticalToolStripMenuItem.Text = "Fit Vertical"; this.fitVerticalToolStripMenuItem.Click += new System.EventHandler(this.fitVerticalToolStripMenuItem_Click); // + // printDialog1 + // + this.printDialog1.Document = this.printDocument1; + this.printDialog1.UseEXDialog = true; + // // FormToDisplayDRC // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -108,6 +115,8 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fitHorizontalToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fitVerticalToolStripMenuItem; + public System.Windows.Forms.PrintDialog printDialog1; + public System.Drawing.Printing.PrintDocument printDocument1; } } \ No newline at end of file diff --git a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.cs b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.cs similarity index 70% rename from Forms/FormsForDRCAnalysis/FormToDisplayDRC.cs rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.cs index eecd007..44681e1 100644 --- a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.cs +++ b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.cs @@ -12,33 +12,28 @@ namespace HCSAnalyzer.Forms.FormsForOptions { public partial class FormToDisplayDRC : Form { - public List LChart = new List(); public List LRichTextBox = new List(); - public int NumberOfXDRC = 0; public int NumberOfYDRC = 0; - + // printDialog1.Document = PrintDocument1; public FormToDisplayDRC() { InitializeComponent(); - - - } private void fitHorizontalToolStripMenuItem_Click(object sender, EventArgs e) { - - int NewWidth = this.panelForDRC.Width / NumberOfXDRC; - - for (int j = 0; j < NumberOfYDRC; j++) - for (int i = 0; i < NumberOfXDRC; i++) - { - LChart[i + j * NumberOfXDRC].Width = NewWidth; - LChart[i + j * NumberOfXDRC].Location = new Point((LChart[i + j * NumberOfXDRC].Width + 5) * i, (LChart[i + j * NumberOfXDRC].Height + 5) * j); - } + // int NewWidth = this.panelForDRC.Width / NumberOfXDRC; + + //for (int j = 0; j < NumberOfYDRC; j++) + // for (int i = 0; i < NumberOfXDRC; i++) + // { + // LChart[i + j * NumberOfXDRC].Width = NewWidth; + // LChart[i + j * NumberOfXDRC].Location = new Point((LChart[i + j * NumberOfXDRC].Width + 5) * i, (LChart[i + j * NumberOfXDRC].Height + 5) * j); + // } + printDialog1.ShowDialog(); } private void fitVerticalToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.resx b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.resx similarity index 99% rename from Forms/FormsForDRCAnalysis/FormToDisplayDRC.resx rename to Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.resx index de527c9..02cdb3d 100644 --- a/Forms/FormsForDRCAnalysis/FormToDisplayDRC.resx +++ b/Classes/DRC Analysis/FormsForDRCAnalysis/FormToDisplayDRC.resx @@ -120,6 +120,12 @@ 17, 17 + + 132, 17 + + + 251, 17 + diff --git a/Classes/cDRCanalysis.cs b/Classes/DRC Analysis/cDRCanalysis.cs similarity index 95% rename from Classes/cDRCanalysis.cs rename to Classes/DRC Analysis/cDRCanalysis.cs index 6bf956c..217bf9d 100644 --- a/Classes/cDRCanalysis.cs +++ b/Classes/DRC Analysis/cDRCanalysis.cs @@ -9,6 +9,8 @@ using System.Windows.Forms; using System.IO; using HCSAnalyzer.Forms.FormsForDRCAnalysis; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + namespace HCSAnalyzer.Classes { @@ -50,7 +52,7 @@ public cDRCDisplay(List DRCstoDisplay, cGlobalInfo GlobalInfo) int IdxCurve = 0; - + string titi = null; foreach (cDRC CurrentDRC in DRCstoDisplay) { @@ -87,12 +89,27 @@ public cDRCDisplay(List DRCstoDisplay, cGlobalInfo GlobalInfo) CurrentSeriesForRealValues.Legend = "Legend1"; this.CurrentChart.Series.Add(CurrentSeriesForRealValues); this.CurrentChart.Series.Add(CurrentSeriesForSpline); - + titi = @"C:\" + "[" + CurrentDRC.AssociatedDRCRegion.PosXMin + "." + CurrentDRC.AssociatedDRCRegion.PosYMin + "]" + ".jpg"; + } + + + + + + CurrentChart.Legends.Add(legend1); CurrentChart.ChartAreas.Add(TmpChartArea); CurrentChart.Height = CurrentRichTextBox.Height = ChartSizeY; CurrentChart.Width = ChartSizeX; + if (DRCstoDisplay.Count!=0) + { + //CurrentChart.SaveImage(titi, ChartImageFormat.Jpeg); + } + + //CurrentChart.SaveImage(@"C:\"+, ChartImageFormat.Jpeg); + // CurrentChart.Anchor= (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right); + CurrentRichTextBox.Width = CurrentChart.Width; CurrentRichTextBox.Height = 150; for (int i = 0; i < DRCstoDisplay.Count; i++) @@ -104,7 +121,8 @@ public cDRCDisplay(List DRCstoDisplay, cGlobalInfo GlobalInfo) this.CurrentRichTextBox.AppendText("--------------------------------------\n"); } - + + } @@ -169,25 +187,25 @@ public cWell[] GetlistReplicate(int IdxReplicate) public List GetListRespondingDescritpors(cScreening CurrentScreen, FormForDRCSelection WindowDRCSelection) { - List ListRespondingDescritpors = new List(); + List ListRespondingDescriptors = new List(); for (int IdxDesc = 0; IdxDesc < CurrentScreen.ListDescriptors.Count; IdxDesc++) { cDescriptorsType Desc = CurrentScreen.ListDescriptors[IdxDesc]; if (!Desc.IsActive()) { - ListRespondingDescritpors.Add(-1); + ListRespondingDescriptors.Add(-1); continue; } cDRC CurrentDRC = this.GetDRC(Desc); - ListRespondingDescritpors.Add(CurrentDRC.IsResponding(WindowDRCSelection)); + ListRespondingDescriptors.Add(CurrentDRC.IsResponding(WindowDRCSelection)); // ListRespondingDescritpors.Add(1); //else // ListRespondingDescritpors.Add(0); } - return ListRespondingDescritpors; + return ListRespondingDescriptors; } @@ -380,7 +398,7 @@ private void FitToSigmoid() { if (AssociatedDRCRegion.GetlistReplicate(0)[IdxConc] == null) continue; - if (AssociatedDRCRegion.GetlistReplicate(0)[IdxConc].GetClass() != -1) + if (AssociatedDRCRegion.GetlistReplicate(0)[IdxConc].GetClassIdx() != -1) ResultFit.ConcentrationValues.Add(AssociatedDRCRegion.GetlistReplicate(0)[IdxConc].Concentration); } @@ -393,7 +411,7 @@ private void FitToSigmoid() for (int IdxConc = 0; IdxConc < AssociatedDRCRegion.NumConcentrations; IdxConc++) { if (AssociatedDRCRegion.GetlistReplicate(idxRep)[IdxConc] == null) continue; - if (AssociatedDRCRegion.GetlistReplicate(idxRep)[IdxConc].GetClass() != -1) + if (AssociatedDRCRegion.GetlistReplicate(idxRep)[IdxConc].GetClassIdx() != -1) ResultFit.Y_RawData[idxRep][IdxConc] = AssociatedDRCRegion.GetlistReplicate(idxRep)[IdxConc].ListDescriptors[DescIdx].GetValue(); NumWellToProcess++; } diff --git a/Classes/General/MiscClasses.cs b/Classes/General/MiscClasses.cs new file mode 100644 index 0000000..561be50 --- /dev/null +++ b/Classes/General/MiscClasses.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections; +//using Emgu.CV; +//using Emgu.CV.Structure; +//using Emgu.CV.CvEnum; +using System.Runtime.InteropServices; +using Emgu.CV; +using Emgu.CV.CvEnum; +using System.Drawing; + +namespace HCSAnalyzer.Classes +{ + + + + + public class cInfoClassif + { + public String StringForTree; + public String StringForQuality; + public String ConfusionMatrix; + + } + + + public class cInfoClass + { + public int[] CorrespondanceTable; + public List ListBackAssociation = new List(); + public int NumberOfClass = 0; + + } + + + public class cScoreAndClass + { + public double Score; + public int Class; + + public cScoreAndClass(int Class, double Score) + { + this.Class = Class; + this.Score = Score; + } + } + + + public class cInfoDescriptors + { + public int[] CorrespondanceTable; + public List ListBackAssociation = new List(); + } + + + +} diff --git a/Classes/General/cCellularPhenotype.cs b/Classes/General/cCellularPhenotype.cs new file mode 100644 index 0000000..ba90cc7 --- /dev/null +++ b/Classes/General/cCellularPhenotype.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Drawing; + +namespace HCSAnalyzer.Classes.General +{ + public class cCellularPhenotype : cGeneralComponent + { + public Color ColourForDisplay; + public string Name; + public int Idx { get; private set; } + + + + public cCellularPhenotype(Color Colour, int Idx) + { + this.ColourForDisplay = Colour; + this.Name = "Phenotype " + Idx; + this.Idx = Idx; + } + } + +} diff --git a/Classes/General/cDescriptor.cs b/Classes/General/cDescriptor.cs new file mode 100644 index 0000000..ae532d3 --- /dev/null +++ b/Classes/General/cDescriptor.cs @@ -0,0 +1,1127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows; +using System.Drawing; +using HCSAnalyzer.Forms.IO; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Controls; +using HCSAnalyzer.Classes.Base_Classes.GUI; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using HCSAnalyzer.Classes.General; + +namespace LibPlateAnalysis +{ + + public enum eDistances { EUCLIDEAN, MANHATTAN, VECTOR_COS, BHATTACHARYYA, EMD }; + + public class cDescriptorsLinearCombination : List + { + cExtendedList ListWeights;// = new cExtendedList(); + cGlobalInfo GlobalInfo; + string Name; + + public cDescriptorsLinearCombination(cExtendedList ListWeights, cGlobalInfo GlobalInfo) + { + this.ListWeights = new cExtendedList(); + this.ListWeights.Name = ListWeights.Name; + this.ListWeights = ListWeights; + this.GlobalInfo = GlobalInfo; + this.Name = ListWeights.Name; + } + + public List GetContextMenu() + { + List ListToReturn = new List(); + + // perform projection + ToolStripMenuItem PerformProjection = new ToolStripMenuItem("Perform projection"); + PerformProjection.Click += new System.EventHandler(this.PerformProjection); + ListToReturn.Add(PerformProjection); + return ListToReturn; + } + + void PerformProjection(object sender, EventArgs e) + { + string NewName = this.Name; + string Description = ""; + + for (int IdxActiveDesc = 0; IdxActiveDesc < this.Count; IdxActiveDesc++) + Description += this.ListWeights[IdxActiveDesc].ToString("N2") + "\t*\t" + this[IdxActiveDesc].GetName() + "\n"; + + cDescriptorsType NewType = new cDescriptorsType(NewName, true, 1, GlobalInfo, Description); + GlobalInfo.CurrentScreen.ListDescriptors.AddNew(NewType); + + foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) + { + List LDesc = new List(); + double NewValue = 0; + + for (int IdxActiveDesc = 0; IdxActiveDesc < this.Count; IdxActiveDesc++) + NewValue += this.ListWeights[IdxActiveDesc] * Tmpwell.ListDescriptors[IdxActiveDesc].GetValue(); + + cDescriptor NewDesc = new cDescriptor(NewValue, NewType, GlobalInfo.CurrentScreen); + LDesc.Add(NewDesc); + Tmpwell.AddDescriptors(LDesc); + } + } + + GlobalInfo.CurrentScreen.ListDescriptors.UpDateDisplay(); + GlobalInfo.CurrentScreen.UpDatePlateListWithFullAvailablePlate(); + + for (int idxP = 0; idxP < GlobalInfo.CurrentScreen.ListPlatesActive.Count; idxP++) + GlobalInfo.CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); + } + } + + public class cDescriptorsType : cGeneralComponent + { + public bool IsConnectedToDatabase { get; private set; } + private string Name; + public string description; + private int NumBin; + cGlobalInfo GlobalInfo; + public FormForDescriptorInfo WindowDescriptorInfo; + private bool ActiveState; + + public cDescriptorsType(string Name, bool IsActive, int BinNumber, bool IsConnectedToDB, cGlobalInfo GlobalInfo) + { + //this.AssociatedcListDescriptors = AssociatedcListDescriptors; + if (GlobalInfo.CurrentScreen != null) + { + int IdxForNewName = -1; + bool IsAlreadyExisting = false; + string OriginalName = Name; + + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + + while (IsAlreadyExisting) + { + IdxForNewName++; + Name = OriginalName + IdxForNewName; + + IsAlreadyExisting = false; + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + } + } + + this.Name = Name; + this.ActiveState = IsActive; + this.NumBin = BinNumber; + this.IsConnectedToDatabase = IsConnectedToDB; + this.GlobalInfo = GlobalInfo; + CreateAssociatedWindow(); + } + + public cDescriptorsType(string Name, bool IsActive, int BinNumber, cGlobalInfo GlobalInfo) + { + //this.AssociatedcListDescriptors = AssociatedcListDescriptors; + if (GlobalInfo.CurrentScreen != null) + { + int IdxForNewName = -1; + bool IsAlreadyExisting = false; + string OriginalName = Name; + + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + + while (IsAlreadyExisting) + { + IdxForNewName++; + Name = OriginalName + IdxForNewName; + + IsAlreadyExisting = false; + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + } + } + this.Name = Name; + this.ActiveState = IsActive; + this.NumBin = BinNumber; + this.IsConnectedToDatabase = false; + this.GlobalInfo = GlobalInfo; + + CreateAssociatedWindow(); + } + + public cDescriptorsType(string Name, bool IsActive, int BinNumber, cGlobalInfo GlobalInfo, string Description) + { + //this.AssociatedcListDescriptors = AssociatedcListDescriptors; + if (GlobalInfo.CurrentScreen != null) + { + int IdxForNewName = -1; + bool IsAlreadyExisting = false; + string OriginalName = Name; + + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + + while (IsAlreadyExisting) + { + IdxForNewName++; + Name = OriginalName + IdxForNewName; + + IsAlreadyExisting = false; + foreach (var item in GlobalInfo.CurrentScreen.ListDescriptors) + { + if (item.Name == Name) + { + IsAlreadyExisting = true; + break; + } + } + } + + + } + this.Name = Name; + this.ActiveState = IsActive; + this.NumBin = BinNumber; + this.IsConnectedToDatabase = false; + this.GlobalInfo = GlobalInfo; + this.description = Description; + CreateAssociatedWindow(); + } + public string GetName() + { + return Name; + } + + public string GetShortInfo() + { + base.ShortInfo = "Descriptor: " + this.Name + "\n"; + return base.GetShortInfo(); + } + + + public int GetBinNumber() + { + return NumBin; + } + + public string GetDataType() + { + if (NumBin == 1) return "Single"; + else + return "Histogram"; + } + + public void SetActiveState(bool IsActive) + { + this.ActiveState = IsActive; + } + + public bool IsActive() + { + return this.ActiveState; + } + + public bool ChangeName(string NewName) + { + this.Name = NewName; + return true; + } + + public void ChangeBinNumber(int NewBinNumber) + { + int IdxDesc = GlobalInfo.CurrentScreen.ListDescriptors.GetDescriptorIndex(this); + + foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesAvailable) + { + for (int Col = 1; Col <= GlobalInfo.CurrentScreen.Columns; Col++) + for (int Row = 1; Row <= GlobalInfo.CurrentScreen.Rows; Row++) + { + cWell TmpWell = TmpPlate.GetWell(Col, Row, false); + if (TmpWell == null) continue; + TmpWell.ListDescriptors[IdxDesc].RefreshHisto(NewBinNumber); + } + } + + this.NumBin = NewBinNumber; + + } + + private void CreateAssociatedWindow() + { + WindowDescriptorInfo = new FormForDescriptorInfo(this); + WindowDescriptorInfo.CurrentDesc = this; + WindowDescriptorInfo.Text = this.Name; + } + + public List GetExtendedContextMenu() + { + List ListToReturn = new List(); + + base.SpecificContextMenu = new ToolStripMenuItem(this.Name); + + // info + ToolStripMenuItem InfoDescItem = new ToolStripMenuItem("Info"); + InfoDescItem.Click += new System.EventHandler(this.InfoDescItem); + base.SpecificContextMenu.DropDownItems.Add(InfoDescItem); + + ToolStripMenuItem StackedHistoDescItem = new ToolStripMenuItem("Stacked Histo."); + StackedHistoDescItem.Click += new System.EventHandler(this.StackedHistoDescItem); + base.SpecificContextMenu.DropDownItems.Add(StackedHistoDescItem); + + if (GlobalInfo.CurrentScreen.ListDescriptors.Count >= 2) + { + ToolStripMenuItem RemoveDescItem = new ToolStripMenuItem("Remove"); + RemoveDescItem.Click += new System.EventHandler(this.RemoveDescItem); + base.SpecificContextMenu.DropDownItems.Add(RemoveDescItem); + } + + base.SpecificContextMenu.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem DescriptorsView = new ToolStripMenuItem("Descriptor view"); + DescriptorsView.Click += new System.EventHandler(this.DescriptorsView); + base.SpecificContextMenu.DropDownItems.Add(DescriptorsView); + + ToolStripMenuItem DescriptorsSetAsActive = new ToolStripMenuItem("Set as current"); + DescriptorsSetAsActive.Click += new System.EventHandler(this.DescriptorsSetAsActive); + base.SpecificContextMenu.DropDownItems.Add(DescriptorsSetAsActive); + + + string NewState = ""; + if (this.ActiveState) + NewState = "inactive"; + else + NewState = "active"; + + ToolStripMenuItem DescriptorsSetAsInActive = new ToolStripMenuItem("Set as "+NewState); + DescriptorsSetAsInActive.Click += new System.EventHandler(this.DescriptorsSetAsInActive); + base.SpecificContextMenu.DropDownItems.Add(DescriptorsSetAsInActive); + + ListToReturn.Add(base.SpecificContextMenu); + return ListToReturn; + } + + void DescriptorsView(object sender, EventArgs e) + { + // GlobalInfo.CurrentScreen.GetCurrentDisplayPlate().DisplayDescriptorsWindow(); + + List ListPlates = new List(); + + foreach (cPlate CurrentPlate in GlobalInfo.CurrentScreen.ListPlatesActive) + ListPlates.Add(new FormToDisplayPlate(CurrentPlate, GlobalInfo.CurrentScreen)); + + cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, this.GetName(), 6, GlobalInfo); + WindowToDisplayArray.Show(); + } + + void DescriptorsSetAsActive(object sender, EventArgs e) + { + GlobalInfo.WindowHCSAnalyzer.comboBoxDescriptorToDisplay.Text = this.Name; + } + + void DescriptorsSetAsInActive(object sender, EventArgs e) + { + for (int i = 0; i < GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; i++) + { + if (GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items[i].ToString() == this.Name) + { + this.ActiveState = !this.ActiveState; + GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.SetItemChecked(i, this.ActiveState); + return; + } + } + } + + void StackedHistoDescItem(object sender, EventArgs e) + { + + #region Obsolete + //FormForMultipleClassSelection WindowForClassSelection = new FormForMultipleClassSelection(); + //PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true); + //ClassSelectionPanel.Height = WindowForClassSelection.splitContainerForClassSelection.Panel1.Height; + //WindowForClassSelection.splitContainerForClassSelection.Panel1.Controls.Add(ClassSelectionPanel); + + //if (WindowForClassSelection.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + //// WindowForClassSelection.panelForClassesSelection = new + + //cExtendedList[] ListValuesForHisto = new cExtendedList[/*ClassSelectionPanel.GetListIndexSelectedClass().Count*/ GlobalInfo.GetNumberofDefinedWellClass()]; + + //List ListSelectedClass = ClassSelectionPanel.GetListSelectedClass(); + + //for (int i = 0; i < ListValuesForHisto.Length; i++) + // ListValuesForHisto[i] = new cExtendedList(); + + //cWell TempWell; + + //int NumberOfPlates = GlobalInfo.CurrentScreen.ListPlatesActive.Count; + + //double MinValue = double.MaxValue; + //double MaxValue = double.MinValue; + //double CurrentValue; + + //int IdxDesc = -1; + + //for (int Idx = 0; Idx < GlobalInfo.CurrentScreen.ListDescriptors.Count; Idx++) + //{ + // if (GlobalInfo.CurrentScreen.ListDescriptors[Idx] == this) + // { + // IdxDesc = Idx; + // break; + // } + //} + //if (IdxDesc == -1) return; + + //// loop on all the plate + //for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + //{ + // cPlate CurrentPlateToProcess = GlobalInfo.CurrentScreen.ListPlatesActive.GetPlate(GlobalInfo.CurrentScreen.ListPlatesActive[PlateIdx].Name); + + // for (int row = 0; row < GlobalInfo.CurrentScreen.Rows; row++) + // for (int col = 0; col < GlobalInfo.CurrentScreen.Columns; col++) + // { + // TempWell = CurrentPlateToProcess.GetWell(col, row, false); + // if (TempWell == null) continue; + // else + // { + // if (TempWell.GetClassIdx() >= 0) + // { + // CurrentValue = TempWell.ListDescriptors[IdxDesc].GetValue(); + // ListValuesForHisto[TempWell.GetClassIdx()].Add(CurrentValue); + // if (CurrentValue < MinValue) MinValue = CurrentValue; + // if (CurrentValue > MaxValue) MaxValue = CurrentValue; + // } + // } + // } + //} + //SimpleForm NewWindow = new SimpleForm(); + //List[] HistoPos = new List[ListValuesForHisto.Length]; + //Series[] SeriesPos = new Series[ListValuesForHisto.Length]; + + + //for (int i = 0; i < ListValuesForHisto.Length; i++) + //{ + // HistoPos[i] = new List(); + // if (ListSelectedClass[i]) + // HistoPos[i] = ListValuesForHisto[i].CreateHistogram(MinValue, MaxValue, (int)GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); + + // SeriesPos[i] = new Series(); + //} + + //for (int i = 0; i < SeriesPos.Length; i++) + //{ + // int Max = 0; + // if (HistoPos[i].Count > 0) + // Max = HistoPos[i][0].Length; + + // for (int IdxValue = 0; IdxValue < Max; IdxValue++) + // { + // SeriesPos[i].Points.AddXY(MinValue + ((MaxValue - MinValue) * IdxValue) / Max, HistoPos[i][1][IdxValue]); + // SeriesPos[i].Points[IdxValue].ToolTip = HistoPos[i][1][IdxValue].ToString(); + // if (GlobalInfo.CurrentScreen.SelectedClass == -1) + // SeriesPos[i].Points[IdxValue].Color = Color.Black; + // else + // SeriesPos[i].Points[IdxValue].Color = GlobalInfo.CurrentScreen.GlobalInfo.ListWellClasses[i].ColourForDisplay; + // } + //} + //ChartArea CurrentChartArea = new ChartArea(); + //CurrentChartArea.BorderColor = Color.Black; + + //NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + //CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + //CurrentChartArea.Axes[0].Title = this.Name; + //CurrentChartArea.Axes[1].Title = "Sum"; + //CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + //NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + //CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + //CurrentChartArea.BackColor = GlobalInfo.CurrentScreen.GlobalInfo.OptionsWindow.panel1.BackColor; + //CurrentChartArea.BackSecondaryColor = Color.White; + + + //for (int i = 0; i < SeriesPos.Length; i++) + //{ + // SeriesPos[i].ChartType = SeriesChartType.StackedColumn; + // // SeriesPos[i].Color = GlobalInfo.CurrentScreen.GlobalInfo.GetColor(1); + // if (ListSelectedClass[i]) + // NewWindow.chartForSimpleForm.Series.Add(SeriesPos[i]); + //} + ////Series SeriesGaussNeg = new Series(); + ////SeriesGaussNeg.ChartType = SeriesChartType.Spline; + + ////Series SeriesGaussPos = new Series(); + ////SeriesGaussPos.ChartType = SeriesChartType.Spline; + + ////if (HistoPos.Count != 0) + ////{ + //// double[] HistoGaussPos = CreateGauss(Mean(Pos.ToArray()), std(Pos.ToArray()), HistoPos[0].Length); + + //// SeriesGaussPos.Color = Color.Black; + //// SeriesGaussPos.BorderWidth = 2; + ////} + ////SeriesGaussNeg.Color = Color.Black; + ////SeriesGaussNeg.BorderWidth = 2; + + ////NewWindow.chartForSimpleForm.Series.Add(SeriesGaussNeg); + ////NewWindow.chartForSimpleForm.Series.Add(SeriesGaussPos); + //NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + + //Title CurrentTitle = null; + + //CurrentTitle = new Title(this.Name + " Stacked histogram."); + + //CurrentTitle.Font = new System.Drawing.Font("Arial", 11, System.Drawing.FontStyle.Bold); + //NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + //NewWindow.Text = CurrentTitle.Text; + //NewWindow.Show(); + //NewWindow.chartForSimpleForm.Update(); + //NewWindow.chartForSimpleForm.Show(); + //NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + //return; + #endregion + + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + + if (ListClassSelected.Sum() < 1) + { + System.Windows.Forms.MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + cDisplayToWindow CDW1 = new cDisplayToWindow(); + + + + // if ((ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) || (ProcessModeEntireScreeningToolStripMenuItem.Checked)) + { + cListWell ListWellsToProcess = new cListWell(null); + List PlateList = new List(); + +// if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) +// PlateList.Add(GlobalInfo.CurrentScreen.GetCurrentDisplayPlate()); +// else +// { + foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesActive) PlateList.Add(TmpPlate); +// } + + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + + + // if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + // CDW1.Title = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptor].GetName() + " - Stacked Histogram (" + PlateList[0].Name + ")"; + // else + CDW1.Title = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Stacked Histogram - " + PlateList.Count + " plates"; + + cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable.Name = CDW1.Title; + + cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + CV1.SetInputData(NewTable); + CV1.Chart.LabelAxisX = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV1.Run(); + + CDW1.SetInputData(CV1.GetOutPut()); + } + //else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + //{ + // cDesignerTab CDT = new cDesignerTab(); + // foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesActive) + // { + // cListWell ListWellsToProcess = new cListWell(null); + // foreach (cWell item in TmpPlate.ListActiveWells) + // if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + + // cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, true); + // NewTable.Name = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptor].GetName() + " - " + TmpPlate.Name; + + + // cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + // CV1.SetInputData(NewTable); + // CV1.Chart.LabelAxisX = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptor].GetName(); + // CV1.Title = TmpPlate.Name; + // CV1.Run(); + + // CDT.SetInputData(CV1.GetOutPut()); + // } + // CDT.Run(); + // CDW1.SetInputData(CDT.GetOutPut()); + // CDW1.Title = "Stacked Histogram - " + GlobalInfo.CurrentScreen.ListPlatesActive.Count + " plates"; + //} + + CDW1.Run(); + CDW1.Display(); + + } + + void RemoveDescItem(object sender, EventArgs e) + { + System.Windows.Forms.DialogResult ResWin = System.Windows.Forms.MessageBox.Show("By applying this process, the selected descriptor will be definitively removed from this analysis ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (ResWin == System.Windows.Forms.DialogResult.No) return; + GlobalInfo.CurrentScreen.ListDescriptors.RemoveDesc(this, GlobalInfo.CurrentScreen); + + //GlobalInfo.CurrentScreen.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < GlobalInfo.CurrentScreen.ListPlatesActive.Count; idxP++) + GlobalInfo.CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); + GlobalInfo.CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + + void InfoDescItem(object sender, EventArgs e) + { + WindowDescriptorInfo.ShowDialog(); + GlobalInfo.CurrentScreen.ListDescriptors.UpDateDisplay(); + } + + } + + public class cListDescriptors : List + { + CheckedListBox AssociatedListBox; + ComboBox AssociatedListDescriptorToDisplay; + public int CurrentSelectedDescriptorIdx = -1; + + public int GetDescriptorIndex(cDescriptorsType DescriptorType) + { + int DescIndex = -1; + foreach (cDescriptorsType TmpDescType in this) + { + DescIndex++; + if (TmpDescType.GetName() == DescriptorType.GetName()) return DescIndex; + } + + return -1; + } + + public List GetActiveDescriptors() + { + List ToReturn = new List(); + + foreach (cDescriptorsType TmpDesc in this) + if (TmpDesc.IsActive()) ToReturn.Add(TmpDesc); + + return ToReturn; + } + + public cDescriptorsType GetActiveDescriptor() + { + if (CurrentSelectedDescriptorIdx == -1) return null; + return this[CurrentSelectedDescriptorIdx]; + } + + public int GetDescriptorIndex(string DescriptorName) + { + int DescIndex = -1; + foreach (cDescriptorsType TmpDescType in this) + { + DescIndex++; + if (TmpDescType.GetName() == DescriptorName) return DescIndex; + } + + return -1; + } + + public void SetCurrentSelectedDescriptor(int Desc) + { + this.CurrentSelectedDescriptorIdx = Desc; + this.AssociatedListDescriptorToDisplay.SelectedIndex = Desc; + } + + public cListDescriptors(CheckedListBox AssociatedListBox, ComboBox AssociatedComboBox) + { + this.AssociatedListBox = AssociatedListBox; + this.AssociatedListDescriptorToDisplay = AssociatedComboBox; + + } + + /// + /// Clear the object as well as the associated control + /// + public void Clean() + { + this.Clear(); + AssociatedListBox.Items.Clear(); + AssociatedListDescriptorToDisplay.Items.Clear(); + } + + /// + /// Add a descritpor to the global descriptor list + /// + /// + /// return false if the descriptor type already exist + public bool AddNew(cDescriptorsType DescriptorsType) + { + foreach (cDescriptorsType temp in this) + { + if (temp.GetName() == DescriptorsType.GetName()) + return false; + } + + + this.Add(DescriptorsType); + this.AssociatedListBox.Items.Add(DescriptorsType.GetName(), true); + this.AssociatedListDescriptorToDisplay.Items.Add(DescriptorsType.GetName()); + return true; + } + + public void RemoveDesc(cDescriptorsType DescriptorTypeToBeRemoved, cScreening CurrentScreen) + { + for (int i = 0; i < this.Count; i++) + { + cDescriptorsType TmpType = this[i]; + + if (DescriptorTypeToBeRemoved == TmpType) + { + foreach (cPlate TmpPlate in CurrentScreen.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) Tmpwell.ListDescriptors.RemoveAt(i); + } + + this.RemoveAt(i); + AssociatedListBox.Items.RemoveAt(i); + AssociatedListDescriptorToDisplay.Items.RemoveAt(i); + AssociatedListDescriptorToDisplay.SelectedIndex = 0; + return; + + } + } + } + + public void RemoveDescUnSafe(cDescriptorsType DescriptorTypeToBeRemoved, cScreening CurrentScreen) + { + for (int i = 0; i < this.Count; i++) + { + cDescriptorsType TmpType = this[i]; + + if (DescriptorTypeToBeRemoved == TmpType) + { + foreach (cPlate TmpPlate in CurrentScreen.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) Tmpwell.ListDescriptors.RemoveAt(i); + } + + this.RemoveAt(i); + AssociatedListBox.Items.RemoveAt(i); + AssociatedListDescriptorToDisplay.Items.RemoveAt(i); + + return; + + } + } + } + + public List GetListNameActives() + { + List NameActiveDesc = new List(); + + foreach (cDescriptorsType TmpDesc in this) + { + if (TmpDesc.IsActive()) NameActiveDesc.Add(TmpDesc.GetName()); + } + return NameActiveDesc; + } + + /// + /// + /// + /// + public void SetItemState(int IdxDesc, bool IsActive) + { + if (IsActive) + { + AssociatedListBox.SetItemCheckState(IdxDesc, CheckState.Checked); + this[IdxDesc].SetActiveState(true); + } + else + { + AssociatedListBox.SetItemCheckState(IdxDesc, CheckState.Unchecked); + this[IdxDesc].SetActiveState(false); + } + + } + + public void UpDateDisplay() + { + int Idx = 0; + foreach (cDescriptorsType TmpType in this) + { + AssociatedListBox.Items[Idx] = TmpType.GetName(); + AssociatedListDescriptorToDisplay.Items[Idx] = TmpType.GetName(); + Idx++; + } + } + + public cExtendedList GetValue(List ListPlate, cDescriptorsType Desc) + { + cExtendedList ToReturn = new cExtendedList(); + + int Idx = this.GetDescriptorIndex(Desc); + + foreach (cPlate CurrentPlate in ListPlate) + foreach (cWell TmpWell in CurrentPlate.ListActiveWells) + ToReturn.Add(TmpWell.ListDescriptors[Idx].GetValue()); + return ToReturn; + } + + } + + public class cDescriptor + { + //string Name; + //public bool IsSingle; + + cDescriptorsType Type; + + public cWell AssociatedWell; + + private cScreening CurrentScreening; + + public cDescriptorsType GetAssociatedType() + { + return this.Type; + } + + public cHisto Histogram; + + private double AverageValue = 0; + + private double ComputeDistributionDistanceToReference() + { + return 0; + + } + + public int HistoBins; + + #region public + + /// + /// Return the value associated to a descriptor within a well + /// + /// if scalar mode: average else distance between histograms + public double GetValue() + { + if (CurrentScreening.Reference == null) + { + //if (Type.GetBinNumber() > 1) + //{ + // // MessageBox.Show("GetWeightedMean() not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + + // //return HistoValues.GetWeightedMean(); + // return -1; + //} + //else + // return Histogram.GetXvalues()[0]; + return this.AverageValue;// this.Histogram.GetAverageValue(); + } + else + { + System.Windows.Forms.MessageBox.Show("GetValue() not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + + //if (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricEuclidean.Checked) + // return HistoValues.Dist_Euclidean(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); + //else if + // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricManhattan.Checked) + // return HistoValues.Dist_Manhattan(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); + //else if + // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricCosine.Checked) + // return HistoValues.Dist_VectorCosine(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); + //else if + // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricBhattacharyya.Checked) + // return HistoValues.Dist_BhattacharyyaCoefficient(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); + //else if + // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricEMD.Checked) + // return HistoValues.Dist_EarthMover(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); + //else + return -1; + } + + + + } + + public void RefreshHisto(int NewNumBins) + { + this.HistoBins = NewNumBins; + this.Histogram = new cHisto(this.GetOriginalValues(), HistoBins); + + + } + + + + public void SetHistoValues(List ListXValues, List ListYValues) + { + this.Histogram = new cHisto(ListXValues, ListYValues); + UpDateDescriptorStatistics(); + + } + + public void SetHistoValues(double Value) + { + this.Histogram = new cHisto(Value); + // HistoValues[0] = Value; + UpDateDescriptorStatistics(); + + } + + public void SetHistoValues(int Idx, double Value) + { + this.Histogram.SetYvalues(Value, Idx); + // HistoValues[Idx] = Value; + UpDateDescriptorStatistics(); + + } + + public cExtendedList GetHistovalues() + { + return this.Histogram.GetYvalues(); + } + + public double GetHistovalue(int Idx) + { + return this.Histogram.GetYvalues()[Idx]; + } + + public double GetHistoXvalue(int Idx) + { + return this.Histogram.GetXvalues()[Idx]; + } + + /// + /// return the descriptor name + /// + /// the Descriptor name + public string GetName() + { + return this.Type.GetName(); + } + + + /// + /// Update the descritpor statistic (Average, first and last value) + /// + public void UpDateDescriptorStatistics() + { + this.AverageValue = Histogram.GetAverageValue(); + //FirstValue = HistoValues[0]; + // LastValue = HistoValues[HistoValues.Count - 1]; + } + + + #endregion + + // private double AverageValue; + + // private double FirstValue = -1; + // private double LastValue = -1; + + private double[] OriginalValues = null; + + public double[] GetOriginalValues() + { + if ((CurrentScreening.GlobalInfo.CellByCellDataAccess == eCellByCellDataAccess.MEMORY) && (this.OriginalValues != null)) + { + return this.OriginalValues; + } + else if (CurrentScreening.GlobalInfo.CellByCellDataAccess == eCellByCellDataAccess.HD) + { + AssociatedWell.AssociatedPlate.DBConnection = new cDBConnection(AssociatedWell.AssociatedPlate, AssociatedWell.SQLTableName); + List LCDT = new List(); + LCDT.Add(this.GetAssociatedType()); + cExtendedTable ToReturn = AssociatedWell.AssociatedPlate.DBConnection.GetWellValues(AssociatedWell.SQLTableName, LCDT ); + AssociatedWell.AssociatedPlate.DBConnection.DB_CloseConnection(); + return ToReturn[0].ToArray(); + } + return null; + } + + //private double getAverageValue(float[] Data) + //{ + // double Res = 0; + // for (int i = 0; i < Data.Length; i++) + // Res += Data[i]; + + // return Res / (double)(Data.Length); + //} + + //private cExtendedList CreateHistogram(double[] data, double start, double end, double step) + //{ + // int HistoSize = (int)((end - start) / step) + 1; + + // double[] histogram = new double[HistoSize]; + // double RealPos = start; + + // int PosHisto; + // foreach (double f in data) + // { + // PosHisto = (int)((f - start) / step); + // if ((PosHisto >= 0) && (PosHisto < HistoSize)) + // histogram[PosHisto]++; + // } + + // return histogram; + //} + + //private cExtendedList CreateHistogram(float[] data, double start, double end, double step) + //{ + // int HistoSize = (int)((end - start) / step) + 1; + + + // double[] histogram = new double[HistoSize]; + // double RealPos = start; + + // int PosHisto; + // foreach (float f in data) + // { + // PosHisto = (int)((f - start) / step); + // if ((PosHisto >= 0) && (PosHisto < HistoSize)) + // histogram[PosHisto]++; + // } + + // return histogram; + //} + + //private double getAverageValue(double[] Data) + //{ + // double Res = 0; + // for (int i = 0; i < Data.Length; i++) + // Res += Data[i]; + + // return Res / (double)(Data.Length); + //} + + + + + /// + /// Create a descriptor based on a list of value (typically an histogram) + /// + /// Array of values + /// Descriptor name + //public cDescriptor(double[] ListOriginalValues, cDescriptorsType Type) + //{ + + + // this.OriginalValues = new double[ListOriginalValues.Length]; + // Array.Copy(ListOriginalValues, this.OriginalValues, OriginalValues.Length); + + // this.Type = Type; + + // double Max = ListOriginalValues[0]; + // for (int i = 1; i < ListOriginalValues.Length; i++) + // { + // if (ListOriginalValues[i] > Max) Max = ListOriginalValues[i]; + // } + + // this.FirstValue = 0; + // this.LastValue = Max; + + // HistoValues = this.CreateHistogram(ListOriginalValues, 0, Max, Type.GetBinNumber()); + + // AverageValue = getAverageValue(ListOriginalValues); + // // if (HistoValues.Length == 1) IsSingle = true; + // // else IsSingle = false; + //} + + /// + /// Create a descritpor based on a single value + /// + /// Descritpor value + /// Descritpor name + public cDescriptor(double Value, cDescriptorsType Type, cScreening CurrentScreening) + { + this.CurrentScreening = CurrentScreening; + this.Type = Type; + this.Histogram = new cHisto(Value); + this.HistoBins = 1; + this.AverageValue = Value; + //this.FirstValue = this.LastValue = this.AverageValue = this.HistoValues[0] = Value; + + if (CurrentScreening.GlobalInfo.CellByCellDataAccess == eCellByCellDataAccess.MEMORY) + { + this.OriginalValues = new double[1]; + this.OriginalValues[0] = Value; + } + } + + public cDescriptor(cExtendedList Values, int Bin, cDescriptorsType Type, cScreening CurrentScreening) + { + this.CurrentScreening = CurrentScreening; + this.Type = Type; + this.HistoBins = Bin; + this.Histogram = new cHisto(Values, HistoBins); + + this.HistoBins = this.Histogram.GetXvalues().Count; + this.AverageValue = Values.Mean(); + + if (CurrentScreening.GlobalInfo.CellByCellDataAccess == eCellByCellDataAccess.MEMORY) + { + this.OriginalValues = new double[Values.Count]; + Array.Copy(Values.ToArray(), this.OriginalValues, this.OriginalValues.Length); + } + + //this.FirstValue = FirstValue; + // this.LastValue = LastValue; + + //this.HistoValues = new cExtendedList(); + + //this.HistoValues.AddRange(HistoGram); + + //if (HistoGram.Length < Type.GetBinNumber()) + //{ + // for (int i = 0; i < Type.GetBinNumber() - HistoGram.Length; i++) + // this.HistoValues.Add(0); + //} + + + // new double[HistoGram.Length]; + //Array.Copy(HistoGram, this.HistoValues, HistoGram.Length); + //this.Name = Name; + //AverageValue = getAverageValue(HistoGram); + // if (HistoGram.Length == 1) IsSingle = true; + // else IsSingle = false; + } + + } +} diff --git a/Classes/General/cGeneralComponent.cs b/Classes/General/cGeneralComponent.cs new file mode 100644 index 0000000..1b6c023 --- /dev/null +++ b/Classes/General/cGeneralComponent.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace LibPlateAnalysis +{ + public class cGeneralComponent + { + protected ToolStripMenuItem SpecificContextMenu = null; + protected string ShortInfo; + + public string GetShortInfo() + { + + return this.ShortInfo; + } + + + public ToolStripMenuItem GetContextMenu() + { + return this.SpecificContextMenu; + } + + } +} diff --git a/Classes/cGlobalInfo.cs b/Classes/General/cGlobalInfo.cs similarity index 71% rename from Classes/cGlobalInfo.cs rename to Classes/General/cGlobalInfo.cs index 6e2ba13..83127ce 100644 --- a/Classes/cGlobalInfo.cs +++ b/Classes/General/cGlobalInfo.cs @@ -7,12 +7,15 @@ using System.Windows.Forms; using HCSAnalyzer.Forms; using HCSAnalyzer.Forms.FormsForImages; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.General; namespace HCSAnalyzer.Classes { - public enum eViewMode { AVERAGE, DISTRIBUTION, PIE}; + public enum eViewMode { AVERAGE, DISTRIBUTION, PIE }; public enum eCellByCellDataAccess { NONE, MEMORY, HD }; + public enum eProcessMode { SINGLE_PLATE, PLATE_BY_PLATE, ENTIRE_SCREENING }; public class cLUT { @@ -57,21 +60,108 @@ public class cLUT new byte[]{0,4,7,11,14,18,21,25,28,32,35,39,43,46,50,53,57,60,64,67,71,74,78,81,86,91,96,101,106,111,116,120,125,130,135,140,145,150,155,159,164,169,174,179,184,189,193,198,202,205,209,213,216,220,223,227,230,234,237,241,244,248,251,255}, new byte[]{1,6,11,16,21,26,31,35,40,45,50,55,60,65,70,74,79,84,89,94,99,104,108,113,117,120,124,128,131,135,138,142,145,149,152,156,159,163,166,170,174,177,181,184,188,191,195,198,202,205,209,213,216,220,223,227,230,234,237,241,244,248,251,255}}; public byte[][] LUT_COPPER = {new byte[]{0,5,10,15,20,25,30,35,40,46,51,56,61,66,71,76,81,86,91,96,101,106,111,116,121,126,132,137,142,147,152,157,162,167,172,177,182,187,192,197,202,207,212,218,223,228,233,238,243,248,253,255,255,255,255,255,255,255,255,255,255,255,255,255}, - new byte[]{0,3,6,9,13,16,19,22,25,28,32,35,38,41,44,47,51,54,57,60,63,66,70,73,76,79,82,85,89,92,95,98,101,104,108,111,114,117,120,123,126,130,133,136,139,142,145,149,152,155,158,161,164,168,171,174,177,180,183,187,190,193,196,199}, + new byte[]{0,3,6,9,13,16,19,22,25,28,32,35,38,41,44,47,51,54,57,60,63,66,70,73,76,79,82,85,89,92,95,98,101,104,108,111,114,117,120,123,126,130,133,136,139,142,145,149,152,155,158,161,164,168,171,174,177,180,183,187,190,193,196,199}, new byte[]{0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127}}; + public byte[][] LUT_LINEAR = {new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}, + new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}, + new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255}}; + #endregion + } + + #region Well Class + + public class cListWellClasses : List + { + private Color[] ColorForClass = new Color[] { + Color.FromArgb(136,17,17), + Color.FromArgb(21,88,140), + Color.FromArgb(51,102,68), + Color.FromArgb(221,204,170), + Color.FromArgb(204,85,17), + Color.FromArgb(85,85,68), + Color.FromArgb(136,85,34), + Color.FromArgb(59,51,126), + Color.FromArgb(82,122,140), + Color.FromArgb(238,238,238), + }; + + //private Color[] ColorForClass = new Color[] { Color.LightGreen, Color.Tomato, Color.Olive, Color.Orange, Color.Yellow, Color.Violet, Color.Pink, Color.Purple, Color.Salmon, Color.RoyalBlue }; + + public cListWellClasses(cGlobalInfo GlobalInfo) + { + for (int Idx = 0; Idx < ColorForClass.Length; Idx++) + this.Add(new cWellClass(ColorForClass[Idx], "Class " + Idx, GlobalInfo)); + } + + public byte[][] BuildLUT() + { + byte[][] LUTToReturn = new byte[3][]; + + for (int i = 0; i < LUTToReturn.Length; i++) + { + LUTToReturn[i] = new byte[ColorForClass.Length]; + for (int j = 0; j < LUTToReturn[i].Length; j++) + { + if(i==0) + LUTToReturn[i][j] = ColorForClass[j].R; + else if (i == 1) + LUTToReturn[i][j] = ColorForClass[j].G; + else if (i == 2) + LUTToReturn[i][j] = ColorForClass[j].B; + + } + } + //public byte[][] LUT_JET = {new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128}, + // new byte[]{0,0,0,0,0,0,0,0,16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0,0,0,0,0,0,0,0,0}, + // new byte[]{143,159,175,191,207,223,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + return LUTToReturn; + } - } + #endregion + + + public class cListCellularPhenotypes : List + { + private Color[] ColorForClass = new Color[] { + Color.FromArgb(57,40,57), + Color.FromArgb(188,199,156), + Color.FromArgb(102,160,37), + Color.FromArgb(255,140,173), + Color.FromArgb(94,79,22), + Color.FromArgb(182,166,137), + Color.FromArgb(210,199,184), + Color.FromArgb(108,136,144), + Color.FromArgb(196,211,217), + Color.FromArgb(162,21,64), + Color.FromArgb(254,108,153), + Color.FromArgb(160,163,111), + }; + + public cListCellularPhenotypes() + { + for (int Idx = 0; Idx < ColorForClass.Length; Idx++) + this.Add(new cCellularPhenotype(ColorForClass[Idx], Idx)); + } + } public class cGlobalInfo { + + public eProcessMode ProcessMode; + + public cListWellClasses ListWellClasses; + public cListCellularPhenotypes ListCellularPhenotypes = new cListCellularPhenotypes(); + + public FormForDRCDesign WindowForDRCDesign = new FormForDRCDesign(); public string WindowName; public bool _Is3DVisualization = false; @@ -81,7 +171,7 @@ public class cGlobalInfo public cLUT LUTs = new cLUT(); //public bool IsConnectedToDatabase { get; private set; } - public eCellByCellDataAccess CellByCellDataAccessMode = eCellByCellDataAccess.NONE; + public eCellByCellDataAccess CellByCellDataAccess = eCellByCellDataAccess.NONE; List ListImageViewers = new List(); @@ -90,7 +180,7 @@ public class cGlobalInfo public void DisplayViewer(cImageViewer ImageViewer) { ListImageViewers.Add(ImageViewer); - ListImageViewers[ListImageViewers.Count-1].Display(); + ListImageViewers[ListImageViewers.Count - 1].Display(this); } @@ -128,7 +218,7 @@ public void SwitchDistributionMode() List Ref = new List(); foreach (cWell WellForRef in CurrentScreen.GetCurrentDisplayPlate().ListActiveWells) { - if (WellForRef.GetClass() == 0) + if (WellForRef.GetClassIdx() == 0) Ref.Add(WellForRef); } @@ -138,11 +228,11 @@ public void SwitchDistributionMode() CurrentScreen.Reference = new cReference(Ref); } - for (int idxP = 0; idxP < CurrentScreen.ListPlatesActive.Count; idxP++) - CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); + //for (int idxP = 0; idxP < CurrentScreen.ListPlatesActive.Count; idxP++) + // CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); - //StartingUpDateUI(); - CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); + ////StartingUpDateUI(); + //CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); } public bool Is3DVisu() @@ -160,16 +250,16 @@ public void SwitchVisuMode() //_Is3DVisualization = !_Is3DVisualization; //if (_Is3DVisualization == false) - // { - //CurrentScreen.Close3DView(); - this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked = !this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked; -/* } - else - { - //CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); - this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked = true; - } - */ + // { + //CurrentScreen.Close3DView(); + this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked = !this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked; + /* } + else + { + //CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); + this.WindowHCSAnalyzer.ThreeDVisualizationToolStripMenuItem.Checked = true; + } + */ } public Label LabelForClass; @@ -191,6 +281,30 @@ public void SwitchVisuMode() public byte[][] LUT; + public cGlobalInfo(cScreening CurrentScreen, HCSAnalyzer WindowHCSAnalyzer) + { + this.ListWellClasses = new cListWellClasses(this); + OptionsWindow = new FormForOptionsWindow(CurrentScreen); + this.CurrentScreen = CurrentScreen; + this.WindowHCSAnalyzer = WindowHCSAnalyzer; + this.WindowName = WindowHCSAnalyzer.Text; + this.LUT = LUTs.LUT_JET; + OptionsWindow.panelForWellClasses.Controls.Add(new PanelForClassEditing(this)); + OptionsWindow.panelForCellularPhenotypes.Controls.Add(new PanelForPhenotypeEditing(this)); + + if (WindowHCSAnalyzer.ProcessModeplateByPlateToolStripMenuItem.Checked) + this.ProcessMode = eProcessMode.PLATE_BY_PLATE; + else if (WindowHCSAnalyzer.ProcessModeEntireScreeningToolStripMenuItem.Checked) + this.ProcessMode = eProcessMode.ENTIRE_SCREENING; + else + this.ProcessMode = eProcessMode.SINGLE_PLATE; + + + + } + + + public void ChangeLUT(byte[][] NewLUT) { this.LUT = NewLUT; @@ -199,19 +313,24 @@ public void ChangeLUT(byte[][] NewLUT) public Color[] ColorForDRCCurves = new Color[] { Color.Blue, Color.Red, Color.Black, Color.Orange, Color.Yellow, Color.LightGreen, Color.Pink, Color.Purple, Color.Cyan }; - private Color[] ColorForClass = new Color[] { Color.LightGreen, Color.Tomato, Color.Olive, Color.Orange, Color.Yellow, Color.Violet, Color.Pink, Color.Purple, Color.Salmon, Color.RoyalBlue }; + public string[] ListArtifacts = new string[] { "edge effect", "column artifact", "row artifact", "bowl effect" }; /// /// Return the number of available class (correspond to the number of colors defined by the developper) /// /// number of class (here 10) - public int GetNumberofDefinedClass() + public int GetNumberofDefinedWellClass() { - return ColorForClass.Length; + return this.ListWellClasses.Count; } + public int GetNumberofDefinedCellularPhenotypes() + { + return this.ListCellularPhenotypes.Count; + } + public void ConsoleWriteLine(string DispText) { if ((CurrentRichTextBox == null) || (CurrentRichTextBox.IsDisposed)) CurrentRichTextBox = new RichTextBox(); @@ -219,15 +338,11 @@ public void ConsoleWriteLine(string DispText) CurrentRichTextBox.Update(); } - public string ConvertIntPosToStringPos(int Pos) { string ReturnString = ""; - int First = Pos / 27; int Second = Pos - First * 26; - - if (First != 0) ReturnString = ((char)(First + 64)).ToString(); if (Second != 0) ReturnString += ((char)(Second + 64)).ToString(); @@ -235,22 +350,6 @@ public string ConvertIntPosToStringPos(int Pos) } - public cGlobalInfo(cScreening CurrentScreen, HCSAnalyzer WindowHCSAnalyzer) - { - OptionsWindow = new FormForOptionsWindow(CurrentScreen); - this.CurrentScreen = CurrentScreen; - this.WindowHCSAnalyzer = WindowHCSAnalyzer; - this.WindowName = WindowHCSAnalyzer.Text; - this.LUT = LUTs.LUT_JET; - - - } - - public Color GetColor(int Class) - { - return ColorForClass[Class]; - } - internal void ChangeSize(float Factor) { SizeHistoWidth *= Factor; diff --git a/Classes/cHisto.cs b/Classes/General/cHisto.cs similarity index 92% rename from Classes/cHisto.cs rename to Classes/General/cHisto.cs index 6d55fd5..2d94643 100644 --- a/Classes/cHisto.cs +++ b/Classes/General/cHisto.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer.Classes { public class cHisto { - public double Step { get; private set; } public double Min() { @@ -57,10 +57,9 @@ public double GetYValue(int Idx) public cHisto(cExtendedList OriginalValues, int NumBin) { - List Res = this.CreateHistogram(OriginalValues.ToArray(), NumBin);// OriginalValues.CreateHistogram(NumBin); + List Res= OriginalValues.CreateHistogram(NumBin); ListValuesX = Res[0]; ListValuesY = Res[1]; - // this.Step = (Res[0].Max() - Res[0].Min()) / NumBin; } @@ -95,14 +94,14 @@ public List CreateHistogram(double[] ListValues, double Bin) } - this.Step = (Max - Min) / Bin; + double step = (Max - Min) / Bin; // int HistoSize = (int)((Max - Min) / step)+1; axeX = new double[(int)Bin]; for (int i = 0; i < (int)Bin; i++) { - axeX[i] = Min + i * this.Step; + axeX[i] = Min + i * step; } ToReturn.Add(axeX); diff --git a/Classes/General/cListSingleBiologicalObjects.cs b/Classes/General/cListSingleBiologicalObjects.cs new file mode 100644 index 0000000..00811f1 --- /dev/null +++ b/Classes/General/cListSingleBiologicalObjects.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace HCSAnalyzer.Classes.General +{ + public class cListSingleBiologicalObjects : List + { + + + } +} diff --git a/Classes/General/cListWell.cs b/Classes/General/cListWell.cs new file mode 100644 index 0000000..6692901 --- /dev/null +++ b/Classes/General/cListWell.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.Base_Classes.Viewers; + +namespace HCSAnalyzer.Classes.General +{ + public class cListWell : List + { + cGlobalInfo GlobalInfo; + int NewClass; + public object Sender; + + public cListWell(object Sender) + { + this.Sender = Sender; + } + + public cWell GetWell(int PosX, int PosY) + { + return null; + } + + public cWell GetWell(int Idx) + { + if (Idx < 0) return null; + if (this.Count == 0) return null; + // if (Idx > this.Count) return null; + return this[Idx]; + } + + public void SetNewClass(int IdxClass) + { + foreach (var item in this) + item.SetClass(IdxClass); + } + + void ToolStripMenuItem_GetTable(object sender, EventArgs e) + { + cExtendedTable DT = GetDescriptorValuesFull(); + cDisplayExtendedTable DET = new cDisplayExtendedTable(); + DET.Set_Data(DT); + DET.Run(); + } + + public cExtendedTable GetDescriptorValuesFull() + { + cExtendedTable ToBeReturned = new cExtendedTable(); + ToBeReturned.Name = this.Count + " wells associated data table"; + ToBeReturned.ListRowNames = new List(); + this.GlobalInfo = this[0].Parent.GlobalInfo; + + foreach (var item in this[0].Parent.ListDescriptors) + { + if(item.IsActive()) + { + ToBeReturned.Add(new cExtendedList(item.GetName())); + ToBeReturned[ToBeReturned.Count-1].Tag = item; + ToBeReturned[ToBeReturned.Count - 1].ListTags = new List(); + } + } + ToBeReturned.Add(new cExtendedList("Class")); + ToBeReturned[ToBeReturned.Count - 1].ListTags = new List(); + + foreach (var item in this) + { + cExtendedList CEL = item.GetAverageValuesList(true); + int IdxDesc=0; + foreach (var Desc in CEL) + { + ToBeReturned[IdxDesc].Add(CEL[IdxDesc]); + ToBeReturned[IdxDesc++].ListTags.Add(item); + } + ToBeReturned[ToBeReturned.Count-1].Add(item.GetClassIdx()); + ToBeReturned[ToBeReturned.Count - 1].ListTags.Add(item); + ToBeReturned.ListRowNames.Add(item.GetShortInfo()); + } + return ToBeReturned; + } + + public cExtendedTable GetDescriptorValues(int IDxDesc, bool IsClassesSplitted) + { + if (this.Count == 0) return null; + if (IDxDesc >= this[0].ListDescriptors.Count) return null; + + cExtendedTable ToBeReturned = new cExtendedTable(); + this.GlobalInfo = this[0].Parent.GlobalInfo; + + if (IsClassesSplitted) + { + foreach (var item in GlobalInfo.ListWellClasses) + { + ToBeReturned.Add(new cExtendedList(item.Name)); + ToBeReturned[ToBeReturned.Count - 1].Tag = item; + ToBeReturned[ToBeReturned.Count - 1].ListTags = new List(); + } + + foreach (cWell TmpWell in this) + { + ToBeReturned[TmpWell.GetClassIdx()].Add(TmpWell.ListDescriptors[IDxDesc].GetValue()); + ToBeReturned[TmpWell.GetClassIdx()].ListTags.Add(TmpWell); + } + } + else + { + + } + + + + return ToBeReturned; + } + + #region Context Menu + public ToolStripMenuItem GetContextMenu() + { + + if (this.Count == 0) return null; + + ToolStripMenuItem SpecificContextMenu = new ToolStripMenuItem("List " + this.Count + " wells"); + // ToolStripSeparator Sep = new ToolStripSeparator(); + // base.SpecificContextMenu.Items.Add(Sep); + + + //ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Test Automated Menu"); + + //base.SpecificContextMenu.Items.Add(ToolStripMenuItem_Info); + + //// contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); + + ////ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //// contextMenuStrip.Show(Control.MousePosition); + //ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + + + ToolStripMenuItem ToolStripMenuItem_ChangeClass = new ToolStripMenuItem("Classes"); + //ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_ChangeClass); + + + for (int i = 0; i < this[0].Parent.GlobalInfo.ListWellClasses.Count; i++) + { + ToolStripMenuItem ToolStripMenuItem_NewClass = new ToolStripMenuItem(this[0].Parent.GlobalInfo.ListWellClasses[i].Name); + ToolStripMenuItem_NewClass.Click += new System.EventHandler(this.ToolStripMenuItem_NewClass); + ToolStripMenuItem_NewClass.Tag = i;// this[0].Parent.GlobalInfo.ListWellClasses[i]; + ToolStripMenuItem_ChangeClass.DropDownItems.Add(ToolStripMenuItem_NewClass); + } + + ToolStripMenuItem ToolStripMenuItem_GetTable = new ToolStripMenuItem("Get associated data table"); + ToolStripMenuItem_GetTable.Click += new System.EventHandler(this.ToolStripMenuItem_GetTable); + // ToolStripMenuItem_NewClass.Tag = i;// this[0].Parent.GlobalInfo.ListWellClasses[i]; + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_GetTable); + + + //ToolStripMenuItem ToolStripMenuItem_CopyValuestoClipBoard = new ToolStripMenuItem("Copy values to clipboard"); + //ToolStripMenuItem_CopyValuestoClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyValuestoClipBoard); + //base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_CopyValuestoClipBoard); + + return SpecificContextMenu; + + } + + private void ToolStripMenuItem_NewClass(object sender, EventArgs e) + { + //CopyValuestoClipBoard(); + foreach (var item in this) + { + int Classe = 0; + int ResultClasse = -1; + foreach (var Class in item.Parent.GlobalInfo.ListWellClasses) + { + if (Class.Name == sender.ToString()) + { + ResultClasse = Classe; + break; + } + + Classe++; + } + + item.SetClass(ResultClasse); + } + + + if ((this.Sender!=null)&&(this.Sender.GetType() == typeof(cChart2DScatterPoint))) + { + ((cChart2DScatterPoint)(this.Sender)).RefreshDisplay(); + } + + } + #endregion + + } +} diff --git a/Classes/cPlate.cs b/Classes/General/cPlate.cs similarity index 63% rename from Classes/cPlate.cs rename to Classes/General/cPlate.cs index 35b1a26..a6f37ba 100644 --- a/Classes/cPlate.cs +++ b/Classes/General/cPlate.cs @@ -14,24 +14,12 @@ using System.Data; using HCSAnalyzer.Forms.FormsForGraphsDisplay; using HCSAnalyzer.Controls; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using System.Text; +using HCSAnalyzer.Classes.General; namespace LibPlateAnalysis { - public class cExtendWellList : List - { - public cWell GetWell(int PosX, int PosY) - { - return null; - } - - public cWell GetWell(int Idx) - { - if (Idx < 0) return null; - if (this.Count == 0) return null; - // if (Idx > this.Count) return null; - return this[Idx]; - } - } public class cDBConnection @@ -76,11 +64,11 @@ public void DisplayTable(cWell Well) DataTable dt = new DataTable(); dt.Load(value); - FormToDisplayTable WindowForTable = new FormToDisplayTable(dt, Well.AssociatedPlate.ParentScreening.GlobalInfo); + cDisplayScatter2D WindowForTable = new cDisplayScatter2D(dt, Well.AssociatedPlate.ParentScreening.GlobalInfo); WindowForTable.comboBoxAxeX.DataSource = this.GetDescriptorNames(Well); WindowForTable.comboBoxAxeY.DataSource = this.GetDescriptorNames(Well); WindowForTable.comboBoxVolume.DataSource = this.GetDescriptorNames(Well); - WindowForTable.chartForPoints.Series[0].MarkerColor = Well.GetColor(); + WindowForTable.chartForPoints.Series[0].MarkerColor = Well.GetClassColor(); // WindowForTable.ch WindowForTable.Text = Well.AssociatedPlate.Name + " [" + Well.GetPosX() + "x" + Well.GetPosY() + "]"; @@ -88,80 +76,220 @@ public void DisplayTable(cWell Well) WindowForTable.Show(); } - public void AddWellToDataTable(cWell Well, DataTable DataTableToAddedTo, bool IsAddWellClass, bool IsOnlyActiveDesc) + public int AddWellToDataTable(cWell Well, DataTable DataTableToAddedTo, cGlobalInfo GlobalInfo) { SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); - List Names = new List(); - string NameDesc = "*"; - if (IsOnlyActiveDesc) - { - NameDesc = ""; - for (int IdxDesc = 0; IdxDesc < Well.ListDescriptors.Count; IdxDesc++) - if (Well.ListDescriptors[IdxDesc].GetAssociatedType().IsActive()) - { - NameDesc += Well.ListDescriptors[IdxDesc].GetAssociatedType().GetName() + ", "; - Names.Add(Well.ListDescriptors[IdxDesc].GetAssociatedType().GetName()); - } - if (NameDesc == "") return; - - NameDesc = NameDesc.Remove(NameDesc.Length - 2); - } - - mycommand.CommandText = "SELECT "+ NameDesc+" FROM \"" + Well.SQLTableName + "\""; + mycommand.CommandText = "SELECT * FROM \"" + Well.SQLTableName + "\""; SQLiteDataReader value = mycommand.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(value); + List Names = this.GetDescriptorNames(Well); - if (!IsOnlyActiveDesc) - Names = this.GetDescriptorNames(Well); - - int CurrentClass = Well.GetClass(); + int CurrentClass = Well.GetClassIdx(); if (DataTableToAddedTo.Columns.Count == 0) { foreach (string TmpName in Names) { - - DataTableToAddedTo.Columns.Add(new DataColumn(TmpName, typeof(double))); + int DescIdx = GlobalInfo.CurrentScreen.ListDescriptors.GetDescriptorIndex(TmpName); + if ((DescIdx != -1) && (GlobalInfo.CurrentScreen.ListDescriptors[DescIdx].IsActive())) + DataTableToAddedTo.Columns.Add(new DataColumn(TmpName, typeof(double))); } - if (IsAddWellClass) - DataTableToAddedTo.Columns.Add(new DataColumn("Well_Class", typeof(int))); + //if (IsAddWellClass) + // DataTableToAddedTo.Columns.Add(new DataColumn("Well_Class", typeof(int))); } for (int i = 0; i < dt.Rows.Count; i++) { DataTableToAddedTo.Rows.Add(); - + int RealIdxCol = 0; for (int IdxCol = 0; IdxCol < Names.Count; IdxCol++) - DataTableToAddedTo.Rows[DataTableToAddedTo.Rows.Count - 1][IdxCol] = dt.Rows[i][IdxCol]; + { + int DescIdx = GlobalInfo.CurrentScreen.ListDescriptors.GetDescriptorIndex(Names[IdxCol]); + if ((DescIdx != -1) && (GlobalInfo.CurrentScreen.ListDescriptors[DescIdx].IsActive())) + { + DataTableToAddedTo.Rows[DataTableToAddedTo.Rows.Count - 1][RealIdxCol++] = dt.Rows[i][IdxCol]; + } + } + //if (IsAddWellClass) + // DataTableToAddedTo.Rows[DataTableToAddedTo.Rows.Count - 1][DataTableToAddedTo.Columns.Count - 1] = CurrentClass; + } + return dt.Rows.Count; + } + + public void ChangePhenotypeClass(cWell Well, cExtendedList ListNewClasses) + { + using (SQLiteTransaction transaction = _SQLiteConnection.BeginTransaction()) + using (SQLiteDataAdapter sqliteAdapter = new SQLiteDataAdapter("SELECT * FROM \"" + Well.SQLTableName + "\"", _SQLiteConnection)) + { + DataSet DS = new DataSet(); + sqliteAdapter.Fill(DS); - if (IsAddWellClass) - DataTableToAddedTo.Rows[DataTableToAddedTo.Rows.Count - 1][Names.Count] = CurrentClass; + using (sqliteAdapter.InsertCommand = new SQLiteCommandBuilder(sqliteAdapter).GetUpdateCommand()) + { + for (int i = 0; i < DS.Tables[0].Rows.Count; i++) + DS.Tables[0].Rows[i]["Phenotype_Class"] = ListNewClasses[i]; + + sqliteAdapter.Update(DS); + } + transaction.Commit(); } + return; } + public cExtendedTable GetWellValues(cWell TmpWell, cDescriptorsType DescType) + { + List LCDT = new List(); + LCDT.Add(DescType); + + cExtendedTable ToReturn = new cExtendedTable(this.GetWellValues(TmpWell.SQLTableName, LCDT)); + + cListSingleBiologicalObjects ListClassesPhenotypes = + this.GetWellBiologicalPhenotypes(/*this.GetWellValues(TmpWell.SQLTableName, DescType),*/ TmpWell); + + + for (int i = 0; i < ToReturn.Count; i++) + { + ToReturn[i].ListTags = new List(); + + for (int j = 0; j < ListClassesPhenotypes.Count; j++) + ToReturn[i].ListTags.Add(ListClassesPhenotypes[j]); + } + + return ToReturn; + } + + public cExtendedTable GetWellValues(cWell TmpWell, List ListDescType) + { + cExtendedTable ToReturn = new cExtendedTable(); + + foreach (var item in ListDescType) + { + cExtendedList TmpList = new cExtendedList(); + TmpList.Name = item.GetName(); + TmpList.Tag = item; + + TmpList.ListTags = new List(); + + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + mycommand.CommandText = "SELECT *, \"" + item.GetName() + "\" FROM \"" + TmpWell.SQLTableName + "\" "; + //mycommand.CommandText = "SELECT *, FROM \"" + TableName + "\""; + SQLiteDataReader value = mycommand.ExecuteReader(); + // value.Read(); + int Pos = value.GetOrdinal(item.GetName()); + + if (Pos == -1) continue; + while (value.Read()) + { + TmpList.Add(value.GetFloat(Pos)); + } + + ToReturn.Add(TmpList); + } + return ToReturn; + } + + public cExtendedTable GetWellValues(cWell TmpWell, List ListDescType, List PhenotypesToBeSelected) + { + cExtendedTable ToReturn = new cExtendedTable(); + + foreach (var item in ListDescType) + { + cExtendedList TmpList = new cExtendedList(); + TmpList.Name = item.GetName(); + TmpList.Tag = item; + + TmpList.ListTags = new List(); + + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + mycommand.CommandText = "SELECT \"" + item.GetName() + "\" FROM \"" + TmpWell.SQLTableName + "\" WHERE Phenotype_Class IN ("; + + foreach (var PhenotypeClass in PhenotypesToBeSelected) + { + mycommand.CommandText += PhenotypeClass.Idx + ","; + } + mycommand.CommandText = mycommand.CommandText.Remove(mycommand.CommandText.Length - 1); + mycommand.CommandText += ")"; - public cExtendedList GetWellValues(string TableName, cDescriptorsType DescType) + //mycommand.CommandText = "SELECT *, FROM \"" + TableName + "\""; + SQLiteDataReader value = mycommand.ExecuteReader(); + // value.Read(); + int Pos = value.GetOrdinal(item.GetName()); + + if (Pos == -1) continue; + while (value.Read()) + { + TmpList.Add(value.GetFloat(Pos)); + } + + ToReturn.Add(TmpList); + } + return ToReturn; + } + + public cExtendedTable GetWellValues(string TableName, List ListDescType) { - cExtendedList ToReturn = new cExtendedList(); - //for (int i = 0; i < 1000; i++) - // ToReturn.Add(i); - //return ToReturn; + cExtendedTable ToReturn = new cExtendedTable(); + + foreach (var item in ListDescType) + { + cExtendedList TmpList = new cExtendedList(); + + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + mycommand.CommandText = "SELECT *, \"" + item.GetName() + "\" FROM \"" + TableName + "\""; + //mycommand.CommandText = "SELECT *, FROM \"" + TableName + "\""; + SQLiteDataReader value = mycommand.ExecuteReader(); + // value.Read(); + int Pos = value.GetOrdinal(item.GetName()); + + while (value.Read()) TmpList.Add(value.GetFloat(Pos)); + + ToReturn.Add(TmpList); + } + return ToReturn; + } + + //public cExtendedList GetWellPhenotypeClasses(string TableName) + //{ + // cExtendedList ToReturn = new cExtendedList(); + + // SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + // mycommand.CommandText = "SELECT *, \"" + "Phenotype_Class" + "\" FROM \"" + TableName + "\""; + // SQLiteDataReader value = mycommand.ExecuteReader(); + // int Pos = value.GetOrdinal("Phenotype_Class"); + + // while (value.Read()) + // ToReturn.Add(value.GetFloat(Pos)); + + // return ToReturn; + //} + + public cListSingleBiologicalObjects GetWellBiologicalPhenotypes(cWell TmpWell) + { + cListSingleBiologicalObjects ToReturn = new cListSingleBiologicalObjects(); + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); - mycommand.CommandText = "SELECT *, \"" + DescType.GetName() + "\" FROM \"" + TableName + "\""; - //mycommand.CommandText = "SELECT *, FROM \"" + TableName + "\""; + mycommand.CommandText = "SELECT *, \"" + "Phenotype_Class" + "\" FROM \"" + TmpWell.SQLTableName + "\""; SQLiteDataReader value = mycommand.ExecuteReader(); - // value.Read(); - int Pos = value.GetOrdinal(DescType.GetName()); - - while (value.Read()) + int Pos = value.GetOrdinal("Phenotype_Class"); + if (Pos != -1) { - ToReturn.Add(value.GetFloat(Pos)); + while (value.Read()) + { + ToReturn.Add(new cSingleBiologicalObject(TmpWell.Parent.GlobalInfo.ListCellularPhenotypes[(int)value.GetFloat(Pos)], TmpWell)); + } } + else + { + while (value.Read()) + { + ToReturn.Add(new cSingleBiologicalObject(TmpWell.Parent.GlobalInfo.ListCellularPhenotypes[0], TmpWell)); + } + } return ToReturn; } @@ -178,22 +306,19 @@ public DataTable GetWellAllDescriptorValues(string TableName) //object[] myObjectArray = new object[value.FieldCount]; - - //while (value.Read()) //{ // value.GetValues(myObjectArray); // int a = 1; // //ToReturn.Add((double)myObjectArray[0]); //} - - - SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(mycommand.CommandText, _SQLiteConnection); DataSet ds = new DataSet(); dataAdapter.Fill(ds); + + //Get the collection of rows from the DataSet // DataRowCollection dataRowCol = ds.Tables[0].Rows; @@ -216,7 +341,6 @@ public DataTable GetWellAllDescriptorValues(string TableName) return TableToReturn; } - public List GetDescriptorNames(int IdxWell) { List ToReturn = new List(); @@ -232,6 +356,36 @@ public List GetDescriptorNames(int IdxWell) return ToReturn; } + public bool CheckIfColumnExist(int IdxWell, string ColumnName) + { + string NameWell = "\"" + GetListTableNames()[IdxWell] + "\""; + + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + mycommand.CommandText = "SELECT " + ColumnName + " FROM " + NameWell; + try + { + SQLiteDataReader value = mycommand.ExecuteReader(); + } + catch + { + return false; + } + return true; + } + + public void CreateNewColumn(string ColumnName, double DefaultValue) + { + foreach (var item in GetListTableNames()) + { + SQLiteCommand mycommand = new SQLiteCommand(_SQLiteConnection); + String SQL = "ALTER TABLE \"" + item + "\" ADD COLUMN " + ColumnName + " REAL DEFAULT " + DefaultValue; + using (SQLiteCommand Command = new SQLiteCommand(SQL, _SQLiteConnection)) + { + Command.ExecuteNonQuery(); + } + } + } + public List GetDescriptorNames(cWell Well) { List ToReturn = new List(); @@ -246,6 +400,7 @@ public List GetDescriptorNames(cWell Well) return ToReturn; } + public cDBConnection(cPlate Plate, string SQLFileDBName) { if (Plate.DBConnection == null) @@ -258,30 +413,27 @@ public cDBConnection(cPlate Plate, string SQLFileDBName) } - - - - public class cPlate + public class cPlate : cGeneralComponent { string PlateType; cWell[,] ListWell = null; public string Name; public cScreening ParentScreening; List ListMinMax = null; - public cExtendWellList ListActiveWells = new cExtendWellList(); - + public cListWell ListActiveWells = new cListWell(null); public cListDRCRegion ListDRCRegions; - public cDBConnection DBConnection = null; //public void DBConnection_Establish(string FileName) //{ // DBConnection = new cDBConnection(this, FileName); //} - + public int ReplicateNumber = 0; int NumberOfActiveWells = 0; int[] ListNumObjectPerClasse; cInfoClassif InfoClassif = new cInfoClassif(); + public double[] MinMaxHisto = new double[2]; + #region Weka based clustering and classification @@ -353,7 +505,7 @@ public Instances CreateInstancesWithClasses(cInfoClass InfoClass, int NeutralCla int IdxWell = 0; foreach (cWell CurrentWell in this.ListActiveWells) { - if (CurrentWell.GetClass() == NeutralClass) continue; + if (CurrentWell.GetClassIdx() == NeutralClass) continue; double[] vals = new double[data1.numAttributes()]; int IdxCol = 0; @@ -362,7 +514,7 @@ public Instances CreateInstancesWithClasses(cInfoClass InfoClass, int NeutralCla if (ParentScreening.ListDescriptors[Col].IsActive() == false) continue; vals[IdxCol++] = CurrentWell.ListDescriptors[Col].GetValue(); } - vals[columnNo] = InfoClass.CorrespondanceTable[CurrentWell.GetClass()]; + vals[columnNo] = InfoClass.CorrespondanceTable[CurrentWell.GetClassIdx()]; data1.add(new DenseInstance(1.0, vals)); IdxWell++; } @@ -372,6 +524,55 @@ public Instances CreateInstancesWithClasses(cInfoClass InfoClass, int NeutralCla } + + /// + /// Create an instances structure with classes for supervised methods + /// + /// + /// + public Instances CreateInstancesWithClasses(List ListClassSelected) + { + weka.core.FastVector atts = new FastVector(); + int columnNo = 0; + for (int i = 0; i < ParentScreening.ListDescriptors.Count; i++) + { + if (ParentScreening.ListDescriptors[i].IsActive() == false) continue; + atts.addElement(new weka.core.Attribute(ParentScreening.ListDescriptors[i].GetName())); + columnNo++; + } + + weka.core.FastVector attVals = new FastVector(); + foreach (var item in ParentScreening.GlobalInfo.ListWellClasses) + { + attVals.addElement(item.Name); + } + + atts.addElement(new weka.core.Attribute("ClassAttribute", attVals)); + + Instances data1 = new Instances("MyRelation", atts, 0); + int IdxWell = 0; + foreach (cWell CurrentWell in this.ListActiveWells) + { + if (!ListClassSelected[CurrentWell.GetClassIdx()]) continue; + double[] vals = new double[data1.numAttributes()]; + + int IdxCol = 0; + for (int Col = 0; Col < ParentScreening.ListDescriptors.Count; Col++) + { + if (ParentScreening.ListDescriptors[Col].IsActive() == false) continue; + vals[IdxCol++] = CurrentWell.ListDescriptors[Col].GetValue(); + } + vals[columnNo] = CurrentWell.GetClassIdx(); + data1.add(new DenseInstance(1.0, vals)); + IdxWell++; + } + data1.setClassIndex((data1.numAttributes() - 1)); + + return data1; + } + + + /// /// Create an instances structure with classes for supervised methods /// @@ -400,14 +601,14 @@ public Instances CreateInstancesWithClassesWithPlateBasedDescriptor(int NumberOf int IdxWell = 0; foreach (cWell CurrentWell in this.ListActiveWells) { - if (CurrentWell.GetClass() == -1) continue; + if (CurrentWell.GetClassIdx() == -1) continue; double[] vals = new double[data1.numAttributes()]; int IdxCol = 0; for (int Col = 0; Col < ParentScreening.ListPlateBaseddescriptorNames.Count; Col++) { vals[IdxCol++] = CurrentWell.ListPlateBasedDescriptors[Col].GetValue(); } - vals[columnNo] = CurrentWell.GetClass(); + vals[columnNo] = CurrentWell.GetClassIdx(); data1.add(new DenseInstance(1.0, vals)); IdxWell++; } @@ -434,16 +635,16 @@ public cInfoForHierarchical CreateInstancesWithUniqueClasse() weka.core.FastVector attVals = new FastVector(); atts.addElement(new weka.core.Attribute("Class_____", attVals)); - InfoForHierarchical.Ninsts = new Instances("MyRelation", atts, 0); + InfoForHierarchical.ListInstances = new Instances("MyRelation", atts, 0); int IdxWell = 0; foreach (cWell CurrentWell in this.ListActiveWells) { - if (CurrentWell.GetClass() == -1) continue; + if (CurrentWell.GetClassIdx() == -1) continue; attVals.addElement("Class_____" + (IdxWell).ToString()); InfoForHierarchical.ListIndexedWells.Add(CurrentWell); - double[] vals = new double[InfoForHierarchical.Ninsts.numAttributes()]; + double[] vals = new double[InfoForHierarchical.ListInstances.numAttributes()]; int IdxCol = 0; for (int Col = 0; Col < this.ParentScreening.ListDescriptors.Count; Col++) { @@ -451,11 +652,11 @@ public cInfoForHierarchical CreateInstancesWithUniqueClasse() vals[IdxCol++] = CurrentWell.ListDescriptors[Col].GetValue(); } vals[columnNo] = IdxWell; - InfoForHierarchical.Ninsts.add(new DenseInstance(1.0, vals)); + InfoForHierarchical.ListInstances.add(new DenseInstance(1.0, vals)); IdxWell++; } - InfoForHierarchical.Ninsts.setClassIndex((InfoForHierarchical.Ninsts.numAttributes() - 1)); + InfoForHierarchical.ListInstances.setClassIndex((InfoForHierarchical.ListInstances.numAttributes() - 1)); return InfoForHierarchical; } @@ -471,6 +672,12 @@ public void AssignClass(double[] ListClasses) } #endregion + public string GetShortInfo() + { + base.ShortInfo += "Plate: " + this.Name + "\n"; + return base.GetShortInfo(); + } + public void DisplayHistogram(int DescIdx) { cExtendedList Pos = new cExtendedList(); @@ -488,63 +695,63 @@ public void DisplayHistogram(int DescIdx) return; } - List HistoPos = ParentScreening.GlobalInfo.WindowHCSAnalyzer.CreateHistogram(Pos.ToArray(), (int)ParentScreening.GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); - SimpleForm NewWindow = new SimpleForm(); + //List HistoPos = ParentScreening.GlobalInfo.WindowHCSAnalyzer.CreateHistogram(Pos.ToArray(), (int)ParentScreening.GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); + cWindowToDisplayHisto NewWindow = new cWindowToDisplayHisto(ParentScreening, Pos); Series SeriesPos = new Series(); SeriesPos.ShadowOffset = 1; - if (HistoPos.Count == 0) return; - - for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) - { - SeriesPos.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); - SeriesPos.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); - SeriesPos.Points[IdxValue].Color = Color.DarkBlue; - - } - - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[0].Title = ParentScreening.ListDescriptors[DescIdx].GetName(); - CurrentChartArea.Axes[1].Title = "Sum"; - CurrentChartArea.AxisX.LabelStyle.Format = "N2"; - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = ParentScreening.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; - - SeriesPos.ChartType = SeriesChartType.Column; - SeriesPos.Color = ParentScreening.GlobalInfo.GetColor(1); - NewWindow.chartForSimpleForm.Series.Add(SeriesPos); - - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; - - if (ParentScreening.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) - { - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Black; - AverageLine.IntervalOffset = Pos.Mean(); - AverageLine.StripWidth = double.Epsilon; - CurrentChartArea.AxisX.StripLines.Add(AverageLine); - AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); - - StripLine StdLine = new StripLine(); - StdLine.BackColor = Color.FromArgb(64, Color.Black); - double Std = Pos.Std(); - StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; - StdLine.StripWidth = Std; - CurrentChartArea.AxisX.StripLines.Add(StdLine); - AverageLine.StripWidth = 0.0001; - } - + /* if (HistoPos.Count == 0) return; + + for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) + { + SeriesPos.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); + SeriesPos.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); + SeriesPos.Points[IdxValue].Color = Color.DarkBlue; + + } + + ChartArea CurrentChartArea = new ChartArea(); + CurrentChartArea.BorderColor = Color.Black; + + NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + CurrentChartArea.Axes[0].Title = ParentScreening.ListDescriptors[DescIdx].GetName(); + CurrentChartArea.Axes[1].Title = "Sum"; + CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + CurrentChartArea.BackColor = ParentScreening.GlobalInfo.OptionsWindow.panel1.BackColor; + CurrentChartArea.BackSecondaryColor = Color.White; + + SeriesPos.ChartType = SeriesChartType.Column; + SeriesPos.Color = ParentScreening.GlobalInfo.GetColor(1); + NewWindow.chartForSimpleForm.Series.Add(SeriesPos); + + NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; + NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + + if (ParentScreening.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) + { + StripLine AverageLine = new StripLine(); + AverageLine.BackColor = Color.Black; + AverageLine.IntervalOffset = Pos.Mean(); + AverageLine.StripWidth = double.Epsilon; + CurrentChartArea.AxisX.StripLines.Add(AverageLine); + AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); + + StripLine StdLine = new StripLine(); + StdLine.BackColor = Color.FromArgb(64, Color.Black); + double Std = Pos.Std(); + StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; + StdLine.StripWidth = Std; + CurrentChartArea.AxisX.StripLines.Add(StdLine); + AverageLine.StripWidth = 0.0001; + } + */ Title CurrentTitle = null; CurrentTitle = new Title(ParentScreening.GetCurrentDisplayPlate().Name + " - " + ParentScreening.ListDescriptors[DescIdx].GetName() + " histogram."); @@ -576,7 +783,6 @@ public void DisplayDescriptorsWindow() WindowToDisplayArray.Show(); } - public int[] UpdateNumberOfClass() { ListNumObjectPerClasse = new int[11]; @@ -587,7 +793,7 @@ public int[] UpdateNumberOfClass() cWell TempWell = GetWell(i, j, true); if (TempWell == null) continue; //if (TempWell.GetClass() == -1) continue; - ListNumObjectPerClasse[TempWell.GetClass() + 1]++; + ListNumObjectPerClasse[TempWell.GetClassIdx() + 1]++; } if (ParentScreening.GetSelectionType() >= -1) @@ -629,7 +835,7 @@ public cInfoClass GetNumberOfClassesBut(int NeutralClass) int[] ListClasses = UpdateNumberOfClass(); cInfoClass InfoClass = new cInfoClass(); - InfoClass.CorrespondanceTable = new int[ParentScreening.GlobalInfo.GetNumberofDefinedClass()]; + InfoClass.CorrespondanceTable = new int[ParentScreening.GlobalInfo.GetNumberofDefinedWellClass()]; for (int i = 1; i < ListClasses.Length; i++) { @@ -651,7 +857,7 @@ public int GetNumberOfActiveWellsButClass(int NeutralClass) for (int row = 0; row < ParentScreening.Rows; row++) for (int col = 0; col < ParentScreening.Columns; col++) - if ((GetWell(col, row, true) != null) && (GetWell(col, row, true).GetClass() != NeutralClass)) NumberOfActive++; + if ((GetWell(col, row, true) != null) && (GetWell(col, row, true).GetClassIdx() != NeutralClass)) NumberOfActive++; return NumberOfActive; } @@ -781,7 +987,6 @@ public void UpDateWellsSelection() } - public void Display3Dplate(int IdxDescriptor, cPoint3D MinimumPosition) { ParentScreening._3DWorldForPlateDisplay.ListMetaObjectList = new List(); @@ -799,7 +1004,7 @@ public void Display3Dplate(int IdxDescriptor, cPoint3D MinimumPosition) foreach (cWell TmpWell in this.ListWell) { - if ((TmpWell == null) || (TmpWell.GetClass() == -1)) continue; + if ((TmpWell == null) || (TmpWell.GetClassIdx() == -1)) continue; double PosZ = 8 - ((TmpWell.ListDescriptors[IdxDescriptor].GetValue() - this.ListMinMax[IdxDescriptor][0]) * 8) / (this.ListMinMax[IdxDescriptor][1] - this.ListMinMax[IdxDescriptor][0]); @@ -811,7 +1016,7 @@ public void Display3Dplate(int IdxDescriptor, cPoint3D MinimumPosition) Color WellColor = Color.Black; if (ParentScreening.GlobalInfo.IsDisplayClassOnly) - WellColor = TmpWell.GetColor(); + WellColor = TmpWell.GetClassColor(); else { int ConvertedValue; @@ -840,7 +1045,7 @@ public void Display3Dplate(int IdxDescriptor, cPoint3D MinimumPosition) if (ParentScreening.GlobalInfo.OptionsWindow.radioButtonWellInfoInfo.Checked) ToDisp = TmpWell.Info; if (ParentScreening.GlobalInfo.OptionsWindow.radioButtonWellInfoDescValue.Checked) - ToDisp = TmpWell.ListDescriptors[ParentScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue().ToString("N3"); + ToDisp = TmpWell.ListDescriptors[ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue().ToString("N3"); if (ParentScreening.GlobalInfo.OptionsWindow.radioButtonWellInfoLocusID.Checked) ToDisp = ((int)(TmpWell.LocusID)).ToString(); if (ParentScreening.GlobalInfo.OptionsWindow.radioButtonWellInfoConcentration.Checked) @@ -924,15 +1129,8 @@ public void Display3Dplate(int IdxDescriptor, cPoint3D MinimumPosition) } } } - - } - } - - - - } public void Refresh3D(int IdxDescriptor) @@ -943,16 +1141,13 @@ public void Refresh3D(int IdxDescriptor) { ParentScreening._3DWorldForPlateDisplay = new c3DWorld(new cPoint3D(ParentScreening.Columns, ParentScreening.Rows, 1), new cPoint3D(1, 1, 1), ParentScreening.GlobalInfo.renderWindowControlForVTK, ParentScreening.GlobalInfo.WinSize, this.ParentScreening); - Display3Dplate(IdxDescriptor, new cPoint3D(0, 0, 0)); ParentScreening._3DWorldForPlateDisplay.DisplayBottom(Color.FromArgb(255, 255, 255)); ParentScreening._3DWorldForPlateDisplay.SetBackgroundColor(Color.Black); - ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().Zoom(1.8); ParentScreening._3DWorldForPlateDisplay.Render(); - double[] p = ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().GetPosition(); ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().SetPosition(p[0], p[1], p[2] - 4); } @@ -996,8 +1191,6 @@ public void Refresh3D(int IdxDescriptor) ParentScreening._3DWorldForPlateDisplay.ren1.RemoveAllViewProps(); - - ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().SetFocalPoint(fp[0], fp[1], fp[2]); ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().SetPosition(p[0], p[1], p[2]); ParentScreening._3DWorldForPlateDisplay.ren1.GetActiveCamera().SetViewUp(ViewUp[0], ViewUp[1], ViewUp[2]); @@ -1006,8 +1199,6 @@ public void Refresh3D(int IdxDescriptor) } - - Display3Dplate(IdxDescriptor, new cPoint3D(0, 0, 0)); if (ParentScreening.GlobalInfo.OptionsWindow.checkBox3DPlateInformation.Checked) ParentScreening._3DWorldForPlateDisplay.DisplayBottom(Color.FromArgb(255, 255, 255)); @@ -1025,13 +1216,14 @@ public void Refresh3D(int IdxDescriptor) } } #endregion - - - } - - + public void Display3DDistributionOnly(int IdxDescriptor) + { + if (IdxDescriptor >= ListMinMax.Count) return; + Refresh3D(IdxDescriptor); + return; + } public void DisplayDistribution(int IdxDescriptor, bool IsFirstTime) { @@ -1077,7 +1269,7 @@ public void DisplayDistribution(int IdxDescriptor, bool IsFirstTime) if (ParentScreening.GlobalInfo.ViewMode == eViewMode.DISTRIBUTION) { UpdateMinMaxHisto(IdxDescriptor); - + } // Display Axes //int Gutter = (int)ParentScreening.GlobalInfo.OptionsWindow.numericUpDownGutter.Value; @@ -1094,6 +1286,8 @@ public void DisplayDistribution(int IdxDescriptor, bool IsFirstTime) ParentScreening.GlobalInfo.panelForPlate.Controls.AddRange(LChart.ToArray()); #endregion + + //ParentScreening.GlobalInfo.panelForPlate.HorizontalScroll.Value = PosScrollX; //ParentScreening.GlobalInfo.panelForPlate.VerticalScroll.Value = PosScrollY; if (MinMax[0] != MinMax[1]) DisplayLUT(IdxDescriptor); @@ -1101,8 +1295,6 @@ public void DisplayDistribution(int IdxDescriptor, bool IsFirstTime) return; } - public double[] MinMaxHisto = new double[2]; - private void UpdateMinMaxHisto(int IdxDescriptor) { MinMaxHisto[0] = double.MaxValue; @@ -1129,22 +1321,19 @@ private void UpdateMinMaxHisto(int IdxDescriptor) } - - public void DisplayLUT(int IdxDescriptor) { if (ParentScreening.LabelForMin == null) return; - ParentScreening.LabelForMin.Text = String.Format("{0:0.######}", ListMinMax[IdxDescriptor][0]); - ParentScreening.LabelForMax.Text = String.Format("{0:0.######}", ListMinMax[IdxDescriptor][1]); + // ParentScreening.LabelForMin.Text = String.Format("{0:0.######}", ListMinMax[IdxDescriptor][0]); + // ParentScreening.LabelForMax.Text = String.Format("{0:0.######}", ListMinMax[IdxDescriptor][1]); } - public cWell GetWell(int Col, int Row, bool OnlyIfSelected) { if ((Col >= this.ParentScreening.Columns) || (Row >= this.ParentScreening.Rows)) return null; if (ListWell[Col, Row] == null) return null; - if ((OnlyIfSelected) && (ListWell[Col, Row].GetClass() == -1)) + if ((OnlyIfSelected) && (ListWell[Col, Row].GetClassIdx() == -1)) return null; else return ListWell[Col, Row]; } @@ -1166,20 +1355,15 @@ double[] GetMinMax(int IdxDescriptor) double Max = double.MinValue; double CurrentVal; - - for (int x = 0; x < ParentScreening.Columns; x++) for (int y = 0; y < ParentScreening.Rows; y++) { - if (ListWell[x, y] == null) continue; - cWell TWell = GetWell(x, y, false); if (IdxDescriptor >= TWell.ListDescriptors.Count) return null; - if (TWell == null) continue; CurrentVal = TWell.ListDescriptors[IdxDescriptor].GetValue();// ListWell[x, y].ListDescriptors[IdxDescriptor].AverageValue; if (CurrentVal < Min) Min = CurrentVal; @@ -1252,12 +1436,26 @@ public int GetNumberOfActiveWells() if (currentWell == null) IsMissingWell = true; else - Table[i, j] = currentWell.GetAverageValuesList(false)[Desc]; + Table[i, ParentScreening.Rows - j - 1] = currentWell.GetAverageValuesList(false)[Desc]; } return Table; } + public double[,] GetWellClassesTable() + { + double[,] Table = new double[ParentScreening.Columns, ParentScreening.Rows]; + + for (int j = 0; j < ParentScreening.Rows; j++) + for (int i = 0; i < ParentScreening.Columns; i++) + { + cWell currentWell = this.GetWell(i, j, false); + if (currentWell == null) continue; + Table[i, ParentScreening.Rows - j - 1] = currentWell.GetClassIdx(); + } + + return Table; + } public double[][] GetAverageValueDescTable1(int Desc, out bool IsMissingWell) { IsMissingWell = false; @@ -1298,7 +1496,215 @@ public void SetAverageValueDescTable(int Desc, double[,] Table) UpDataMinMax(); } + public ToolStripMenuItem GetExtendedContextMenu() + { + + #region Context Menu + base.SpecificContextMenu = new ToolStripMenuItem("Plate " + this.Name); + // ToolStripSeparator Sep = new ToolStripSeparator(); + // base.SpecificContextMenu.Items.Add(Sep); + + + //ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Test Automated Menu"); + + //base.SpecificContextMenu.Items.Add(ToolStripMenuItem_Info); + + //// contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); + + ////ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //// contextMenuStrip.Show(Control.MousePosition); + //ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + + + ToolStripMenuItem ToolStripMenuItem_CopyClassToClipBoard = new ToolStripMenuItem("Copy classes to clipboard"); + ToolStripMenuItem_CopyClassToClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyClassToClipBoard); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_CopyClassToClipBoard); + + ToolStripMenuItem ToolStripMenuItem_CopyValuestoClipBoard = new ToolStripMenuItem("Copy values to clipboard"); + ToolStripMenuItem_CopyValuestoClipBoard.Click += new System.EventHandler(this.ToolStripMenuItem_CopyValuestoClipBoard); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_CopyValuestoClipBoard); + + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + base.SpecificContextMenu.DropDownItems.Add(ToolStripSep); + + + ToolStripMenuItem ToolStripMenuItem_SetAsActivePlate = new ToolStripMenuItem("Set as active"); + ToolStripMenuItem_SetAsActivePlate.Click += new System.EventHandler(this.ToolStripMenuItem_SetAsActivePlate); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_SetAsActivePlate); + + ToolStripMenuItem ToolStripMenuItem_Clustering = new ToolStripMenuItem("Cluster"); + ToolStripMenuItem_Clustering.Click += new System.EventHandler(this.ToolStripMenuItem_Clustering); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Clustering); + + + + //ToolStripMenuItem ToolStripMenuItem_RemovePlate = new ToolStripMenuItem("Remove"); + //ToolStripMenuItem_RemovePlate.Click += new System.EventHandler(this.ToolStripMenuItem_RemovePlate); + //base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_RemovePlate); + + + + + //ToolStripMenuItem ToolStripMenuItem_Histo = new ToolStripMenuItem("Histogram"); + //ToolStripMenuItem_Histo.Click += new System.EventHandler(this.DisplayHisto); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Histo); + + //if (this.LocusID != -1.0) + //{ + // ToolStripMenuItem ToolStripMenuItem_Kegg = new ToolStripMenuItem("Kegg"); + // ToolStripMenuItem_Kegg.Click += new System.EventHandler(this.DisplayPathways); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Kegg); + //} + + //if (this.SQLTableName != "") + //{ + // ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + // SpecificContextMenu.DropDownItems.Add(ToolStripSep); + + // ToolStripMenuItem ToolStripMenuItem_DisplayData = new ToolStripMenuItem("Display Single Object Data"); + // ToolStripMenuItem_DisplayData.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayData); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayData); + + // ToolStripMenuItem ToolStripMenuItem_AddToSingleCellAnalysis = new ToolStripMenuItem("Add to Single Object Analysis"); + // ToolStripMenuItem_AddToSingleCellAnalysis.Click += new System.EventHandler(this.ToolStripMenuItem_AddToSingleCellAnalysis); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_AddToSingleCellAnalysis); + //} + + //ToolStripSeparator ToolStripSep1 = new ToolStripSeparator(); + //ToolStripMenuItem ToolStripMenuItem_Copy = new ToolStripMenuItem("Copy Visu."); + + //ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //base.SpecificContextMenu.Show(Control.MousePosition); + //ToolStripMenuItem_Copy.Click += new System.EventHandler(this.CopyVisu); + #endregion + + + return base.SpecificContextMenu; + + + } + //ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + + private void ToolStripMenuItem_CopyValuestoClipBoard(object sender, EventArgs e) + { + CopyValuestoClipBoard(); + } + + //ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + private void ToolStripMenuItem_SetAsActivePlate(object sender, EventArgs e) + { + int PosPlate = this.ParentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.FindStringExact(this.Name); + this.ParentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = PosPlate; + this.ParentScreening.CurrentDisplayPlateIdx = PosPlate; + + this.ParentScreening.GetCurrentDisplayPlate().DisplayDistribution(this.ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + + public void CopyValuestoClipBoard() + { + StringBuilder sb = new StringBuilder(); + + sb.Append(String.Format(ParentScreening.ListDescriptors[ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + "\t")); + //sb.Append("\t"); + for (int i = 0; i < ParentScreening.Columns - 1; i++) + { + int IdxCol = i + 1; + sb.Append(String.Format("{0}\t", IdxCol)); + } + sb.Append(String.Format("{0}", ParentScreening.Columns - 1)); + sb.AppendLine(); + + for (int j = 0; j < ParentScreening.Rows; j++) + { + byte[] strArray = new byte[1]; + strArray[0] = (byte)(j + 65); + string Chara = Encoding.UTF7.GetString(strArray); + sb.Append(String.Format("{0}\t", Chara)); + + for (int i = 0; i < ParentScreening.Columns - 1; i++) + { + cWell CurrentWell = ParentScreening.GetCurrentDisplayPlate().GetWell(i, j, false); + if (CurrentWell == null) + sb.Append("\t"); + else + sb.Append(String.Format("{0}\t", CurrentWell.ListDescriptors[ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue())); + } + + + cWell CurrentWellFinal = ParentScreening.GetCurrentDisplayPlate().GetWell(ParentScreening.Columns - 1, j, false); + if (CurrentWellFinal == null) + sb.Append("\t"); + else + sb.Append(String.Format("{0}\t", CurrentWellFinal.ListDescriptors[ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue())); + + + // sb.Append(String.Format("{0}", CompleteScreening.GetPlate(0).GetWell(CompleteScreening.Columns-1, j).ListDescriptors[(int)numericUpDownDescriptorIndex.Value].AverageValue)); + sb.AppendLine(); + } + + Clipboard.SetText(sb.ToString()); + + } + + private void ToolStripMenuItem_CopyClassToClipBoard(object sender, EventArgs e) + { + CopyClassToClipBoard(); + } + + public void CopyClassToClipBoard() + { + StringBuilder sb = new StringBuilder(); + + sb.Append(String.Format(this.Name + "\t")); + //sb.Append("\t"); + for (int i = 0; i < ParentScreening.Columns - 1; i++) + { + int IdxCol = i + 1; + sb.Append(String.Format("{0}\t", IdxCol)); + } + sb.Append(String.Format("{0}", ParentScreening.Columns - 1)); + sb.AppendLine(); + + for (int j = 0; j < ParentScreening.Rows; j++) + { + byte[] strArray = new byte[1]; + strArray[0] = (byte)(j + 65); + + string Chara = Encoding.UTF7.GetString(strArray); + sb.Append(String.Format("{0}\t", Chara)); + + for (int i = 0; i < ParentScreening.Columns - 1; i++) + { + cWell CurrentWell = ParentScreening.GetCurrentDisplayPlate().GetWell(i, j, false); + if (CurrentWell == null) + sb.Append("\t"); + else + sb.Append(String.Format("{0}\t", CurrentWell.GetClassIdx())); + } + + + cWell CurrentWellFinal = ParentScreening.GetCurrentDisplayPlate().GetWell(ParentScreening.Columns - 1, j, false); + if (CurrentWellFinal == null) + sb.Append("\t"); + else + sb.Append(String.Format("{0}\t", CurrentWellFinal.GetClassIdx())); + + + // sb.Append(String.Format("{0}", CompleteScreening.GetPlate(0).GetWell(CompleteScreening.Columns-1, j).ListDescriptors[(int)numericUpDownDescriptorIndex.Value].AverageValue)); + sb.AppendLine(); + } + Clipboard.SetText(sb.ToString()); + + } + + private void ToolStripMenuItem_Clustering(object sender, EventArgs e) + { + List ListPlate = new List(); + ListPlate.Add(this); + + ParentScreening.GlobalInfo.WindowHCSAnalyzer.PerformScreeningClustering(ListPlate, true); + } } diff --git a/Classes/cScreening.cs b/Classes/General/cScreening.cs similarity index 95% rename from Classes/cScreening.cs rename to Classes/General/cScreening.cs index 661ed2c..cc2e4bd 100644 --- a/Classes/cScreening.cs +++ b/Classes/General/cScreening.cs @@ -17,8 +17,6 @@ namespace LibPlateAnalysis { - - public class cExtendPlateList : List { public cPlate GetPlate(string PlateName) @@ -40,10 +38,9 @@ public cPlate GetPlate(int Idx) } } - public class cInfoForHierarchical { - public weka.core.Instances Ninsts = null; + public weka.core.Instances ListInstances = null; public List ListIndexedWells = new List(); public List ListMin = new List(); public List ListMax = new List(); @@ -67,6 +64,24 @@ public void UpDateMinMax(cScreening CurrentScreen) ListMax.Add(MaxVal); } } + + + public void UpDateMinMax() + { + for (int iDesc = 0; iDesc < ListInstances.numAttributes(); iDesc++) + { + double MinVal = double.MaxValue; + double MaxVal = double.MinValue; + foreach (Instance item in ListInstances) + { + double TmpValue = item.value(iDesc); + if (TmpValue < MinVal) MinVal = TmpValue; + else if (TmpValue > MaxVal) MaxVal = TmpValue; + } + ListMin.Add(MinVal); + ListMax.Add(MaxVal); + } + } } @@ -81,8 +96,6 @@ public void SetJ48Tree(J48 J48Model, int NumClasses) { this.J48Model = J48Model; this.NumClasses = NumClasses; - - } @@ -119,29 +132,21 @@ public Instances CreateInstancesWithoutClass(DataTable dt) public FormForClassificationTree DisplayTree(cGlobalInfo GlobalInfo) { FormForClassificationTree WindowForTree = new FormForClassificationTree(); - if (J48Model == null) return null; - string StringForTree = J48Model.graph().Remove(0, J48Model.graph().IndexOf("{") + 2); - WindowForTree.gViewerForTreeClassif.Graph = GlobalInfo.WindowHCSAnalyzer.ComputeAndDisplayGraph(StringForTree.Remove(StringForTree.Length - 3, 3)); - WindowForTree.richTextBoxConsoleForClassification.Clear(); - if (evaluation != null) { WindowForTree.richTextBoxConsoleForClassification.AppendText(evaluation.toSummaryString()); WindowForTree.richTextBoxConsoleForClassification.AppendText(evaluation.toMatrixString()); } - return WindowForTree; - } } - public class cScreening { @@ -162,9 +167,10 @@ public void Close3DView() { if (_3DWorldForPlateDisplay != null) { - + _3DWorldForPlateDisplay.ren1.RemoveAllViewProps(); _3DWorldForPlateDisplay.Terminate(); _3DWorldForPlateDisplay = null; + } } @@ -270,9 +276,7 @@ public cInfoForHierarchical CreateInstancesWithUniqueClasse() { cInfoForHierarchical InfoForHierarchical = new cInfoForHierarchical(); - weka.core.FastVector atts = new FastVector(); - int columnNo = 0; for (int i = 0; i < this.ListDescriptors.Count; i++) @@ -285,16 +289,16 @@ public cInfoForHierarchical CreateInstancesWithUniqueClasse() weka.core.FastVector attVals = new FastVector(); atts.addElement(new weka.core.Attribute("Class", attVals)); - InfoForHierarchical.Ninsts = new Instances("MyRelation", atts, 0); + InfoForHierarchical.ListInstances = new Instances("MyRelation", atts, 0); int IdxWell = 0; foreach (cPlate CurrentPlate in this.ListPlatesActive) { foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) { - if (CurrentWell.GetClass() == -1) continue; + if (CurrentWell.GetClassIdx() == -1) continue; attVals.addElement("Class" + (IdxWell).ToString()); InfoForHierarchical.ListIndexedWells.Add(CurrentWell); - double[] vals = new double[InfoForHierarchical.Ninsts.numAttributes()]; + double[] vals = new double[InfoForHierarchical.ListInstances.numAttributes()]; int IdxCol = 0; for (int Col = 0; Col < this.ListDescriptors.Count; Col++) @@ -303,11 +307,11 @@ public cInfoForHierarchical CreateInstancesWithUniqueClasse() vals[IdxCol++] = CurrentWell.ListDescriptors[Col].GetValue(); } vals[columnNo] = IdxWell; - InfoForHierarchical.Ninsts.add(new DenseInstance(1.0, vals)); + InfoForHierarchical.ListInstances.add(new DenseInstance(1.0, vals)); IdxWell++; } } - InfoForHierarchical.Ninsts.setClassIndex((InfoForHierarchical.Ninsts.numAttributes() - 1)); + InfoForHierarchical.ListInstances.setClassIndex((InfoForHierarchical.ListInstances.numAttributes() - 1)); return InfoForHierarchical; } @@ -342,7 +346,7 @@ public Instances CreateInstancesWithClasses(cInfoClass InfoClass, int NeutralCla { foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) { - if (CurrentWell.GetClass() == NeutralClass) continue; + if (CurrentWell.GetClassIdx() == NeutralClass) continue; double[] vals = new double[data1.numAttributes()]; int IdxCol = 0; @@ -351,7 +355,7 @@ public Instances CreateInstancesWithClasses(cInfoClass InfoClass, int NeutralCla if (this.ListDescriptors[Col].IsActive() == false) continue; vals[IdxCol++] = CurrentWell.ListDescriptors[Col].GetValue(); } - vals[columnNo] = InfoClass.CorrespondanceTable[CurrentWell.GetClass()]; + vals[columnNo] = InfoClass.CorrespondanceTable[CurrentWell.GetClassIdx()]; data1.add(new DenseInstance(1.0, vals)); IdxWell++; } @@ -396,7 +400,7 @@ public void UpdateListActiveWell() for (int i = 0; i < this.Columns; i++) { cWell TempWell = CurrentPlate.GetWell(i, j, false); - if ((TempWell == null) || (TempWell.GetClass() == -1)) continue; + if ((TempWell == null) || (TempWell.GetClassIdx() == -1)) continue; CurrentPlate.ListActiveWells.Add(TempWell); } } @@ -444,12 +448,12 @@ public int GetNumberOfClasses() public int[] GetClassPopulation() { - int[] ListClass = new int[GlobalInfo.GetNumberofDefinedClass()]; + int[] ListClass = new int[GlobalInfo.GetNumberofDefinedWellClass()]; foreach (cPlate CurrentPlateToProcess in this.ListPlatesActive) { foreach (cWell TmpWell in CurrentPlateToProcess.ListActiveWells) { - int Class = TmpWell.GetClass(); + int Class = TmpWell.GetClassIdx(); if (Class >= 0) ListClass[Class]++; else @@ -476,7 +480,7 @@ public cInfoClass GetNumberOfClassesBut(int NeutralClass) { NeutralClass++; int NumberOfPlates = this.ListPlatesActive.Count; - int[] CompleteListClasses = new int[GlobalInfo.GetNumberofDefinedClass() + 1]; + int[] CompleteListClasses = new int[GlobalInfo.GetNumberofDefinedWellClass() + 1]; foreach (cPlate CurrentPlateToProcess in this.ListPlatesActive) { @@ -485,7 +489,7 @@ public cInfoClass GetNumberOfClassesBut(int NeutralClass) } cInfoClass InfoClass = new cInfoClass(); - InfoClass.CorrespondanceTable = new int[GlobalInfo.GetNumberofDefinedClass()]; + InfoClass.CorrespondanceTable = new int[GlobalInfo.GetNumberofDefinedWellClass()]; // int NumberOfClasses = 0; @@ -830,7 +834,7 @@ public double[] ImportFromCSV(string FileName, bool IsAppend, int NumCol, int Nu // return null; this.Rows = NumRow; this.Columns = NumCol; - this.ListDescriptors.CurrentSelectedDescriptor = 0; + this.ListDescriptors.CurrentSelectedDescriptorIdx = 0; //ListPlate = new List(); ListPlatesAvailable = new cExtendPlateList(); } @@ -993,7 +997,7 @@ public void ImportFromTXT(string[] FileNames, string[] SafeFileNames, int NumCol line = sr.ReadLine(); this.Rows = NumRow; this.Columns = NumCol; - this.ListDescriptors.CurrentSelectedDescriptor = 0; + this.ListDescriptors.CurrentSelectedDescriptorIdx = 0; string PlateName = SafeFileNames[IdxPlate].Remove(SafeFileNames[IdxPlate].Length - 4); @@ -1072,7 +1076,7 @@ public void ApplyCurrentClassesToAllPlates() cWell CurrWell = TmpPlate.GetWell(col, row, false); if (CurrWell == null) continue; - int Clss = CurrWellWithClass.GetClass(); + int Clss = CurrWellWithClass.GetClassIdx(); if (Clss == -1) CurrWell.SetAsNoneSelected(); diff --git a/Classes/General/cSingleBiologicalObject.cs b/Classes/General/cSingleBiologicalObject.cs new file mode 100644 index 0000000..6882115 --- /dev/null +++ b/Classes/General/cSingleBiologicalObject.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Drawing; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.General +{ + public class cSingleBiologicalObject : cGeneralComponent + { + //public int Class = 0; + // cGlobalInfo GlobalInfo; + cCellularPhenotype CellularPhenotypeType; + cWell AssociatedWell; + + public cSingleBiologicalObject(cCellularPhenotype CellularPhenotypeType, cWell AssociatedWell) + { + // this.GlobalInfo = GlobalInfo; + // this.Class = Class; + this.CellularPhenotypeType = CellularPhenotypeType; + this.AssociatedWell = AssociatedWell; + + } + + public Color GetColor() + { + return this.CellularPhenotypeType.ColourForDisplay; + + } + + public cCellularPhenotype GetAssociatedPhenotype() + { + return this.CellularPhenotypeType; + } + + public List GetExtendedContextMenu() + { + List ListToReturn = new List(); + + List WellMenu = this.AssociatedWell.GetExtendedContextMenu(); + + for (int IdxMenu = 0; IdxMenu < WellMenu.Count; IdxMenu++) + { + ListToReturn.Add(WellMenu[IdxMenu]); + } + #region Context Menu + base.SpecificContextMenu = new ToolStripMenuItem(this.CellularPhenotypeType.Name); + // ToolStripSeparator Sep = new ToolStripSeparator(); + // base.SpecificContextMenu.Items.Add(Sep); + + + //ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Test Automated Menu"); + + //base.SpecificContextMenu.Items.Add(ToolStripMenuItem_Info); + + //// contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); + + ////ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //// contextMenuStrip.Show(Control.MousePosition); + //ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + + + ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Info"); + ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Info); + + //ToolStripMenuItem ToolStripMenuItem_Histo = new ToolStripMenuItem("Histograms"); + //ToolStripMenuItem_Histo.Click += new System.EventHandler(this.DisplayHisto); + //SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Histo); + + //if (this.LocusID != -1.0) + //{ + // ToolStripMenuItem ToolStripMenuItem_Kegg = new ToolStripMenuItem("Kegg"); + // ToolStripMenuItem_Kegg.Click += new System.EventHandler(this.DisplayPathways); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Kegg); + //} + + //if (this.SQLTableName != "") + //{ + // ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + // SpecificContextMenu.DropDownItems.Add(ToolStripSep); + + // ToolStripMenuItem ToolStripMenuItem_DisplayData = new ToolStripMenuItem("Display Single Object Data"); + // ToolStripMenuItem_DisplayData.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayData); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayData); + + // ToolStripMenuItem ToolStripMenuItem_AddToSingleCellAnalysis = new ToolStripMenuItem("Add to Single Object Analysis"); + // ToolStripMenuItem_AddToSingleCellAnalysis.Click += new System.EventHandler(this.ToolStripMenuItem_AddToSingleCellAnalysis); + // SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_AddToSingleCellAnalysis); + //} + + //if (this.GetClassIdx() >= 0) + // base.SpecificContextMenu.DropDownItems.Add(Parent.GlobalInfo.ListWellClasses[this.GetClassIdx()].GetExtendedContextMenu()); + + //ToolStripSeparator ToolStripSep1 = new ToolStripSeparator(); + //ToolStripMenuItem ToolStripMenuItem_Copy = new ToolStripMenuItem("Copy Visu."); + + //ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //base.SpecificContextMenu.Show(Control.MousePosition); + //ToolStripMenuItem_Copy.Click += new System.EventHandler(this.CopyVisu); + #endregion + + ListToReturn.Add(base.SpecificContextMenu); + + return ListToReturn; + } + //ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + private void DisplayInfo(object sender, EventArgs e) + { + // DisplayInfoWindow(CurrentDescriptorToDisplay); + } + + + + + } +} diff --git a/Classes/cWell.cs b/Classes/General/cWell.cs similarity index 56% rename from Classes/cWell.cs rename to Classes/General/cWell.cs index 7f14279..567bdf8 100644 --- a/Classes/cWell.cs +++ b/Classes/General/cWell.cs @@ -7,7 +7,6 @@ using System.Drawing; using System.Windows.Forms; using HCSAnalyzer; -using HCSAnalyzer.jp.genome.soap; using HCSAnalyzer.Forms; using HCSAnalyzer.Classes; using weka.core; @@ -16,11 +15,17 @@ using System.Collections; using System.Data.SqlClient; using FreeImageAPI; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using HCSAnalyzer.Classes.General; using System.Data; +using System.Net; +using System.Diagnostics; namespace LibPlateAnalysis { - public class cWell + public class cWell : cGeneralComponent { private int PosX = -1; private int PosY = -1; @@ -32,13 +37,12 @@ public class cWell private int CurrentDescriptorToDisplay; private int ClassForClassif = 2; - cScreening Parent; + public cScreening Parent; public cPlate AssociatedPlate; - private Color CurrentColor; + //private Color CurrentColor; // private string CurrentSelectedPathway = ""; public double LocusID = -1; - public string SQLTableName = ""; public string Name = ""; @@ -47,62 +51,48 @@ public class cWell FormForPathway ListP = new FormForPathway(); + static IList images = null; - public int CellNumber { get; private set; } - - - //public cWell(cWell NewWell) - //{ - // this.PosX = NewWell.PosX; - // this.PosY = NewWell.PosY; - // this.ListDescriptors = NewWell.ListDescriptors; - // this.Parent = NewWell.Parent; - // this.AssociatedChart = NewWell.AssociatedChart; - // this.AssociatedPlate = NewWell.AssociatedPlate; - // this.CurrentColor = this.Parent.GlobalInfo.GetColor(ClassForClassif); - //} - + #region Constructors public cWell(cDescriptor Desc, int Col, int Row, cScreening screenParent, cPlate CurrentPlate) { - this.CellNumber = -1; this.Parent = screenParent; this.AssociatedPlate = CurrentPlate; this.ListDescriptors = new List(); - List TmpListDescriptors = new List(); - TmpListDescriptors.Add(Desc); - this.AddDescriptors(TmpListDescriptors); + this.ListDescriptors.Add(Desc); this.PosX = Col; this.PosY = Row; - this.CurrentColor = this.Parent.GlobalInfo.GetColor(ClassForClassif); + // this.CurrentColor = this.Parent.GlobalInfo.ListClasses[ClassForClassif].ColourForDisplay; + + Desc.AssociatedWell = this; - } public cWell(List ListDesc, int Col, int Row, cScreening screenParent, cPlate CurrentPlate) { - this.CellNumber = -1; this.Parent = screenParent; this.AssociatedPlate = CurrentPlate; this.ListDescriptors = new List(); - // this.ListDescriptors = ListDesc; - this.AddDescriptors(ListDesc); + this.ListDescriptors = ListDesc; this.PosX = Col; this.PosY = Row; - this.CurrentColor = this.Parent.GlobalInfo.GetColor(ClassForClassif); - + // this.CurrentColor = this.Parent.GlobalInfo.ListClasses[ClassForClassif].ColourForDisplay; + foreach (var item in this.ListDescriptors) + { + item.AssociatedWell = this; + } } public cWell(string FileName, cScreening screenParent, cPlate CurrentPlate) { - this.CellNumber = -1; this.Parent = screenParent; this.AssociatedPlate = CurrentPlate; @@ -129,6 +119,9 @@ public cWell(string FileName, cScreening screenParent, cPlate CurrentPlate) return; } + + + NewLine = TmpLine.Remove(0, Idx + 1); Idx = NewLine.IndexOf("."); TmpLine = NewLine.Remove(Idx); @@ -229,10 +222,12 @@ public cWell(string FileName, cScreening screenParent, cPlate CurrentPlate) IDxLine++; } sr.Close(); - this.CurrentColor = this.Parent.GlobalInfo.GetColor(ClassForClassif); + // this.CurrentColor = this.Parent.GlobalInfo.ListClasses[ClassForClassif].ColourForDisplay; return; } + #endregion + #region inter wells distance public double DistanceTo(cWell DestinationWell, int Idxdescriptor, eDistances DistanceType) { double Distance = 0; @@ -286,7 +281,7 @@ public double DistanceTo(cWell DestinationWell, eDistances DistanceType) return Distance; } - + public double DistanceTo(cWell DestinationWell, eDistances IntraHistoDistanceType, eDistances InterHistoDistanceType) { double Distance = 0; @@ -355,12 +350,13 @@ public double DistanceTo(cWell DestinationWell, eDistances IntraHistoDistanceTyp return Distance; } + #endregion /// /// Get the class index related to the well /// /// the class index - public int GetClass() + public int GetClassIdx() { return ClassForClassif; } @@ -369,9 +365,24 @@ public int GetClass() /// Return the color of the well (related to the class or the selection mode) /// /// The color - public Color GetColor() + public Color GetClassColor() + { + if (this.GetClassIdx() == -1) return Color.Transparent; + + return this.Parent.GlobalInfo.ListWellClasses[this.GetClassIdx()].ColourForDisplay; + } + + public string GetShortInfo() + { + base.ShortInfo = "Well [" + this.PosX + "x" + this.PosY + "] - " + this.Name + "\t- "; + base.ShortInfo += "Plate: " + Parent.Name + "\n"; + return base.GetShortInfo(); + } + + public string GetClassName() { - return this.CurrentColor; + if (this.GetClassIdx() == -1) return "Inactive"; + return this.Parent.GlobalInfo.ListWellClasses[this.GetClassIdx()].Name; } public cExtendedList GetAverageValuesList(bool IsOnlySelectedDescriptors) @@ -398,16 +409,16 @@ public cExtendedList GetAverageValuesList(bool IsOnlySelectedDescriptors) public void SetClass(int Class) { ClassForClassif = Class; - if (Class == 0) - StateForClassif = "Positive (0)"; - else if (Class == 1) - StateForClassif = "Negative (1)"; - else - StateForClassif = "Class" + Class; - - CurrentColor = Parent.GlobalInfo.GetColor(Class); + //if (Class == 0) + // StateForClassif = "0"; + //else if (Class == 1) + // StateForClassif = "1"; + //else + // StateForClassif = "Class" + Class; + + //CurrentColor = Parent.GlobalInfo.ListClasses[Class].ColourForDisplay; if (AssociatedChart == null) return; - AssociatedChart.BackColor = CurrentColor; + AssociatedChart.BackColor = Parent.GlobalInfo.ListWellClasses[Class].ColourForDisplay;//CurrentColor; AssociatedChart.Update(); } @@ -415,9 +426,9 @@ public void SetAsNoneSelected() { ClassForClassif = -1; StateForClassif = "Unselected (-1)"; - CurrentColor = Parent.GlobalInfo.panelForPlate.BackColor; + //CurrentColor = Parent.GlobalInfo.panelForPlate.BackColor; if (AssociatedChart == null) return; - AssociatedChart.BackColor = CurrentColor; + AssociatedChart.BackColor = Parent.GlobalInfo.panelForPlate.BackColor;//CurrentColor; AssociatedChart.Update(); } @@ -447,7 +458,7 @@ public PlateChart BuildChartForClass() CurrentChartArea.Axes[0].Enabled = AxisEnabled.False; CurrentChartArea.Axes[1].Enabled = AxisEnabled.False; - CurrentChartArea.BackColor = CurrentColor; //Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); + CurrentChartArea.BackColor = this.GetClassColor();// Parent.GlobalInfo.ListClasses[this.ClassForClassif].ColourForDisplay;// CurrentColor; //Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); AssociatedChart.ChartAreas.Add(CurrentChartArea); //AssociatedChart.Location = new System.Drawing.Point((PosX - 1) * (Parent.SizeHistoWidth + Parent.GutterSize), (PosY - 1) * (Parent.SizeHistoHeight + Parent.GutterSize)); //AssociatedChart.Series.Add(CurrentSeries); @@ -457,7 +468,7 @@ public PlateChart BuildChartForClass() AssociatedChart.Location = new System.Drawing.Point((int)((PosX - 1) * (Parent.GlobalInfo.SizeHistoWidth + GutterSize) + Parent.GlobalInfo.ShiftX), (int)((PosY - 1) * (Parent.GlobalInfo.SizeHistoHeight + GutterSize) + Parent.GlobalInfo.ShiftY)); AssociatedChart.Series.Add(CurrentSeries); - AssociatedChart.BackColor = CurrentColor; + AssociatedChart.BackColor = this.GetClassColor();//Parent.GlobalInfo.ListClasses[this.ClassForClassif].ColourForDisplay;// CurrentColor; AssociatedChart.Width = (int)Parent.GlobalInfo.SizeHistoWidth; AssociatedChart.Height = (int)Parent.GlobalInfo.SizeHistoHeight; @@ -470,7 +481,7 @@ public PlateChart BuildChartForClass() if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoInfo.Checked) MainLegend.Text = Info; if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoDescValue.Checked) - MainLegend.Text = ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue().ToString("N3"); + MainLegend.Text = ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue().ToString("N3"); if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoLocusID.Checked) MainLegend.Text = ((int)(LocusID)).ToString(); if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoConcentration.Checked) @@ -494,7 +505,6 @@ public PlateChart BuildChartForClass() public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) { - if (Parent.GlobalInfo.IsDisplayClassOnly) return BuildChartForClass(); int borderSize = 8; @@ -510,20 +520,26 @@ public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) CurrentChartArea.Axes[0].MajorGrid.Enabled = false; CurrentChartArea.Axes[0].LabelStyle.Enabled = false; + #region Pie if (Parent.GlobalInfo.ViewMode == eViewMode.PIE) { CurrentSeries.ChartType = SeriesChartType.Pie; //AssociatedChart.Palette = ChartColorPalette.Grayscale; //ChartColorPalette a = new ChartColorPalette(); + int RealIdx = 0; for (int IdxValue = 0; IdxValue < ListDescriptors.Count; IdxValue++) { if (ListDescriptors[IdxValue].GetAssociatedType().IsActive()) { + CurrentSeries.Points.Add(ListDescriptors[IdxValue].GetValue()); //CurrentSeries.Points[Idx].Label = String.Format("{0:0.###}", ((100.0 * ListPathway[Idx].Occurence) / TotalOcurrence)) + " %"; + CurrentSeries.Points[CurrentSeries.Points.Count - 1].Color = Parent.GlobalInfo.ListCellularPhenotypes[RealIdx++ % Parent.GlobalInfo.ListCellularPhenotypes.Count].ColourForDisplay; + + //CurrentSeries.Points[Idx].LegendText = ListPathway[Idx].Name; //CurrentSeries.Points[CurrentSeries.Points.Count - 1] = 2; //CurrentSeries.Points[CurrentSeries.Points.Count - 1].Label = ListDescriptors[IdxValue].GetAssociatedType().GetName() + " : "; @@ -543,6 +559,9 @@ public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) //CurrentChartArea.BorderWidth = borderSize; AssociatedChart.ChartAreas.Add(CurrentChartArea); } + #endregion + + #region Average else if ((ListDescriptors[IdxDescriptor].GetAssociatedType().GetBinNumber() == 1) || (Parent.GlobalInfo.ViewMode == eViewMode.AVERAGE)) { CurrentChartArea.Axes[1].LabelStyle.Enabled = false; @@ -562,20 +581,20 @@ public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) CurrentChartArea.BackColor = Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); AssociatedChart.ChartAreas.Add(CurrentChartArea); } + #endregion + + #region Histogram else { CurrentSeries.ChartType = SeriesChartType.Column; - for (int IdxValue = 0; IdxValue < ListDescriptors[IdxDescriptor].Histogram.GetXvalues().Count; IdxValue++) + int HistoSize = ListDescriptors[IdxDescriptor].GetHistovalues().Count; + for (int IdxValue = 0; IdxValue < /* ListDescriptors[IdxDescriptor].GetAssociatedType().GetBinNumber()*/ HistoSize; IdxValue++) { if ((Parent.GlobalInfo.OptionsWindow.radioButtonHistoDisplayAutomatedMinMax.Checked) || (Parent.GlobalInfo.OptionsWindow.radioButtonHistoDisplayManualMinMax.Checked)) - { CurrentSeries.Points.AddXY(ListDescriptors[IdxDescriptor].GetHistoXvalue(IdxValue), ListDescriptors[IdxDescriptor].GetHistovalue(IdxValue)); - } else - { CurrentSeries.Points.Add(ListDescriptors[IdxDescriptor].GetHistovalue(IdxValue)); - } } CurrentChartArea.Axes[1].MajorGrid.Enabled = false; @@ -597,16 +616,31 @@ public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) } CurrentSeries.Color = Color.White; CurrentSeries.BorderWidth = 1; - CurrentChartArea.BackColor = Color.FromArgb(16, 37, 63); + + int ConvertedValue; + if (MinMax[0] == MinMax[1]) + ConvertedValue = 0; + else + ConvertedValue = (int)(((ListDescriptors[IdxDescriptor].GetValue() - MinMax[0]) * (Parent.GlobalInfo.LUT[0].Length - 1)) / (MinMax[1] - MinMax[0])); + if ((ConvertedValue >= 0) && (ConvertedValue < Parent.GlobalInfo.LUT[0].Length)) + //CurrentChartArea.BackColor = Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); + + if (Parent.GlobalInfo.OptionsWindow.radioButtonBackColorDefault.Checked) + CurrentChartArea.BackColor = Color.FromArgb(16, 37, 63); + else + CurrentChartArea.BackColor = Color.FromArgb(Parent.GlobalInfo.LUT[0][ConvertedValue], + Parent.GlobalInfo.LUT[1][ConvertedValue], + Parent.GlobalInfo.LUT[2][ConvertedValue]); CurrentChartArea.BorderWidth = borderSize; AssociatedChart.ChartAreas.Add(CurrentChartArea); } + #endregion AssociatedChart.Location = new System.Drawing.Point((int)((PosX - 1) * (Parent.GlobalInfo.SizeHistoWidth + GutterSize) + Parent.GlobalInfo.ShiftX), (int)((PosY - 1) * (Parent.GlobalInfo.SizeHistoHeight + GutterSize) + Parent.GlobalInfo.ShiftY)); AssociatedChart.Series.Add(CurrentSeries); - AssociatedChart.BackColor = CurrentColor; + AssociatedChart.BackColor = this.GetClassColor(); AssociatedChart.Width = (int)Parent.GlobalInfo.SizeHistoWidth; AssociatedChart.Height = (int)Parent.GlobalInfo.SizeHistoHeight; @@ -619,7 +653,7 @@ public PlateChart BuildChart(int IdxDescriptor, double[] MinMax) if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoInfo.Checked) MainLegend.Text = Info; if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoDescValue.Checked) - MainLegend.Text = ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue().ToString("N3"); + MainLegend.Text = ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue().ToString("N3"); if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoLocusID.Checked) MainLegend.Text = ((int)(LocusID)).ToString(); if (Parent.GlobalInfo.OptionsWindow.radioButtonWellInfoConcentration.Checked) @@ -645,15 +679,15 @@ private void AssociatedChart_GetToolTipText(object sender, System.Windows.Forms. string Chara = Encoding.UTF7.GetString(strArray); Chara += this.PosX + ": " + Name + "\n"; - for (int i = 0; i < Parent.ListDescriptors.Count; i++) + for (int i = 0; i < ListDescriptors.Count; i++) // to be checked { if (Parent.ListDescriptors[i].IsActive() == false) continue; - if (i == Parent.ListDescriptors.CurrentSelectedDescriptor) + if (i == Parent.ListDescriptors.CurrentSelectedDescriptorIdx) Chara += "\t-> " + Parent.ListDescriptors[i].GetName() + ": " + string.Format("{0:0.######}", ListDescriptors[i].GetValue()) + "\n"; else Chara += Parent.ListDescriptors[i].GetName() + ": " + string.Format("{0:0.######}", ListDescriptors[i].GetValue()) + "\n"; } - Chara += this.StateForClassif; + Chara += this.GetClassName(); e.Text = Chara; } @@ -704,34 +738,119 @@ private void AssociatedChart_MouseClick(object sender, MouseEventArgs e) } else if (e.Button == MouseButtons.Right) { - ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + ContextMenuStrip NewMenu = new ContextMenuStrip(); - ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Info"); - ToolStripMenuItem ToolStripMenuItem_Histo = new ToolStripMenuItem("Histogram"); - ToolStripMenuItem ToolStripMenuItem_DisplayData = new ToolStripMenuItem("Display Data"); - ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + foreach (var item in this.GetExtendedContextMenu()) + NewMenu.Items.Add(item); - ToolStripMenuItem ToolStripMenuItem_Kegg = new ToolStripMenuItem("Kegg"); + NewMenu.Show(Control.MousePosition); + } - ToolStripSeparator ToolStripSep1 = new ToolStripSeparator(); - ToolStripMenuItem ToolStripMenuItem_Copy = new ToolStripMenuItem("Copy Visu."); + } - if (this.SQLTableName != "") - contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_DisplayData, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); - else - contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); + public void BuildAndisplaySimpleContextMenu(ToolStripItem[] ToBeAdded) + { + ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); - //ToolStripSeparator SepratorStrip = new ToolStripSeparator(); - contextMenuStrip.Show(Control.MousePosition); + ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Info"); + ToolStripMenuItem ToolStripMenuItem_Histo = new ToolStripMenuItem("Histogram"); + ToolStripMenuItem ToolStripMenuItem_DisplayData = new ToolStripMenuItem("Display Data"); + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); - ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); - ToolStripMenuItem_Histo.Click += new System.EventHandler(this.DisplayHisto); - ToolStripMenuItem_DisplayData.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayData); + if (this.SQLTableName != "") + contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_DisplayData, ToolStripMenuItem_Histo, ToolStripSep }); + else + contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep }); + + if (ToBeAdded != null) + contextMenuStrip.Items.AddRange(ToBeAdded); + //ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + contextMenuStrip.Show(Control.MousePosition); + + ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + ToolStripMenuItem_Histo.Click += new System.EventHandler(this.DisplayHisto); + ToolStripMenuItem_DisplayData.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayData); + } + + public List GetExtendedContextMenu() + { + List ListToReturn = new List(); + + ListToReturn.Add(AssociatedPlate.GetExtendedContextMenu()); + + #region Context Menu + base.SpecificContextMenu = new ToolStripMenuItem("Well [" + this.PosX + "x" + this.PosY + "]"); + // ToolStripSeparator Sep = new ToolStripSeparator(); + // base.SpecificContextMenu.Items.Add(Sep); + + + //ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Test Automated Menu"); + + //base.SpecificContextMenu.Items.Add(ToolStripMenuItem_Info); + + //// contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_Info, ToolStripMenuItem_Histo, ToolStripSep, ToolStripMenuItem_Kegg, ToolStripSep1, ToolStripMenuItem_Copy }); + + ////ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //// contextMenuStrip.Show(Control.MousePosition); + //ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + + + ToolStripMenuItem ToolStripMenuItem_Info = new ToolStripMenuItem("Info"); + ToolStripMenuItem_Info.Click += new System.EventHandler(this.DisplayInfo); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Info); + + ToolStripMenuItem ToolStripMenuItem_Histo = new ToolStripMenuItem("Histograms"); + ToolStripMenuItem_Histo.Click += new System.EventHandler(this.DisplayHisto); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Histo); + + if (this.LocusID != -1.0) + { + ToolStripMenuItem ToolStripMenuItem_Kegg = new ToolStripMenuItem("Kegg"); ToolStripMenuItem_Kegg.Click += new System.EventHandler(this.DisplayPathways); - ToolStripMenuItem_Copy.Click += new System.EventHandler(this.CopyVisu); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_Kegg); } + if (this.SQLTableName != "") + { + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + SpecificContextMenu.DropDownItems.Add(ToolStripSep); + + ToolStripMenuItem ToolStripMenuItem_DisplayData = new ToolStripMenuItem("Display Single Object Data"); + ToolStripMenuItem_DisplayData.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayData); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayData); + + ToolStripMenuItem ToolStripMenuItem_AddToSingleCellAnalysis = new ToolStripMenuItem("Add to Single Object Analysis"); + ToolStripMenuItem_AddToSingleCellAnalysis.Click += new System.EventHandler(this.ToolStripMenuItem_AddToSingleCellAnalysis); + SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_AddToSingleCellAnalysis); + } + + if (this.GetClassIdx() >= 0) + base.SpecificContextMenu.DropDownItems.Add(Parent.GlobalInfo.ListWellClasses[this.GetClassIdx()].GetExtendedContextMenu()); + + //ToolStripSeparator ToolStripSep1 = new ToolStripSeparator(); + //ToolStripMenuItem ToolStripMenuItem_Copy = new ToolStripMenuItem("Copy Visu."); + + //ToolStripSeparator SepratorStrip = new ToolStripSeparator(); + //base.SpecificContextMenu.Show(Control.MousePosition); + //ToolStripMenuItem_Copy.Click += new System.EventHandler(this.CopyVisu); + #endregion + + ListToReturn.Add(base.SpecificContextMenu); + + return ListToReturn; + } + //ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + + private void ToolStripMenuItem_AddToSingleCellAnalysis(object sender, EventArgs e) + { + AddToSingleCellAnalysis(); + } + + public void AddToSingleCellAnalysis() + { + Parent.GlobalInfo.WindowHCSAnalyzer.listBoxSelectedWells.Items.Add(Parent.GetCurrentDisplayPlate().Name + " : " + this.GetPosX() + "x" + this.GetPosY()); + Parent.GlobalInfo.ListSelectedWell.Add(this); } private void ToolStripMenuItem_DisplayData(object sender, EventArgs e) @@ -739,8 +858,40 @@ private void ToolStripMenuItem_DisplayData(object sender, EventArgs e) this.AssociatedPlate.DBConnection = new cDBConnection(this.AssociatedPlate, this.SQLTableName); // this.AssociatedPlate.DBConnection.DB_EstablishConnection(); - this.AssociatedPlate.DBConnection.DisplayTable(this); + // DataTable DT = new DataTable(); + + // this.AssociatedPlate.DBConnection.AddWellToDataTable(this, DT, false, Parent.GlobalInfo); + + cListSingleBiologicalObjects ListPhenotypes = + this.AssociatedPlate.DBConnection.GetWellBiologicalPhenotypes(this); + + cExtendedTable ET = this.AssociatedPlate.DBConnection.GetWellValues(this, Parent.ListDescriptors.GetActiveDescriptors()); + + //cExtendedTable ET = new cExtendedTable(ListPhenotypes); + for (int i = 0; i < ET.Count; i++) + { + ET[i].ListTags = new List(); + + for (int j = 0; j < ListPhenotypes.Count; j++) + ET[i].ListTags.Add(ListPhenotypes[j]); + } + + ET.Name = this.Name; + cViewer2DScatterPoint VS = new cViewer2DScatterPoint(); + VS.SetInputData(ET); + VS.Chart.IsSelectable = true; + //VS.Chart.IsSelectable = true; + VS.Run(); + + cDisplayToWindow DTW = new cDisplayToWindow(); + DTW.SetInputData(VS.GetOutPut()); + DTW.Title = "Well [" + this.PosX + "x" + this.PosY + "] - " + this.Name; + DTW.Run(); + DTW.Display(); + + + // this.AssociatedPlate.DBConnection.DisplayTable(this); this.AssociatedPlate.DBConnection.DB_CloseConnection(); //this.SQLTableName @@ -748,279 +899,459 @@ private void ToolStripMenuItem_DisplayData(object sender, EventArgs e) private void DisplayHisto(object sender, EventArgs e) { - if ((Parent.ListDescriptors == null) || (Parent.ListDescriptors.Count == 0)) return; - cExtendedList Pos = new cExtendedList(); + cDisplayToWindow CDW1 = new cDisplayToWindow(); + cListWell ListWellsToProcess = new cListWell(null); + List PlateList = new List(); + cDesignerSplitter DS = new cDesignerSplitter(); - cWell TempWell; + foreach (cPlate TmpPlate in Parent.ListPlatesActive) PlateList.Add(TmpPlate); - int NumberOfPlates = Parent.GlobalInfo.PlateListWindow.listBoxPlateNameToProcess.Items.Count; + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = Parent.ListPlatesActive.GetPlate((string)Parent.GlobalInfo.PlateListWindow.listBoxPlateNameToProcess.Items[PlateIdx]); + cExtendedTable NewTable2 = ListWellsToProcess.GetDescriptorValues(Parent.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable2.Name = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Stacked Histogram - " + PlateList.Count + " plates"; - for (int row = 0; row < Parent.Rows; row++) - for (int col = 0; col < Parent.Columns; col++) - { - TempWell = CurrentPlateToProcess.GetWell(col, row, false); - if (TempWell == null) continue; - else - { - if (TempWell.GetClass() == this.ClassForClassif) - Pos.Add(TempWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue()); - } - } - } + cViewerStackedHistogram CV2 = new cViewerStackedHistogram(); + CV2.SetInputData(NewTable2); + CV2.Chart.LabelAxisX = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV2.Chart.IsBorder = false; + CV2.Chart.Width = 0; + CV2.Chart.Height = 0; + StripLine AverageLine = new StripLine(); + AverageLine.BackColor = Color.Red; + AverageLine.IntervalOffset = this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + AverageLine.StripWidth = 0.0001; + AverageLine.Text = this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue().ToString("N2"); - if (Pos.Count == 0) - { - MessageBox.Show("No well of class " + Parent.SelectedClass + " selected !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } + CV2.Run(); - List HistoPos = Pos.CreateHistogram((int)Parent.GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); - if (HistoPos == null) return; - SimpleForm NewWindow = new SimpleForm(this.Parent); + CV2.Chart.ChartAreas[0].AxisX.StripLines.Add(AverageLine); - Series SeriesPos = new Series(); - SeriesPos.ShadowOffset = 1; + DS.SetInputData(CV2.GetOutPut()); - if (HistoPos.Count == 0) return; - for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) - { - SeriesPos.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); - SeriesPos.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); + PlateList.Clear(); + PlateList.Add(Parent.GetCurrentDisplayPlate()); + ListWellsToProcess.Clear(); + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); - if (this.ClassForClassif == -1) - SeriesPos.Points[IdxValue].Color = Color.Black; - else - SeriesPos.Points[IdxValue].Color = Parent.GlobalInfo.GetColor(this.ClassForClassif); - } + CDW1.Title = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Stacked Histogram (" + PlateList[0].Name + ")"; - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; + cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(Parent.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable.Name = CDW1.Title; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[0].Title = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetName(); - CurrentChartArea.Axes[1].Title = "Sum"; - CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + CV1.SetInputData(NewTable); + CV1.Chart.LabelAxisX = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV1.Chart.Width = 0; + CV1.Chart.Height = 0; - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = Parent.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; - SeriesPos.ChartType = SeriesChartType.Column; - // SeriesPos.Color = Parent.GetColor(1); - NewWindow.chartForSimpleForm.Series.Add(SeriesPos); + // CV1.Chart.ChartAreas[0].AxisX.Minimum = CV2.Chart.ChartAreas[0].AxisX.Minimum; + // CV1.Chart.ChartAreas[0].AxisX.Maximum = CV2.Chart.ChartAreas[0].AxisX.Maximum; + CV1.Run(); + CV1.Chart.ChartAreas[0].AxisX.StripLines.Add(AverageLine); - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + DS.SetInputData(CV1.GetOutPut()); + DS.Run(); - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Red; - AverageLine.IntervalOffset = this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue(); - AverageLine.StripWidth = 0.0001; - AverageLine.Text = String.Format("{0:0.###}", this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue()); - CurrentChartArea.AxisX.StripLines.Add(AverageLine); + CDW1.SetInputData(DS.GetOutPut()); - if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) - { - StripLine NAverageLine = new StripLine(); - NAverageLine.BackColor = Color.Black; - NAverageLine.IntervalOffset = Pos.Mean(); - NAverageLine.StripWidth = 0.0001;// double.Epsilon; - CurrentChartArea.AxisX.StripLines.Add(NAverageLine); - NAverageLine.Text = String.Format("{0:0.###}", NAverageLine.IntervalOffset); - - StripLine StdLine = new StripLine(); - StdLine.BackColor = Color.FromArgb(64, Color.Black); - double Std = Pos.Std(); - StdLine.IntervalOffset = NAverageLine.IntervalOffset - 0.5 * Std; - StdLine.StripWidth = Std; - CurrentChartArea.AxisX.StripLines.Add(StdLine); - //NAverageLine.StripWidth = 0.01; - } + CDW1.Run(); + CDW1.Display(); + return; - Title CurrentTitle = new Title(this.StateForClassif + " - " + Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetName() + " histogram."); - CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + //cExtendedList Pos = new cExtendedList(); + //cWell TempWell; - NewWindow.Text = CurrentTitle.Text; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + //int NumberOfPlates = Parent.GlobalInfo.PlateListWindow.listBoxPlateNameToProcess.Items.Count; - return; + //// loop on all the plate + //for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + //{ + // cPlate CurrentPlateToProcess = Parent.ListPlatesActive.GetPlate((string)Parent.GlobalInfo.PlateListWindow.listBoxPlateNameToProcess.Items[PlateIdx]); + + // for (int row = 0; row < Parent.Rows; row++) + // for (int col = 0; col < Parent.Columns; col++) + // { + // TempWell = CurrentPlateToProcess.GetWell(col, row, false); + // if (TempWell == null) continue; + // else + // { + // if (TempWell.GetClassIdx() == this.ClassForClassif) + // Pos.Add(TempWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue()); + // } + // } + //} + + //if (Pos.Count == 0) + //{ + // MessageBox.Show("No well of class " + Parent.SelectedClass + " selected !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + //} + + //List HistoPos = Pos.CreateHistogram((int)Parent.GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); + //if (HistoPos == null) return; + //cWindowToDisplayHisto NewWindow = new cWindowToDisplayHisto(this.Parent, Pos); + + //Series SeriesPos = new Series(); + //SeriesPos.ShadowOffset = 1; + + //if (HistoPos.Count == 0) return; + + //for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) + //{ + // SeriesPos.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); + // SeriesPos.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); + + // if (this.ClassForClassif == -1) + // SeriesPos.Points[IdxValue].Color = Color.Black; + // else + // SeriesPos.Points[IdxValue].Color = Parent.GlobalInfo.ListWellClasses[this.ClassForClassif].ColourForDisplay; + //} + + //ChartArea CurrentChartArea = new ChartArea(); + //CurrentChartArea.BorderColor = Color.Black; + + //NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + //CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + //CurrentChartArea.Axes[0].Title = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetName(); + //CurrentChartArea.Axes[1].Title = "Sum"; + //CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + //NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + //CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + //CurrentChartArea.BackColor = Parent.GlobalInfo.OptionsWindow.panel1.BackColor; + //CurrentChartArea.BackSecondaryColor = Color.White; + + //SeriesPos.ChartType = SeriesChartType.Column; + //// SeriesPos.Color = Parent.GetColor(1); + //NewWindow.chartForSimpleForm.Series.Add(SeriesPos); + + //NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + //NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + + //StripLine AverageLine = new StripLine(); + //AverageLine.BackColor = Color.Red; + //AverageLine.IntervalOffset = this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue(); + //AverageLine.StripWidth = 0.0001; + //AverageLine.Text = String.Format("{0:0.###}", this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue()); + //CurrentChartArea.AxisX.StripLines.Add(AverageLine); + + //if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) + //{ + // StripLine NAverageLine = new StripLine(); + // NAverageLine.BackColor = Color.Black; + // NAverageLine.IntervalOffset = Pos.Mean(); + // NAverageLine.StripWidth = 0.0001;// double.Epsilon; + // CurrentChartArea.AxisX.StripLines.Add(NAverageLine); + // NAverageLine.Text = String.Format("{0:0.###}", NAverageLine.IntervalOffset); + + // StripLine StdLine = new StripLine(); + // StdLine.BackColor = Color.FromArgb(64, Color.Black); + // double Std = Pos.Std(); + // StdLine.IntervalOffset = NAverageLine.IntervalOffset - 0.5 * Std; + // StdLine.StripWidth = Std; + // CurrentChartArea.AxisX.StripLines.Add(StdLine); + // //NAverageLine.StripWidth = 0.01; + //} + + //Title CurrentTitle = new Title(this.StateForClassif + " - " + Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetName() + " histogram."); + //CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); + //NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + + //NewWindow.Text = CurrentTitle.Text; + //NewWindow.Show(); + //NewWindow.chartForSimpleForm.Update(); + //NewWindow.chartForSimpleForm.Show(); + //NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + + //return; } - void DisplayPathways(object sender, EventArgs e) - { - if (LocusID == -1) return; - FormForKeggGene KeggWin = new FormForKeggGene(); - KEGG ServKegg = new KEGG(); - string[] intersection_gene_pathways = new string[1]; - - intersection_gene_pathways[0] = "hsa:" + LocusID; - string[] Pathways = ServKegg.get_pathways_by_genes(intersection_gene_pathways); - if ((Pathways == null) || (Pathways.Length == 0)) - { - MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } + //void DisplayPathways(object sender, EventArgs e) + //{ + // if (LocusID == -1) return; + // FormForKeggGene KeggWin = new FormForKeggGene(); + // KEGG ServKegg = new KEGG(); + // string[] intersection_gene_pathways = new string[1]; + + // intersection_gene_pathways[0] = "hsa:" + LocusID; + // string[] Pathways = ServKegg.get_pathways_by_genes(intersection_gene_pathways); + // if ((Pathways == null) || (Pathways.Length == 0)) + // { + // MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } - string GenInfo = ServKegg.bget(intersection_gene_pathways[0]); + // string GenInfo = ServKegg.bget(intersection_gene_pathways[0]); - // FormForPathway PathwaysGenes = new FormForPathway(); + // // FormForPathway PathwaysGenes = new FormForPathway(); - KeggWin.richTextBox.Text = GenInfo; - KeggWin.Text = "Gene Infos"; - //PathwaysGenes.Show(); - ListP = new FormForPathway(); + // KeggWin.richTextBox.Text = GenInfo; + // KeggWin.Text = "Gene Infos"; + // //PathwaysGenes.Show(); + // ListP = new FormForPathway(); - ListP.listBoxPathways.DataSource = Pathways; + // ListP.listBoxPathways.DataSource = Pathways; - ListP.Text = this.Name; - ListP.Show(); - //foreach (string item in Pathways) - //{ - // string PathwayInfo = ServKegg.bget(item); - // FormPathwaysGenes PathwaysGenes = new FormPathwaysGenes(); + // ListP.Text = this.Name; + // ListP.Show(); + // //foreach (string item in Pathways) + // //{ + // // string PathwayInfo = ServKegg.bget(item); + // // FormPathwaysGenes PathwaysGenes = new FormPathwaysGenes(); - // PathwaysGenes.richTextBox1.Text = PathwayInfo; - // PathwaysGenes.Text = "Pathways Infos"; - // PathwaysGenes.Show(); + // // PathwaysGenes.richTextBox1.Text = PathwayInfo; + // // PathwaysGenes.Text = "Pathways Infos"; + // // PathwaysGenes.Show(); - //} + // //} - string[] fg_list = { "black" }; - string[] bg_list = { "orange" }; - // string[] intersection_gene_pathways = new string[1]; + // string[] fg_list = { "black" }; + // string[] bg_list = { "orange" }; + // // string[] intersection_gene_pathways = new string[1]; - // intersection_gene_pathways[0] = "hsa:" + LocusID; + // // intersection_gene_pathways[0] = "hsa:" + LocusID; - string pathway_map_html = ""; - // KEGG ServKegg = new KEGG(); + // string pathway_map_html = ""; + // // KEGG ServKegg = new KEGG(); - pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)(ListP.listBoxPathways.SelectedItem), intersection_gene_pathways, fg_list, bg_list); + // pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)(ListP.listBoxPathways.SelectedItem), intersection_gene_pathways, fg_list, bg_list); - // FormForKegg KeggWin = new FormForKegg(); - if (pathway_map_html.Length == 0) return; + // // FormForKegg KeggWin = new FormForKegg(); + // if (pathway_map_html.Length == 0) return; - // - //KeggWin.Show(); - ListP.listBoxPathways.MouseDoubleClick += new MouseEventHandler(listBox1_MouseDoubleClick); - KeggWin.webBrowser.Navigate(pathway_map_html); + // // + // //KeggWin.Show(); + // ListP.listBoxPathways.MouseDoubleClick += new MouseEventHandler(listBox1_MouseDoubleClick); + // KeggWin.webBrowser.Navigate(pathway_map_html); - KeggWin.Show(); + // KeggWin.Show(); - } + //} - void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) + void DisplayPathways(object sender, EventArgs e) { - string[] fg_list = { "black" }; - string[] bg_list = { "orange" }; - string[] intersection_gene_pathways = new string[1]; - - intersection_gene_pathways[0] = "hsa:" + LocusID; + if (LocusID == -1 || LocusID == 0) + { + MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } - string pathway_map_html = ""; - KEGG ServKegg = new KEGG(); + List Pathways2 = HCSAnalyzer.HCSAnalyzer.Find_Pathways(LocusID); //appel de la function static je ne sais pas pourquoi elle doit etre static… - string[] ListGenesinPathway = ServKegg.get_genes_by_pathway((string)ListP.listBoxPathways.SelectedItem); - double[] ListValues = new double[ListGenesinPathway.Length]; - int IDxGeneOfInterest = 0; - foreach (cPlate CurrentPlate in Parent.ListPlatesActive) + if (Pathways2.Count > 0 || Pathways2.Count == 0) { - foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) - { - string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; + string getvars2 = "/get/hsa:" + LocusID; + string getvar = "/link/genes/" + "hsa05010"; + HttpWebRequest req2 = WebRequest.Create(string.Format("http://rest.kegg.jp" + getvar)) as HttpWebRequest; + req2.Method = "GET"; + + HttpWebResponse response = req2.GetResponse() as HttpWebResponse; + StreamReader reader2 = new StreamReader(response.GetResponseStream()); + + + string GenInfo = reader2.ReadToEnd(); + + reader2.Close(); + + - for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) + string[] genesarraytmp = GenInfo.Split('\n'); + List genesarray = new List(); + foreach (string item in genesarraytmp) + { + if (item.Contains('\t')) { + genesarray.Add(item.Split('\t')[1]); + } - if (CurrentLID == intersection_gene_pathways[0]) - IDxGeneOfInterest = IdxGene; + } + int yup = 0; + + string[] ListGenesinPathway = genesarray.ToArray(); + double[] ListValues = new double[ListGenesinPathway.Length]; + int IDxGeneOfInterest = 0; + //StreamWriter stw = new StreamWriter(@"C:\alzheimer.csv"); + //stw.WriteLine("Genes" + "," + "Value"); + foreach (cPlate CurrentPlate in Parent.ListPlatesActive) + { + foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + { + string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; - if (CurrentLID == ListGenesinPathway[IdxGene]) + for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) { - ListValues[IdxGene] = CurrentWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue(); - break; + + //if (CurrentLID == ListGenesinPathway[IdxGene]) + // IDxGeneOfInterest = IdxGene; + + if (CurrentLID == ListGenesinPathway[IdxGene]) + { + ListValues[IdxGene] = CurrentWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + //stw.Write(CurrentWell.Name); stw.Write(","); stw.Write(ListValues[IdxGene]); stw.WriteLine(); + break; + } } } } - } + //stw.Close(); + string webpage = "http://www.kegg.jp/kegg-bin/show_pathway?hsa05010+"; + + double MinValue = ListValues.Min(); + double MaxValue = ListValues.Max(); + string[] bg_list = new string[ListGenesinPathway.Length]; + string[] fg_list = new string[ListGenesinPathway.Length]; + for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) + { + + int ConvertedValue = (int)((((Parent.GlobalInfo.LUTs.LUT_JET[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); - bg_list = new string[ListGenesinPathway.Length]; - fg_list = new string[ListGenesinPathway.Length]; + Color Coul = Color.FromArgb(Parent.GlobalInfo.LUTs.LUT_JET[0][ConvertedValue], Parent.GlobalInfo.LUTs.LUT_JET[1][ConvertedValue], + Parent.GlobalInfo.LUTs.LUT_JET[2][ConvertedValue]); - double MinValue = ListValues.Min(); - double MaxValue = ListValues.Max(); + + fg_list[IdxCol] = "000000"; + bg_list[IdxCol] = Coul.Name.Remove(0, 2); - for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) + } + int ad=0; + foreach (string item in genesarray) + { + webpage += item+"%09%23"+bg_list[ad]+"+"; + ad++; + } + + Process.Start("chrome.exe",webpage); + + //FormForKeggGene KeggWin = new FormForKeggGene(); + + //KeggWin.webBrowser.Navigate(webpage); + ////KeggWin.richTextBox.Text = GenInfo; + ////KeggWin.Text = "Gene Infos"; + //KeggWin.Show(); + response.Close(); + } + else { + MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } - int ConvertedValue = (int)((((Parent.GlobalInfo.LUTs.LUT_JET[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); - Color Coul = Color.FromArgb(Parent.GlobalInfo.LUTs.LUT_JET[0][ConvertedValue], Parent.GlobalInfo.LUTs.LUT_JET[1][ConvertedValue], Parent.GlobalInfo.LUTs.LUT_JET[2][ConvertedValue]); + - if (IdxCol == IDxGeneOfInterest) - fg_list[IdxCol] = "white"; - else - fg_list[IdxCol] = "#000000"; - bg_list[IdxCol] = "#" + Coul.Name.Remove(0, 2); - } - pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)ListP.listBoxPathways.SelectedItem, ListGenesinPathway, fg_list, bg_list); - string GenInfo = ServKegg.bget((string)ListP.listBoxPathways.SelectedItem); - string[] Genes = GenInfo.Split(new char[] { '\n' }); - string Res = ""; - foreach (string item in Genes) - { - string[] fre = item.Split(' '); - string[] STRsection = fre[0].Split('_'); - if (STRsection[0] != "NAME") continue; - for (int i = 1; i < fre.Length; i++) - { - if (fre[i] == "") continue; - Res += fre[i] + " "; - } - } + //void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) + //{ + // string[] fg_list = { "black" }; + // string[] bg_list = { "orange" }; + // string[] intersection_gene_pathways = new string[1]; - FormForKegg KeggWin = new FormForKegg(); + // intersection_gene_pathways[0] = "hsa:" + LocusID; - if (pathway_map_html.Length == 0) return; + // string pathway_map_html = ""; + // KEGG ServKegg = new KEGG(); - KeggWin.Text = Res; - KeggWin.Show(); + // string[] ListGenesinPathway = ServKegg.get_genes_by_pathway((string)ListP.listBoxPathways.SelectedItem); + // double[] ListValues = new double[ListGenesinPathway.Length]; + // int IDxGeneOfInterest = 0; + // foreach (cPlate CurrentPlate in Parent.ListPlatesActive) + // { + // foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + // { + // string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; - KeggWin.webBrowser.Navigate(pathway_map_html); - } + // for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) + // { + + // if (CurrentLID == intersection_gene_pathways[0]) + // IDxGeneOfInterest = IdxGene; + + // if (CurrentLID == ListGenesinPathway[IdxGene]) + // { + // ListValues[IdxGene] = CurrentWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + // break; + // } + // } + // } + // } + + // bg_list = new string[ListGenesinPathway.Length]; + // fg_list = new string[ListGenesinPathway.Length]; + + // double MinValue = ListValues.Min(); + // double MaxValue = ListValues.Max(); + + // for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) + // { + + // int ConvertedValue = (int)((((Parent.GlobalInfo.LUTs.LUT_JET[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); + + // Color Coul = Color.FromArgb(Parent.GlobalInfo.LUTs.LUT_JET[0][ConvertedValue], Parent.GlobalInfo.LUTs.LUT_JET[1][ConvertedValue], Parent.GlobalInfo.LUTs.LUT_JET[2][ConvertedValue]); + + // if (IdxCol == IDxGeneOfInterest) + // fg_list[IdxCol] = "white"; + // else + // fg_list[IdxCol] = "#000000"; + // bg_list[IdxCol] = "#" + Coul.Name.Remove(0, 2); + + // } + + // pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)ListP.listBoxPathways.SelectedItem, ListGenesinPathway, fg_list, bg_list); + + // string GenInfo = ServKegg.bget((string)ListP.listBoxPathways.SelectedItem); + // string[] Genes = GenInfo.Split(new char[] { '\n' }); + // string Res = ""; + // foreach (string item in Genes) + // { + // string[] fre = item.Split(' '); + // string[] STRsection = fre[0].Split('_'); + + // if (STRsection[0] != "NAME") continue; + + // for (int i = 1; i < fre.Length; i++) + // { + // if (fre[i] == "") continue; + // Res += fre[i] + " "; + // } + // } + + // FormForKegg KeggWin = new FormForKegg(); + + // if (pathway_map_html.Length == 0) return; + + // KeggWin.Text = Res; + // KeggWin.Show(); + + // KeggWin.webBrowser.Navigate(pathway_map_html); + //} public Chart GetChart() { @@ -1069,12 +1400,10 @@ public Chart GetChart() } - static IList images = null; - /// /// Display the information window related to the selected well /// - public void DisplayInfoWindow() + public void DisplayInfoWindow(int IdxDescriptor) { FormForWellInformation NewWindow = new FormForWellInformation(this); @@ -1087,39 +1416,105 @@ public void DisplayInfoWindow() if (LocusID != -1) NewWindow.textBoxLocusID.Text = ((int)(LocusID)).ToString(); - Series CurrentSeries = new Series("ChartSeries" + PosX + "x" + PosY); - ChartArea CurrentChartArea = new ChartArea("ChartArea" + PosX + "x" + PosY); + if (Parent.GlobalInfo.ViewMode != eViewMode.PIE) { + this.AssociatedPlate.DBConnection = new cDBConnection(this.AssociatedPlate, this.SQLTableName); + // this.AssociatedPlate.DBConnection.DB_EstablishConnection(); - CurrentSeries.ShadowOffset = 2; + // DataTable DT = new DataTable(); + // this.AssociatedPlate.DBConnection.AddWellToDataTable(this, DT, false, Parent.GlobalInfo); - for (int IdxValue = 0; IdxValue < ListDescriptors[CurrentDescriptorToDisplay].GetAssociatedType().GetBinNumber(); IdxValue++) + + + // cExtendedList Values = + List LCDT = new List(); + LCDT.Add(Parent.ListDescriptors.GetActiveDescriptor()); + cExtendedTable ET = new cExtendedTable(); + + foreach (var item in Parent.GlobalInfo.ListCellularPhenotypes) { - double Value = ListDescriptors[CurrentDescriptorToDisplay].GetHistovalue(IdxValue); - //CurrentSeries.Points.Add(Value); + List ListCellularPhenotypesToBeSelected = new List(); + ListCellularPhenotypesToBeSelected.Add(item); - CurrentSeries.Points.AddXY(ListDescriptors[CurrentDescriptorToDisplay].GetHistoXvalue(IdxValue), Value); + cExtendedTable TmpET = this.AssociatedPlate.DBConnection.GetWellValues(this, + LCDT, + ListCellularPhenotypesToBeSelected); + if (TmpET.Count == 0) continue; + TmpET[0].Name = item.Name; + TmpET[0].Tag = item; + ET.Add(TmpET[0]); - CurrentSeries.Points[IdxValue].ToolTip = Value.ToString(); } + ET.Name = this.Name; + cViewerStackedHistogram VSH = new cViewerStackedHistogram(); + VSH.SetInputData(ET); + VSH.Chart.BinNumber = LCDT[0].GetBinNumber(); + //VS.Chart.IsSelectable = true; + //VSH.Chart.BackgroundColor = Color.LightGray; + VSH.Chart.IsShadow = true; + VSH.Chart.IsXAxis = true; + VSH.Chart.IsYAxis = true; + VSH.Chart.LabelAxisX = Parent.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + VSH.Run(); + VSH.Chart.Width = 0;// NewWindow.chartForFormWell.Width; + VSH.Chart.Height = 0;// NewWindow.chartForFormWell.Height; + // NewWindow.chartForFormWell = (Chart)(VSH.Chart); + // NewWindow.Controls.Add(VSH.GetOutPut()); - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[0].Title = ListDescriptors[CurrentDescriptorToDisplay].GetName(); - // if (CurrentSeries.Points.Count == 1) - CurrentSeries.ChartType = SeriesChartType.Column; - // else - // CurrentSeries.ChartType = SeriesChartType.Line; - CurrentSeries.Color = Color.White; - CurrentSeries.BorderWidth = 3; + cExtendedControl EC = VSH.GetOutPut(); + EC.Width = NewWindow.chartForFormWell.Width; + EC.Height = NewWindow.chartForFormWell.Height; + + NewWindow.chartForFormWell.Controls.Add(EC); + + + + //cDisplayToWindow DTW = new cDisplayToWindow(); + //DTW.SetInputData(VSH.GetOutPut()); + // DTW.Title = "Well [" + this.PosX + "x" + this.PosY + "] - " + this.Name; + // DTW.Run(); + // DTW.Display(); + + + // this.AssociatedPlate.DBConnection.DisplayTable(this); + + this.AssociatedPlate.DBConnection.DB_CloseConnection(); + //this.SQLTableName + + + //this.db + + + //CurrentSeries.ShadowOffset = 2; + + //for (int IdxValue = 0; IdxValue < ListDescriptors[IdxDescriptor].GetAssociatedType().GetBinNumber(); IdxValue++) + //{ + // double Value = ListDescriptors[IdxDescriptor].GetHistovalue(IdxValue); + // //CurrentSeries.Points.Add(Value); + + // CurrentSeries.Points.AddXY(ListDescriptors[IdxDescriptor].GetHistoXvalue(IdxValue), Value); + // CurrentSeries.Points[IdxValue].ToolTip = Value.ToString(); + //} + + //CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + //CurrentChartArea.Axes[0].Title = ListDescriptors[IdxDescriptor].GetName(); + //// if (CurrentSeries.Points.Count == 1) + //CurrentSeries.ChartType = SeriesChartType.Column; + //// else + //// CurrentSeries.ChartType = SeriesChartType.Line; + //CurrentSeries.Color = Color.White; + //CurrentSeries.BorderWidth = 3; } else { + Series CurrentSeries = new Series("ChartSeries" + PosX + "x" + PosY); + ChartArea CurrentChartArea = new ChartArea("ChartArea" + PosX + "x" + PosY); CurrentSeries.ChartType = SeriesChartType.Pie; for (int IdxValue = 0; IdxValue < ListDescriptors.Count; IdxValue++) { @@ -1135,17 +1530,17 @@ public void DisplayInfoWindow() } } } + CurrentChartArea.BorderColor = Color.Black; + + NewWindow.chartForFormWell.ChartAreas.Add(CurrentChartArea); + NewWindow.chartForFormWell.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + CurrentChartArea.BackColor = Color.FromArgb(64, 64, 64); + CurrentSeries.ChartArea = "ChartArea" + PosX + "x" + PosY; + CurrentSeries.Name = "Series" + PosX + "x" + PosY; + NewWindow.chartForFormWell.Series.Add(CurrentSeries); } - CurrentChartArea.BorderColor = Color.Black; - NewWindow.chartForFormWell.ChartAreas.Add(CurrentChartArea); - NewWindow.chartForFormWell.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackColor = Color.FromArgb(64, 64, 64); - CurrentSeries.ChartArea = "ChartArea" + PosX + "x" + PosY; - - CurrentSeries.Name = "Series" + PosX + "x" + PosY; - NewWindow.chartForFormWell.Series.Add(CurrentSeries); // GlobalInfo.SwitchDistributionMode(); //} @@ -1156,62 +1551,56 @@ public void DisplayInfoWindow() //} NewWindow.richTextBoxDescription.AppendText("Plate: " + this.AssociatedPlate.Name + "\nWell: [" + this.GetPosX() + "x" + this.GetPosY() + "]"); - NewWindow.richTextBoxDescription.AppendText("\nCell Number: " + this.CellNumber); - - if (Parent.GlobalInfo.ViewMode != eViewMode.PIE) - { - NewWindow.richTextBoxDescription.AppendText("\nHistogram: BINS: " + ListDescriptors[CurrentDescriptorToDisplay].GetAssociatedType().GetBinNumber() + ", STEP: " + ListDescriptors[CurrentDescriptorToDisplay].Histogram.Step); - } if (Parent.GlobalInfo.IsDistributionMode() && (Parent.Reference != null)) { - Series CurrentSeriesReference = new Series("Reference"); - - CurrentSeriesReference.ChartType = SeriesChartType.Line; - CurrentSeriesReference.BorderWidth = 2; - CurrentSeriesReference.Color = Color.Red; - // CurrentSeriesReference.ShadowOffset = 2; - - double[] ReferenceCurve = Parent.Reference[Parent.ListDescriptors.CurrentSelectedDescriptor].ToArray(); - - for (int IdxValue = 0; IdxValue < ReferenceCurve.Length; IdxValue++) - { - double Value = ReferenceCurve[IdxValue]; - CurrentSeriesReference.Points.Add(Value); - CurrentSeriesReference.Points[IdxValue].ToolTip = "[Reference] " + Value.ToString(); - } - NewWindow.chartForFormWell.Series.Add(CurrentSeriesReference); - - if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) - { - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Red; - AverageLine.IntervalOffset = Parent.Reference[Parent.ListDescriptors.CurrentSelectedDescriptor].GetWeightedMean(); - AverageLine.StripWidth = double.Epsilon; - CurrentChartArea.AxisX.StripLines.Add(AverageLine); - AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); - AverageLine.ForeColor = Color.White; - AverageLine.StripWidth = 0.0001; - } + //Series CurrentSeriesReference = new Series("Reference"); + + //CurrentSeriesReference.ChartType = SeriesChartType.Line; + //CurrentSeriesReference.BorderWidth = 2; + //CurrentSeriesReference.Color = Color.Red; + //// CurrentSeriesReference.ShadowOffset = 2; + + //double[] ReferenceCurve = Parent.Reference[Parent.ListDescriptors.CurrentSelectedDescriptor].ToArray(); + + //for (int IdxValue = 0; IdxValue < ReferenceCurve.Length; IdxValue++) + //{ + // double Value = ReferenceCurve[IdxValue]; + // CurrentSeriesReference.Points.Add(Value); + // CurrentSeriesReference.Points[IdxValue].ToolTip = "[Reference] " + Value.ToString(); + //} + //NewWindow.chartForFormWell.Series.Add(CurrentSeriesReference); + + //if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) + //{ + // StripLine AverageLine = new StripLine(); + // AverageLine.BackColor = Color.Red; + // AverageLine.IntervalOffset = Parent.Reference[Parent.ListDescriptors.CurrentSelectedDescriptor].GetWeightedMean(); + // AverageLine.StripWidth = double.Epsilon; + // CurrentChartArea.AxisX.StripLines.Add(AverageLine); + // AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); + // AverageLine.ForeColor = Color.White; + // AverageLine.StripWidth = 0.0001; + //} } - if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) - { + //if (Parent.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) + //{ - StripLine AverageLineHisto = new StripLine(); - AverageLineHisto.BackColor = Color.Red; - AverageLineHisto.IntervalOffset = ListDescriptors[CurrentDescriptorToDisplay].Histogram.GetAverageValue(); - // AverageLineHisto.IntervalOffset = ListDescriptors[CurrentDescriptorToDisplay].Getvalues().GetWeightedMean(); - AverageLineHisto.StripWidth = double.Epsilon; - CurrentChartArea.AxisX.StripLines.Add(AverageLineHisto); - AverageLineHisto.Text = String.Format("{0:0.###}", AverageLineHisto.IntervalOffset); - AverageLineHisto.ForeColor = Color.White; - AverageLineHisto.StripWidth = 0.0001; - } + // StripLine AverageLineHisto = new StripLine(); + // AverageLineHisto.BackColor = Color.Red; + // AverageLineHisto.IntervalOffset = ListDescriptors[IdxDescriptor].Histogram.GetAverageValue(); + // // AverageLineHisto.IntervalOffset = ListDescriptors[CurrentDescriptorToDisplay].Getvalues().GetWeightedMean(); + // AverageLineHisto.StripWidth = double.Epsilon; + // CurrentChartArea.AxisX.StripLines.Add(AverageLineHisto); + // AverageLineHisto.Text = String.Format("{0:0.###}", AverageLineHisto.IntervalOffset); + // AverageLineHisto.ForeColor = Color.White; + // AverageLineHisto.StripWidth = 0.0001; + //} - Title CurrentTitle = new Title(PosX + "x" + PosY); - NewWindow.chartForFormWell.Titles.Add(CurrentTitle); + //Title CurrentTitle = new Title(PosX + "x" + PosY); + //NewWindow.chartForFormWell.Titles.Add(CurrentTitle); NewWindow.Text = PosX + "x" + PosY + " / " + StateForClassif; @@ -1475,46 +1864,12 @@ public void DrawPic(FormForWellInformation NewWindow, List lMin, List LDesc) { - foreach (var item in LDesc) - { - // if this is a single value, Cell number of the well become 0 - if (item.GetAssociatedType().DataType == eDataType.SINGLE) - { - if (this.CellNumber == -1) this.CellNumber = 0; - this.ListDescriptors.Add(item); - item.AssociatedWell = this; - } - else - { - if ((this.CellNumber == -1) || (this.CellNumber == 0)) - { - //if(this.CellNumber == item.CellNumber) - this.CellNumber = item.CellNumber; - this.ListDescriptors.Add(item); - item.AssociatedWell = this; - - } - else if (this.CellNumber == item.CellNumber) - { - this.ListDescriptors.Add(item); - item.AssociatedWell = this; - - } - else - { - MessageBox.Show("Data lenght inconsistency ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - } - } - - - + this.ListDescriptors.AddRange(LDesc); } /// @@ -1542,7 +1897,6 @@ private void CopyVisu(object sender, EventArgs e) /// the weka instances public Instances CreateInstanceForNClasses(cInfoClass InfoClass) { - List AverageList = new List(); for (int i = 0; i < Parent.ListDescriptors.Count; i++) @@ -1572,42 +1926,39 @@ public Instances CreateInstanceForNClasses(cInfoClass InfoClass) return data1; } + //public Instances CreateInstanceWithClass(List ListClassSelected) + //{ + // List AverageList = new List(); + // for (int i = 0; i < Parent.ListDescriptors.Count; i++) + // if (Parent.ListDescriptors[i].IsActive()) AverageList.Add(GetAverageValuesList(false)[i]); - public DataTable GetDescDataTable(bool OnlyActive) - { - DataTable TableToReturn = new DataTable(); - if (Parent.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.MEMORY) - { - List FullRes = new List(); + // weka.core.FastVector atts = new FastVector(); - for (int Desc = 0; Desc < this.Parent.ListDescriptors.Count; Desc++) - { - if ((this.Parent.ListDescriptors[Desc].IsActive()) && (!(this.Parent.ListDescriptors[Desc].DataType == eDataType.SINGLE))) - { - TableToReturn.Columns.Add(this.Parent.ListDescriptors[Desc].GetName(), typeof(double)); - FullRes.Add(this.ListDescriptors[Desc].GetOriginalValues()); - } + // List NameList = Parent.ListDescriptors.GetListNameActives(); - } - if (FullRes.Count == 0) return null; - for (int IdxRow = 0; IdxRow < FullRes[0].Length; IdxRow++) - { - TableToReturn.Rows.Add(); + // for (int i = 0; i < NameList.Count; i++) + // atts.addElement(new weka.core.Attribute(NameList[i])); - for (int IdxColumn = 0; IdxColumn < FullRes.Count; IdxColumn++) - TableToReturn.Rows[TableToReturn.Rows.Count - 1][IdxColumn] = FullRes[IdxColumn][IdxRow]; - } - } - else if (Parent.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.HD) - { - this.AssociatedPlate.DBConnection = new cDBConnection(AssociatedPlate, SQLTableName); - this.AssociatedPlate.DBConnection.AddWellToDataTable(this, TableToReturn, false, true); - this.AssociatedPlate.DBConnection.DB_CloseConnection(); - } - return TableToReturn; - } + // weka.core.FastVector attVals = new FastVector(); + + // for (int i = 0; i < InfoClass.NumberOfClass; i++) + // attVals.addElement("Class" + i); + + // atts.addElement(new weka.core.Attribute("Class", attVals)); + + // Instances InstancesToReturn = new Instances("SingleInstance", atts, 0); + // double[] newTable = new double[AverageList.Count + 1]; + // Array.Copy(AverageList.ToArray(), 0, newTable, 0, AverageList.Count); + // //newTable[AverageList.Count] = 1; + + // InstancesToReturn.add(new DenseInstance(1.0, newTable)); + // InstancesToReturn.setClassIndex((InstancesToReturn.numAttributes() - 1)); + // return InstancesToReturn; + + + //} } diff --git a/Classes/General/cWellClass.cs b/Classes/General/cWellClass.cs new file mode 100644 index 0000000..6a62ce4 --- /dev/null +++ b/Classes/General/cWellClass.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Windows.Forms; +using LibPlateAnalysis; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using System.Windows.Forms.DataVisualization.Charting; + +namespace HCSAnalyzer.Classes.General +{ + public class cWellClass : cGeneralComponent + { + public Color ColourForDisplay; + public string Name; + cGlobalInfo GlobalInfo; + int IdxClass = -1; + + public cWellClass(Color Colour, string Name, cGlobalInfo GlobalInfo) + { + this.ColourForDisplay = Colour; + this.Name = Name; + this.GlobalInfo = GlobalInfo; + + + + + } + + public ToolStripMenuItem GetExtendedContextMenu() + { + + #region Context Menu + base.SpecificContextMenu = new ToolStripMenuItem(this.Name); + + + ToolStripMenuItem ToolStripMenuItem_DisplayDescriptorEvolution = new ToolStripMenuItem("Descriptor evolution"); + ToolStripMenuItem_DisplayDescriptorEvolution.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayDescriptorEvolution); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayDescriptorEvolution); + + ToolStripMenuItem ToolStripMenuItem_DisplayDataTable = new ToolStripMenuItem("Display data table"); + ToolStripMenuItem_DisplayDataTable.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayDataTable); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayDataTable); + + ToolStripMenuItem ToolStripMenuItem_DisplayHistograms = new ToolStripMenuItem("Display histograms"); + ToolStripMenuItem_DisplayHistograms.Click += new System.EventHandler(this.ToolStripMenuItem_DisplayHistograms); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_DisplayHistograms); + + + + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + base.SpecificContextMenu.DropDownItems.Add(ToolStripSep); + + + ToolStripMenuItem ToolStripMenuItem_SetAsActivePlate = new ToolStripMenuItem("Set as active"); + ToolStripMenuItem_SetAsActivePlate.Click += new System.EventHandler(this.ToolStripMenuItem_SetAsActivePlate); + base.SpecificContextMenu.DropDownItems.Add(ToolStripMenuItem_SetAsActivePlate); + + #endregion + + return base.SpecificContextMenu; + + + } + + private void ToolStripMenuItem_SetAsActivePlate(object sender, EventArgs e) + { + int PosPlate = GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.FindStringExact(this.Name); + this.GlobalInfo.WindowHCSAnalyzer.comboBoxClass.Text = this.Name; + } + + private void ToolStripMenuItem_DisplayDescriptorEvolution(object sender, EventArgs e) + { + //int PosPlate = GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.FindStringExact(this.Name); + //this.GlobalInfo.WindowHCSAnalyzer.comboBoxClass.Text = this.Name; + } + + private void ToolStripMenuItem_DisplayHistograms(object sender, EventArgs e) + { + if (GlobalInfo == null) return; + for (int i = 0; i < GlobalInfo.ListWellClasses.Count; i++) + { + if (GlobalInfo.ListWellClasses[i].Name == this.Name) + { + IdxClass = i; + break; + } + } + + if (IdxClass == -1) return; + + if ((GlobalInfo.CurrentScreen.ListDescriptors == null) || (GlobalInfo.CurrentScreen.ListDescriptors.Count == 0)) return; + + cDisplayToWindow CDW1 = new cDisplayToWindow(); + + cListWell ListWellsToProcess = new cListWell(null); + List PlateList = new List(); + cDesignerSplitter DS = new cDesignerSplitter(); + + foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesActive) PlateList.Add(TmpPlate); + + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() == IdxClass) ListWellsToProcess.Add(item); + + cExtendedTable NewTable2 = ListWellsToProcess.GetDescriptorValues(GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable2.Name = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Histogram - " + PlateList.Count + " plates"; + + cViewerStackedHistogram CV2 = new cViewerStackedHistogram(); + CV2.SetInputData(NewTable2); + CV2.Chart.LabelAxisX = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV2.Chart.IsBorder = false; + CV2.Chart.Width = 0; + CV2.Chart.Height = 0; + + //StripLine AverageLine = new StripLine(); + //AverageLine.BackColor = Color.Red; + //AverageLine.IntervalOffset = GlobalInfo.CurrentScreen.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue(); + //AverageLine.StripWidth = 0.0001; + //AverageLine.Text = this.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue().ToString("N2"); + + CV2.Run(); + + //CV2.Chart.ChartAreas[0].AxisX.StripLines.Add(AverageLine); + + DS.SetInputData(CV2.GetOutPut()); + + + PlateList.Clear(); + PlateList.Add(GlobalInfo.CurrentScreen.GetCurrentDisplayPlate()); + ListWellsToProcess.Clear(); + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() == IdxClass) ListWellsToProcess.Add(item); + + CDW1.Title = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Histogram (" + PlateList[0].Name + ")"; + + cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable.Name = CDW1.Title; + + cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + CV1.SetInputData(NewTable); + CV1.Chart.LabelAxisX = GlobalInfo.CurrentScreen.ListDescriptors[GlobalInfo.CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV1.Chart.Width = 0; + CV1.Chart.Height = 0; + + // CV1.Chart.ChartAreas[0].AxisX.Minimum = CV2.Chart.ChartAreas[0].AxisX.Minimum; + // CV1.Chart.ChartAreas[0].AxisX.Maximum = CV2.Chart.ChartAreas[0].AxisX.Maximum; + CV1.Run(); + + // CV1.Chart.ChartAreas[0].AxisX.StripLines.Add(AverageLine); + DS.SetInputData(CV1.GetOutPut()); + DS.Run(); + + CDW1.SetInputData(DS.GetOutPut()); + CDW1.Run(); + CDW1.Display(); + + return; + } + + + private void ToolStripMenuItem_DisplayDataTable(object sender, EventArgs e) + { + if (GlobalInfo == null) return; + List ListWellsToProcess = new List(); + + for (int i = 0; i < GlobalInfo.ListWellClasses.Count; i++) + { + if (GlobalInfo.ListWellClasses[i].Name == this.Name) + { + IdxClass = i; + break; + } + } + + if (IdxClass == -1) return; + + foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesActive) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() ==IdxClass) ListWellsToProcess.Add(item); + + cExtendedTable DataFromPlate = new cExtendedTable(ListWellsToProcess, true); + DataFromPlate.Name = this.Name + " : " + ListWellsToProcess.Count + " wells"; + DataFromPlate.ListRowNames.Clear(); + + foreach (var item in ListWellsToProcess) + { + DataFromPlate.ListRowNames.Add(item.GetShortInfo()); + } + + cDisplayExtendedTable DEXT = new cDisplayExtendedTable(); + DEXT.Set_Data(DataFromPlate); + DEXT.Run(); + + + } + + } + +} diff --git a/Classes/Image/cImage.cs b/Classes/Image/cImage.cs deleted file mode 100644 index 36ac6dd..0000000 --- a/Classes/Image/cImage.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using FreeImageAPI; -using HCSAnalyzer.Forms.FormsForImages; -using System.Drawing; - -namespace HCSAnalyzer -{ - - - - public partial class cImage - { - - float[][] Data = null; - public int Width { get; private set;} - public int Height { get; private set; } - public int Depth { get; private set; } - public int NumChannels { get; private set; } - public int SliceSize { get; private set; } - public string Name; - - - #region Constructors - private cImage() - { - SliceSize = this.Width * this.Height; - } - - - public cImage(int Width, int Height, int Depth, int NumChannels) - { - this.NumChannels = NumChannels; - this.Width = Width; - this.Height = Height; - this.Depth = Depth; - - this.Data = new float[NumChannels][]; - for(int IdxChannel=0;IdxChannel max) max = f; + return max; + } + + + float[] Rescale(float[] input, float[] output, float minBound, float maxBound) + { + float min = Min(input), max = Max(input); + if (min == max) + { + for (int i = 0; i < input.Length; i++) output[i] = minBound; + + //Console.WriteLine("Rescale: input is constant and has been set to " + minBound); + } + else + for (int i = 0; i < input.Length; i++) + output[i] = ((maxBound - minBound) * (input[i] - min) / (max - min)) + minBound; + + return output; + } + + + cImage Rescale(cImage input, int inputChannel, cImage output, int outputChannel, float minBound, float maxBound) + { + float min = input.Data[inputChannel].Data.Min(); + float max = input.Data[inputChannel].Data.Max(); + if (min == max) + { + for (int i = 0; i < input.Height*input.Width; i++) output.Data[outputChannel].Data[i] = minBound; + } + else + for (int i = 0; i < input.Width*input.Height; i++) + output.Data[outputChannel].Data[i] = ((maxBound - minBound) * (input.Data[inputChannel].Data[i] - min) / (max - min)) + minBound; + + + return output; + } + + /// Rescales each band of the given image to [minBound,maxBound] + /// + /// the input image + /// the output image + /// the final minimum value + /// the final maximum value + //private cImage Rescale(cImage input, cImage output, float minBound, float maxBound) + //{ + // for (int band = 0; band < input.NumChannels; band++) Rescale(input.Data[band], output.Data[band], minBound, maxBound); + + //} + + + public int radius = 3; + public int HistoSize = 256; + public bool IsSliceBySliceRescaling = false; + public cImage input { get; private set;} + public cImage output { get; private set; } + + public int inputBand; + public int outputBand; + + + + /// + ///Median filter by Huang's method (C=O(r)) + ///!!! the image will be discretized according to HistoSize !!! + /// + ///input image + ///input channel + ///output image + ///output channel + ///filter radius + ///Histogram number of bins + ///false : 3D rescaling; true : slice by slice rescaling + public cImageFilterMedian(cImage input, int inputBand, cImage output, int outputBand) + { + this.input = input; + this.inputBand = inputBand; + this.output = output; + this.outputBand = outputBand; + + + } + + public void Run() + { + + + // first we have to convert the image with the right number of color + cImage RescaledInput = new cImage(input.Width, + input.Height, + input.Depth, + 1); + int[] Histo = new int[HistoSize]; + + Rescale(input, inputBand, RescaledInput, 0, 0, HistoSize - 1); + + float[] inp = RescaledInput.Data[0].Data; + float[] outp = output.Data[outputBand].Data; + int PosX, PosY; + + for (int depth = 0; depth < input.Depth; depth++) + { + int i, j, ki, kj; + + int Value = 0; + int IdxFinal = 0; + int Threshold = ((2 * radius + 1) * (2 * radius + 1)) / 2; + + #region main loop + for (j = 0; j < input.Height; j++) + { + for (int Idx = 0; Idx < HistoSize; Idx++) + Histo[Idx] = 0; + + for (kj = -radius; kj <= radius; kj++) + for (ki = -radius; ki <= radius; ki++) + { + PosX = ki; + if (PosX < 0) PosX = -PosX - 1; + else if (PosX >= input.Width) PosX = 2 * input.Width - PosX - 1; + PosY = kj + j; + if (PosY < 0) PosY = -PosY - 1; + else if (PosY >= input.Height) PosY = 2 * input.Height - PosY - 1; + + Histo[(int)inp[PosX + PosY * input.Width + depth * input.SliceSize]]++; + } + + Value = 0; + IdxFinal = 0; + while (Value < Threshold) + { + Value += Histo[IdxFinal]; + IdxFinal++; + } + outp[radius + 1 + j * input.Width + depth * input.SliceSize] = IdxFinal; + + + //for (i = 0; i < input.Width; i++) + for (i = 0; i < input.Width/* - (radius + 1)*/; i++) + { + // remove the first column + for (int Idx = -radius; Idx <= radius; Idx++) + { + PosX = i - radius - 1; + if (PosX < 0) PosX = -PosX - 1; + else if (PosX >= input.Width) PosX = 2 * input.Width - PosX - 1; + + PosY = j + Idx; + if (PosY < 0) PosY = -PosY - 1; + else if (PosY >= input.Height) PosY = 2 * input.Height - PosY - 1; + + Histo[(int)inp[PosX + PosY * input.Width + depth * input.SliceSize]]--; + } + // add the new column + for (int Idx = -radius; Idx <= radius; Idx++) + { + PosX = i + radius; + if (PosX < 0) PosX = -PosX - 1; + if (PosX >= input.Width) PosX = input.Width - (PosX - input.Width + 1); + + PosY = j + Idx; + if (PosY < 0) PosY = -PosY - 1; + if (PosY >= input.Height) PosY = 2 * input.Height - PosY - 1; + + Histo[(int)inp[PosX + PosY * input.Width + depth * input.SliceSize]]++; + } + Value = 0; + IdxFinal = 0; + while (Value < Threshold) + { + Value += Histo[IdxFinal]; + IdxFinal++; + } + //return; + outp[i + j * input.Width + depth * input.SliceSize] = IdxFinal; + + } + } + #endregion + } + + return; + } + + + + } + + public partial class cImageFilterConvolution : cImageFilter + { + + } + + public partial class cImageFilterGaussianBlur : cImageFilterConvolution + { + + double StdDev; + public cImage input { get; private set; } + public cImage output { get; private set; } + + public int inputBand; + public int outputBand; + + + public cImageFilterGaussianBlur(cImage input, int inputBand, cImage output, int outputBand, double StdDev) + { + this.StdDev = StdDev; + this.input = input; + this.inputBand = inputBand; + this.output = output; + this.outputBand = outputBand; + } + + public void Run() + { + //Matrix Signature1 = new Matrix(this.Count, 2); + //Matrix Signature2 = new Matrix(CompareTo.Count, 2); + + //for (int Idx = 0; Idx < this.Count; Idx++) + //{ + // Signature1[Idx, 0] = (float)this[Idx]; + // Signature1[Idx, 1] = Idx; + + // Signature2[Idx, 0] = (float)CompareTo[Idx]; + // Signature2[Idx, 1] = Idx; + //} + + //double ResutatEMD; + //ResutatEMD = CvInvoke.cvCalcEMD2(Signature1.Ptr, Signature2.Ptr, DIST_TYPE.CV_DIST_L1, null, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + + //Emgu.CV.Structure.MCvPoint2D64f + + // IntPtr SrcImage = CvInvoke.cvCreateImage( + + + // Matrix Src = new Matrix(input.Data[inputBand].Data.ToArray()); + + // Matrix Dst = new Matrix(output.Data[inputBand].Data.ToArray()); + // CvArray SRC = new + + //IntPtr Src = CvInvoke.cvCreateImageHeader(new Size(input.Width, input.Height), IPL_DEPTH.IPL_DEPTH_32F, 1); + //Src = Marshal.UnsafeAddrOfPinnedArrayElement(input.Data[inputBand].Data, 0); + //CvInvoke.image + + //ipl_image_p->imageData = my_float_image_data; + // ipl_image_p->imageDataOrigin = ipl_image_p->imageData; + + Image inputImage = new Image(input.Width,input.Height); + + //float[,] SrcArray = new float[input.Width, input.Height]; + for (int j = 0; j < input.Height; j++) + for (int i = 0; i < input.Width; i++) + { + inputImage.Data[j, i, 0] = input.Data[inputBand].Data[i + j * input.Width]; + } + + Image smoothedImage = new Image(inputImage.Width, inputImage.Height); + +// CvInvoke.cvSmooth(inputImage.Ptr, smoothedImage.Ptr, SMOOTH_TYPE.CV_MEDIAN, 5, 0, 0, 0); + CvInvoke.cvSobel(inputImage.Ptr, smoothedImage.Ptr, 2, 2, 2); + + + //CvInvoke.cvSmooth(smoothedImage.Ptr, smoothedImage.Ptr, SMOOTH_TYPE.CV_GAUSSIAN, 3, 0, 0, 0); + for (int j = 0; j < input.Height; j++) + for (int i = 0; i < input.Width; i++) + { + output.Data[outputBand].Data[i + j * output.Width] = smoothedImage.Data[j,i,0]; + } + + + + // float[,] DestArray = new float[output.Width,output.Height]; + // IntPtr MyintPtrDst = Marshal.UnsafeAddrOfPinnedArrayElement(DestArray, 0); + + + // CvInvoke.cvShowImage("Test", MyintPtr); + + + //CvInvoke.cvSmooth(MyintPtrSrc, MyintPtrDst, SMOOTH_TYPE.CV_GAUSSIAN, 0, 0, 3, 0); + + + //for (int j = 0; j < input.Height; j++) + // for (int i = 0; i < input.Width; i++) + // { + // output.Data[outputBand].Data[i + j * output.Width] = ; + // } + + + + // IntPtr Dest = CvInvoke.cvCreateMat(output.Width, output.Height, MAT_DEPTH.CV_32F); + + + + + + //Src.Width = input.Width; + + + + + + + //IntPtr ResImage = CvInvoke.cvCreateImage(new Size(output.Width, output.Height), IPL_DEPTH.IPL_DEPTH_32F, 1); + + //SrcImage = Marshal.UnsafeAddrOfPinnedArrayElement(input.Data[inputBand].Data, 0); + //ResImage = Marshal.UnsafeAddrOfPinnedArrayElement(output.Data[outputBand].Data, 0); + + + // Perform a Gaussian blur + //IntPtr widthPtr = new IntPtr(); + + // IntPtr inputPtr = Marshal.UnsafeAddrOfPinnedArrayElement(input.Data[inputBand].Data, 0); + // IntPtr outputPtr = Marshal.UnsafeAddrOfPinnedArrayElement(output.Data[outputBand].Data, 0); + + + // CvInvoke.cvSmooth(inputPtr ,outputPtr, SMOOTH_TYPE.CV_GAUSSIAN,0,0,3,3); + //cvSmooth( img, out, CV_GAUSSIAN, 11, 11 ); + + // Show the processed image + //CvInvoke.cvShowImage("Example3-out", out); + + + + // return ResutatEMD; + + + } + + } +} diff --git a/Classes/ImageAnalysis/cImage.cs b/Classes/ImageAnalysis/cImage.cs new file mode 100644 index 0000000..c49e4a0 --- /dev/null +++ b/Classes/ImageAnalysis/cImage.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FreeImageAPI; +using HCSAnalyzer.Forms.FormsForImages; +using System.Drawing; +using HCSAnalyzer.Classes; + +namespace ImageAnalysis +{ + public partial class cSingleChannelImage + { + public float[] Data; + + //public float Min { get; private set;} + //public float Max { get; private set;} + + public cSingleChannelImage(int ImageSize) + { + Data = new float[ImageSize]; + //this.Min = this.Data.Min(); + //this.Max = this.Data.Max(); + } + } + + + public partial class cImage + { + public List Data = new List(); + // public float[][] Data {get; private set;} + public int Width { get; private set;} + public int Height { get; private set; } + public int Depth { get; private set; } + public int NumChannels { get; private set; } + public int SliceSize { get; private set; } + public string Name; + + #region Constructors + private cImage() + { + SliceSize = this.Width * this.Height; + } + + public cImage(int Width, int Height, int Depth, int NumChannels) + { + this.NumChannels = NumChannels; + this.Width = Width; + this.Height = Height; + this.Depth = Depth; + this.SliceSize = this.Height * this.Width; + + this.Data = new List(); + for(int IdxChannel=0;IdxChannel(); + for (int IdxChannel = 0; IdxChannel < NumChannels; IdxChannel++) + this.Data[IdxChannel] = new cSingleChannelImage(Source.Width * Source.Height * Source.Depth); + } + //public Image CurrentMSImage; + + public cImage(string Path) + { + + this.Name = Path; + FreeImageAPI.FIMULTIBITMAP LoadedMultiPageImage = FreeImage.OpenMultiBitmap(FREE_IMAGE_FORMAT.FIF_TIFF, Path, false, true, true, FREE_IMAGE_LOAD_FLAGS.DEFAULT); + FreeImageAPI.FIBITMAP LoadedPage = FreeImage.LockPage(LoadedMultiPageImage,0); + FreeImageAPI.FIBITMAP LoadedImage = FreeImage.ConvertToStandardType(LoadedPage, true); + + this.Width = (int)FreeImage.GetWidth(LoadedImage); + this.Height = (int)FreeImage.GetHeight(LoadedImage); + this.SliceSize = this.Width * this.Height; + this.Depth = 1; + FreeImage.FlipVertical(LoadedImage); + + //Image CurrentMSImage = (Image)FreeImage.GetBitmap(LoadedImage); + FreeImageAPI.FIBITMAP Converted24Im = FreeImage.ConvertToGreyscale(LoadedImage); + + + IntPtr Pt = FreeImage.GetBits(LoadedImage); + + int bytes = Width*Height*3; + byte[] rgbValues = new byte[bytes]; + + // Copy the RGB values into the array. + System.Runtime.InteropServices.Marshal.Copy(Pt, rgbValues, 0,bytes); + + + //FormForImageDisplay NewDispl = new FormForImageDisplay(); + //NewDispl.pictureBoxForImage.Image = (Image)FreeImage.GetBitmap(LoadedImage); + //NewDispl.Show(); + + NumChannels = 3; + // this.Data = new float[this.NumChannels][]; + this.Data = new List(); + + int GlobalIdx = 0; + + + //cSingleChannelImage CI = new cSingleChannelImage(this.Width * this.Height * this.Depth); + //CI.Data[0] = 10; + for (int IdxChannel = 0; IdxChannel < NumChannels; IdxChannel++) + this.Data.Add(new cSingleChannelImage(this.Width * this.Height * this.Depth)); + + + for (int IdxY = 0; IdxY < this.Height; IdxY++) + for (int IdxX = 0; IdxX < this.Width; IdxX++) + { + for (int IdxChannel = 0; IdxChannel < NumChannels; IdxChannel++) + this.Data[IdxChannel].Data[IdxX + IdxY * this.Width] = rgbValues[GlobalIdx++]; + } + + //if (LoadedImage.IsNull) return; + + } + #endregion + } + + + + +} diff --git a/Classes/Image/cImageViewer.cs b/Classes/ImageAnalysis/cImageViewer.cs similarity index 56% rename from Classes/Image/cImageViewer.cs rename to Classes/ImageAnalysis/cImageViewer.cs index 41303af..4d12e8f 100644 --- a/Classes/Image/cImageViewer.cs +++ b/Classes/ImageAnalysis/cImageViewer.cs @@ -6,97 +6,84 @@ using System.Drawing; using System.Windows.Forms; using HCSAnalyzer.ObjectForNotations; +using ImageAnalysis; +using HCSAnalyzer.Classes; namespace HCSAnalyzer { public class cImageViewer : FormForImageDisplay { - public cImage AssociatedImage; public Timer timerForDisplay; // private System.ComponentModel.IContainer components; - public List ListObjectForNotations = new List(); - - - Graphics ThisGraph; - - public void DrawPic() - { - - ThisGraph = panelForImage.CreateGraphics(); - ThisGraph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; - ThisGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; - ThisGraph.DrawImage(AssociatedImage.CurrentMSImage, new Point(0, 0)); - - // ThisGraph.Clear(Color.White); - //NewWindow.pictureBoxForImage.Image = (Image)images[(int)NewWindow.numericUpDownIdxImage.Value]; - //Graphics bmG = Graphics.FromImage((Image)images[(int)NewWindow.numericUpDownIdxImage.Value]); - //ThisGraph.DrawImage((Image)images[(int)NewWindow.numericUpDownIdxImage.Value], new Point(0, 0)); - - //foreach (cObjectForAnnotation TmpObj in ListObjectForNotations) - //{ - // if (TmpObj.GetType() == typeof(cString)) - // ThisGraph.DrawString(((cString)TmpObj).Text, new Font(FontFamily.GenericSansSerif, ((cString)TmpObj).Size), new SolidBrush(((cString)TmpObj).ObjectColor), ((cString)TmpObj).PosX, ((cString)TmpObj).PosY); - - // if (TmpObj.GetType() == typeof(cDisk)) - // ThisGraph.FillEllipse(new SolidBrush(((cDisk)TmpObj).ObjectColor), ((cDisk)TmpObj).PosX, ((cDisk)TmpObj).PosY, ((cDisk)TmpObj).Size / 2, ((cDisk)TmpObj).Size / 2); - //} - DrawLayers(); - } - - public void DrawLayers() - { - // ThisGraph = panelForImage.CreateGraphics(); - foreach (cObjectForAnnotation TmpObj in ListObjectForNotations) - { - if (TmpObj.GetType() == typeof(cString)) - ThisGraph.DrawString(((cString)TmpObj).Text, new Font(FontFamily.GenericSansSerif, ((cString)TmpObj).Size), new SolidBrush(((cString)TmpObj).ObjectColor), ((cString)TmpObj).PosX, ((cString)TmpObj).PosY); - - if (TmpObj.GetType() == typeof(cDisk)) - ThisGraph.FillEllipse(new SolidBrush(((cDisk)TmpObj).ObjectColor), ((cDisk)TmpObj).PosX, ((cDisk)TmpObj).PosY, ((cDisk)TmpObj).Size / 2, ((cDisk)TmpObj).Size / 2); - } - } - - private void panelForImage_Paint(object sender, PaintEventArgs e) - { - DrawPic(); - } - - public void Display() - { - - this.Paint += new System.Windows.Forms.PaintEventHandler(this.panelForImage_Paint); + public void Display(cGlobalInfo GlobalInfo) + { + // this.Paint += new System.Windows.Forms.PaintEventHandler(this.panelForImage_Paint); + // this.Scroll += new ScrollEventHandler(cImageViewer_Scroll); + // this.MouseMove += new MouseEventHandler(panelForImage_MouseMove); //this.timerForDisplay = new Timer(); //this.timerForDisplay.Tick += new EventHandler(timerForDisplay_Tick); //this.timerForDisplay.Interval = (1000) * (1); // Timer will tick evert second //this.timerForDisplay.Enabled = true; // Enable the timer //this.timerForDisplay.Start(); // Start the timer - - - this.Width = AssociatedImage.Width + 20; - this.Height = AssociatedImage.Height + 40; + // base.panelForImage.Width = AssociatedImage.Width; + // base.panelForImage.Height = AssociatedImage.Height; + this.GlobalInfo = GlobalInfo; + this.Width = AssociatedImage.Width + 40; + this.Height = AssociatedImage.Height + statusStripForImageViewer.Height + 60; + this.panelForImage.Width = AssociatedImage.Width; + this.panelForImage.Height = AssociatedImage.Height; + this.ViewDimX = AssociatedImage.Width; + this.ViewDimY = AssociatedImage.Height; + this.Show(); } - - public cImageViewer() - { - } - + public void SetImage(cImage Image) { + // base.Width = 1000; this.AssociatedImage = Image; this.Text = Image.Name; - } + this.LUTManager = new FormForLUTManager(this); + + for (int IdxLUT = 0; IdxLUT < this.AssociatedImage.NumChannels; IdxLUT++) + { + UserControlSingleLUT SingleLUT = new UserControlSingleLUT(this); + SingleLUT.Location = new Point(0, IdxLUT * SingleLUT.Height); + this.LUTManager.panelForLUTS.Controls.Add(SingleLUT); + } + + } public void AddNotation(cObjectForAnnotation ObjectForNotation) { this.ListObjectForNotations.Add(ObjectForNotation); } + private void InitializeComponent() + { + this.SuspendLayout(); + // + // panelForImage + // + //this.panelForImage.Size = new System.Drawing.Size(657, 393); + // + // panelForInfo + // + //this.panelForInfo.Size = new System.Drawing.Size(657, 96); + // + // cImageViewer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.ClientSize = new System.Drawing.Size(681, 519); + this.Name = "cImageViewer"; + this.ResumeLayout(false); + + } //void timerForDisplay_Tick(object sender, EventArgs e) //{ @@ -136,8 +123,7 @@ public void AddNotation(cObjectForAnnotation ObjectForNotation) // this.ResumeLayout(false); //} - - + } } diff --git a/Classes/Image/cImageViewer.resx b/Classes/ImageAnalysis/cImageViewer.resx similarity index 96% rename from Classes/Image/cImageViewer.resx rename to Classes/ImageAnalysis/cImageViewer.resx index 10c2bb7..1af7de1 100644 --- a/Classes/Image/cImageViewer.resx +++ b/Classes/ImageAnalysis/cImageViewer.resx @@ -117,7 +117,4 @@ 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/Classes/Machine Learning/ClassForOptions/Children/cBasicValueType.cs b/Classes/Machine Learning/ClassForOptions/Children/cBasicValueType.cs new file mode 100644 index 0000000..a1d7d24 --- /dev/null +++ b/Classes/Machine Learning/ClassForOptions/Children/cBasicValueType.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Windows.Controls; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children +{ + public abstract class cGeneralValue + { + public string Name; + + public cGeneralValue(string Name) + { + this.Name = Name; + } + } + + + + [Serializable] + public class cCheckValue : cGeneralValue + { + public bool Value; + + public cCheckValue(bool Value, string Name) : base(Name) + { + this.Value = Value; + } + } + + [Serializable] + public class cColorValue : cGeneralValue + { + public Color Value; + + public cColorValue(Color Value, string Name) + : base(Name) + { + this.Value = Value; + } + } + + [Serializable] + public class cDoubleValue : cGeneralValue + { + public double Value; + + public cDoubleValue(double Value, string Name) + : base(Name) + { + this.Value = Value; + } + } + + [Serializable] + public class cTextValue : cGeneralValue + { + public string Value; + + public cTextValue(string Value, string Name) + : base(Name) + { + this.Value = Value; + } + } + + public class cListViewValue : cGeneralValue + { + public System.Windows.Controls.ListView Value; + + public cListViewValue(System.Windows.Controls.ListView Value, string Name) + : base(Name) + { + this.Value = Value; + } + } +} diff --git a/Classes/Machine Learning/ClassForOptions/Children/cOptions.cs b/Classes/Machine Learning/ClassForOptions/Children/cOptions.cs new file mode 100644 index 0000000..f763713 --- /dev/null +++ b/Classes/Machine Learning/ClassForOptions/Children/cOptions.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Forms.FormsForOptions.PanelForOptions; +using System.Windows.Forms; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children +{ + #region Parent Class + [Serializable] + public abstract class cOptionGeneral + { + public List ListDoubleValues = new List(); + public List ListCheckValues = new List(); + public List ListColorValues = new List(); + public List ListTextValues = new List(); + + protected Panel PanelToDisplay; + public string Name; + + public Panel GetPanel() + { + PanelToDisplay.Location = new System.Drawing.Point(0, 0); + return PanelToDisplay; + } + + public cOptionGeneral(string Name) + { + this.Name = Name; + } + + protected void InitValues() + { + foreach (Control ctl in PanelToDisplay.Controls) + { + Type CtlType = ctl.GetType(); + + if (CtlType == typeof(CheckBox)) + { + cCheckValue NewValue = new cCheckValue(((CheckBox)ctl).Checked, ctl.Name); + this.ListCheckValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(RadioButton)) + { + cCheckValue NewValue = new cCheckValue(((RadioButton)ctl).Checked, ctl.Name); + this.ListCheckValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(NumericUpDown)) + { + cDoubleValue NewValue = new cDoubleValue((double)((NumericUpDown)ctl).Value, ctl.Name); + this.ListDoubleValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(TextBox)) + { + cTextValue NewValue = new cTextValue(((TextBox)ctl).Text, ctl.Name); + this.ListTextValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(Panel)) + { + cColorValue NewValue = new cColorValue(((Panel)ctl).BackColor, ctl.Name); + this.ListColorValues.Add(NewValue); + ctl.Tag = NewValue; + } + } + } + } + #endregion + + #region child classes + [Serializable] + public class cOption3D : cOptionGeneral + { + public cOption3D(string Name) + : base(Name) + { + PanelForOptions3D PanelForOption = new PanelForOptions3D(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cOptionDisplayPlatesandWells : cOptionGeneral + { + public cOptionDisplayPlatesandWells (string Name) + : base(Name) + { + PanelForPlatesandWells PanelForOption = new PanelForPlatesandWells(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cOptionWellClassesColor : cOptionGeneral + { + public cOptionWellClassesColor(string Name, cGlobalInfo GlobalInfo) + : base(Name) + { + PanelForWellClassesColor PanelForOption = new PanelForWellClassesColor(GlobalInfo); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cOptionCellularPhenotypesColor : cOptionGeneral + { + public cOptionCellularPhenotypesColor(string Name, cGlobalInfo GlobalInfo) + : base(Name) + { + PanelForCellularPhenotypesColor PanelForOption = new PanelForCellularPhenotypesColor(GlobalInfo); + this.PanelToDisplay = PanelForOption.panel; + } + } + + + #endregion +} diff --git a/Classes/Machine Learning/ClassForOptions/cListOptions.cs b/Classes/Machine Learning/ClassForOptions/cListOptions.cs new file mode 100644 index 0000000..110da3e --- /dev/null +++ b/Classes/Machine Learning/ClassForOptions/cListOptions.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using System.Windows.Forms; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassForOptions +{ + [Serializable] + public class cListOptions : List + { + public cListOptions(cGlobalInfo GlobalInfo) + { + this.Add(new cOption3D("3D")); + this.Add(new cOptionDisplayPlatesandWells("Plates and Wells")); + this.Add(new cOptionWellClassesColor("Well Classes", GlobalInfo)); + this.Add(new cOptionCellularPhenotypesColor("Cellular Phenotypes", GlobalInfo)); + } + + public Panel GetPanel(string Name) + { + if (Name == null) return null; + + foreach (var item in this) + if (item.Name == Name) return item.GetPanel(); + + return null; + } + + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.Designer.cs b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.Designer.cs new file mode 100644 index 0000000..469c0ff --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.Designer.cs @@ -0,0 +1,212 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class FormForClassificationInfo + { + /// + /// 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(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("J48"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Random Forest"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Random Tree"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Trees", new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3}); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("K*"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("KNN"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Lazy", new System.Windows.Forms.TreeNode[] { + treeNode5, + treeNode6}); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("SVM"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("Perceptron"); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("Functions", new System.Windows.Forms.TreeNode[] { + treeNode8, + treeNode9}); + System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("ZeroR"); + System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("OneR"); + System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("Rules", new System.Windows.Forms.TreeNode[] { + treeNode11, + treeNode12}); + System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("Naive Bayes"); + System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("Bayes", new System.Windows.Forms.TreeNode[] { + treeNode14}); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForClassificationInfo)); + this.richTextBoxForInfo = new System.Windows.Forms.RichTextBox(); + this.panelForDisplay = new System.Windows.Forms.Panel(); + this.treeViewForOptions = new System.Windows.Forms.TreeView(); + this.buttonOK = new System.Windows.Forms.Button(); + this.checkBoxCrossValidation = new System.Windows.Forms.CheckBox(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.numericUpDownFoldNumber = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFoldNumber)).BeginInit(); + this.SuspendLayout(); + // + // richTextBoxForInfo + // + this.richTextBoxForInfo.Anchor = System.Windows.Forms.AnchorStyles.None; + this.richTextBoxForInfo.Location = new System.Drawing.Point(8, 290); + this.richTextBoxForInfo.Name = "richTextBoxForInfo"; + this.richTextBoxForInfo.ReadOnly = true; + this.richTextBoxForInfo.Size = new System.Drawing.Size(446, 81); + this.richTextBoxForInfo.TabIndex = 11; + this.richTextBoxForInfo.Text = ""; + // + // panelForDisplay + // + this.panelForDisplay.AutoScroll = true; + this.panelForDisplay.Location = new System.Drawing.Point(188, 9); + this.panelForDisplay.Name = "panelForDisplay"; + this.panelForDisplay.Size = new System.Drawing.Size(266, 276); + this.panelForDisplay.TabIndex = 10; + // + // treeViewForOptions + // + this.treeViewForOptions.Location = new System.Drawing.Point(8, 9); + this.treeViewForOptions.Name = "treeViewForOptions"; + treeNode1.Name = "Node0"; + treeNode1.Tag = "J48"; + treeNode1.Text = "J48"; + treeNode2.Name = "Node0"; + treeNode2.Tag = "RandomForest"; + treeNode2.Text = "Random Forest"; + treeNode3.Name = "Node0"; + treeNode3.Tag = "RandomTree"; + treeNode3.Text = "Random Tree"; + treeNode4.Name = "Node1"; + treeNode4.Text = "Trees"; + treeNode5.Name = "Node3"; + treeNode5.Tag = "KStar"; + treeNode5.Text = "K*"; + treeNode6.Name = "Node1"; + treeNode6.Tag = "KNN"; + treeNode6.Text = "KNN"; + treeNode7.Name = "Node2"; + treeNode7.Text = "Lazy"; + treeNode8.Name = "Node2"; + treeNode8.Tag = "SVM"; + treeNode8.Text = "SVM"; + treeNode9.Name = "Node3"; + treeNode9.Tag = "Perceptron"; + treeNode9.Text = "Perceptron"; + treeNode10.Name = "Node0"; + treeNode10.Text = "Functions"; + treeNode11.Name = "Node0"; + treeNode11.Tag = "ZeroR"; + treeNode11.Text = "ZeroR"; + treeNode12.Name = "Node1"; + treeNode12.Tag = "OneR"; + treeNode12.Text = "OneR"; + treeNode13.Name = "Node0"; + treeNode13.Tag = ""; + treeNode13.Text = "Rules"; + treeNode14.Name = "Node1"; + treeNode14.Tag = "NaiveBayes"; + treeNode14.Text = "Naive Bayes"; + treeNode15.Name = "Node0"; + treeNode15.Text = "Bayes"; + this.treeViewForOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode4, + treeNode7, + treeNode10, + treeNode13, + treeNode15}); + this.treeViewForOptions.Size = new System.Drawing.Size(174, 276); + this.treeViewForOptions.TabIndex = 9; + this.treeViewForOptions.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewForOptions_AfterSelect); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(381, 379); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 8; + this.buttonOK.Text = "Ok"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // checkBoxCrossValidation + // + this.checkBoxCrossValidation.AutoSize = true; + this.checkBoxCrossValidation.Checked = true; + this.checkBoxCrossValidation.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxCrossValidation.Location = new System.Drawing.Point(8, 379); + this.checkBoxCrossValidation.Name = "checkBoxCrossValidation"; + this.checkBoxCrossValidation.Size = new System.Drawing.Size(101, 17); + this.checkBoxCrossValidation.TabIndex = 12; + this.checkBoxCrossValidation.Text = "Cross Validation"; + this.toolTip.SetToolTip(this.checkBoxCrossValidation, "Perform cross validation of the model"); + this.checkBoxCrossValidation.UseVisualStyleBackColor = true; + this.checkBoxCrossValidation.CheckedChanged += new System.EventHandler(this.checkBoxCrossValidation_CheckedChanged); + // + // numericUpDownFoldNumber + // + this.numericUpDownFoldNumber.Location = new System.Drawing.Point(115, 377); + this.numericUpDownFoldNumber.Name = "numericUpDownFoldNumber"; + this.numericUpDownFoldNumber.Size = new System.Drawing.Size(65, 20); + this.numericUpDownFoldNumber.TabIndex = 13; + this.toolTip.SetToolTip(this.numericUpDownFoldNumber, "Fold number for K-folds cross validation"); + this.numericUpDownFoldNumber.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // FormForClassificationInfo + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(461, 407); + this.Controls.Add(this.numericUpDownFoldNumber); + this.Controls.Add(this.checkBoxCrossValidation); + this.Controls.Add(this.richTextBoxForInfo); + this.Controls.Add(this.panelForDisplay); + this.Controls.Add(this.treeViewForOptions); + this.Controls.Add(this.buttonOK); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForClassificationInfo"; + this.Text = "Classification parameters"; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFoldNumber)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RichTextBox richTextBoxForInfo; + private System.Windows.Forms.Panel panelForDisplay; + public System.Windows.Forms.TreeView treeViewForOptions; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.CheckBox checkBoxCrossValidation; + private System.Windows.Forms.ToolTip toolTip; + public System.Windows.Forms.NumericUpDown numericUpDownFoldNumber; + } +} \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.cs b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.cs new file mode 100644 index 0000000..21d6cc4 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using weka.classifiers.functions.supportVector; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + + public partial class FormForClassificationInfo : Form + { + cGlobalInfo GlobalInfo; + cListClassificationAlgo ListClassificationAlgo = null; + public Kernel GeneratedKernel; + + public FormForClassificationInfo(cGlobalInfo GlobalInfo) + { + InitializeComponent(); + this.GlobalInfo = GlobalInfo; + this.GeneratedKernel = new RBFKernel(); + ((RBFKernel)this.GeneratedKernel).setGamma(1.0); + ListClassificationAlgo = new cListClassificationAlgo(this); + + this.treeViewForOptions.ExpandAll(); + this.treeViewForOptions.SelectedNode = this.treeViewForOptions.Nodes[0].Nodes[0]; + + this.treeViewForOptions.SelectedNode.EnsureVisible(); //scroll if necessary + this.treeViewForOptions.SelectedNode.Checked = true; + // this.treeViewForOptions.Focus(); + } + + private void treeViewForOptions_AfterSelect(object sender, TreeViewEventArgs e) + { + this.panelForDisplay.Controls.Clear(); + string TagName = (string)e.Node.Tag; + if (TagName == null) return; + Panel PanelToDisp = ListClassificationAlgo.GetPanel(TagName); + if (PanelToDisp == null) return; + this.panelForDisplay.Controls.Add(PanelToDisp); + + if (TagName == "J48") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("J48 (C4.5)\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/C4.5_algorithm"); + } + else if (TagName == "RandomForest") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Random Forest\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Random_forest"); + } + else if (TagName == "RandomTree") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Random Tree\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Random_forest"); + } + else if (TagName == "KStar") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("K*\n------------------------------------------------------\nFor more information, go to: http://wiki.pentaho.com/display/DATAMINING/KStar"); + } + else if (TagName == "SVM") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("SVM (Support Vector Machine)\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Support_vector_machine"); + } + else if (TagName == "KNN") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("KNN\n------------------------------------------------------\nK-nearest neighbours classifier. Can select appropriate value of K based on cross-validation. Can also do distance weighting.\nFor more information, go to: http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm"); + } + else if (TagName == "Perceptron") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Multilayer Perceptron\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Multilayer_perceptron"); + } + else if (TagName == "ZeroR") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Zero R(ule) classifier\n------------------------------------------------------\nFor more information, go to: http://weka.wikispaces.com/ZeroR"); + } + else if (TagName == "OneR") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("One R(ule) classifier\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Decision_stump"); + } + else if (TagName == "NaiveBayes") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Naive Bayes classifier\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Naive_Bayes_classifier"); + } + } + + public cParamAlgo GetSelectedAlgoAndParameters() + { + cParamAlgo ToReturn = ListClassificationAlgo.GetListParams((string)treeViewForOptions.SelectedNode.Tag); + return ToReturn; + } + + private void richTextBoxForInfo_LinkClicked(object sender, LinkClickedEventArgs e) + { + GlobalInfo.WindowHCSAnalyzer.ClickOnLink(e.LinkText); + } + + private void checkBoxCrossValidation_CheckedChanged(object sender, EventArgs e) + { + numericUpDownFoldNumber.Enabled = checkBoxCrossValidation.Checked; + } + + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.resx b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.resx new file mode 100644 index 0000000..c38c783 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForClassificationInfo.resx @@ -0,0 +1,1790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.Designer.cs b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.Designer.cs new file mode 100644 index 0000000..a0a8a9e --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.Designer.cs @@ -0,0 +1,303 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class FormForKernelEditor + { + /// + /// 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(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForKernelEditor)); + this.buttonOk = new System.Windows.Forms.Button(); + this.groupBoxPolyKernel = new System.Windows.Forms.GroupBox(); + this.numericUpDownPolyExponent = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.radioButtonPolyKernel = new System.Windows.Forms.RadioButton(); + this.radioButtonPearson = new System.Windows.Forms.RadioButton(); + this.groupBoxPearson = new System.Windows.Forms.GroupBox(); + this.numericUpDownPearsonSigma = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownPearsonOmega = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.radioButtonRBF = new System.Windows.Forms.RadioButton(); + this.groupBoxRBF = new System.Windows.Forms.GroupBox(); + this.numericUpDownRBFGamma = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBoxPolyKernel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPolyExponent)).BeginInit(); + this.groupBoxPearson.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPearsonSigma)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPearsonOmega)).BeginInit(); + this.groupBoxRBF.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRBFGamma)).BeginInit(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(160, 251); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click); + // + // groupBoxPolyKernel + // + this.groupBoxPolyKernel.Controls.Add(this.numericUpDownPolyExponent); + this.groupBoxPolyKernel.Controls.Add(this.label4); + this.groupBoxPolyKernel.Location = new System.Drawing.Point(49, 8); + this.groupBoxPolyKernel.Name = "groupBoxPolyKernel"; + this.groupBoxPolyKernel.Size = new System.Drawing.Size(186, 66); + this.groupBoxPolyKernel.TabIndex = 1; + this.groupBoxPolyKernel.TabStop = false; + this.groupBoxPolyKernel.Text = "Polynomial"; + this.toolTip.SetToolTip(this.groupBoxPolyKernel, "K(x, y) = ^p"); + // + // numericUpDownPolyExponent + // + this.numericUpDownPolyExponent.DecimalPlaces = 1; + this.numericUpDownPolyExponent.Location = new System.Drawing.Point(83, 27); + this.numericUpDownPolyExponent.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownPolyExponent.Name = "numericUpDownPolyExponent"; + this.numericUpDownPolyExponent.Size = new System.Drawing.Size(92, 20); + this.numericUpDownPolyExponent.TabIndex = 3; + this.numericUpDownPolyExponent.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(16, 29); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(52, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Exponent"; + // + // radioButtonPolyKernel + // + this.radioButtonPolyKernel.AutoSize = true; + this.radioButtonPolyKernel.Checked = true; + this.radioButtonPolyKernel.Location = new System.Drawing.Point(23, 37); + this.radioButtonPolyKernel.Name = "radioButtonPolyKernel"; + this.radioButtonPolyKernel.Size = new System.Drawing.Size(14, 13); + this.radioButtonPolyKernel.TabIndex = 2; + this.radioButtonPolyKernel.TabStop = true; + this.toolTip.SetToolTip(this.radioButtonPolyKernel, "K(x, y) = ^p"); + this.radioButtonPolyKernel.UseVisualStyleBackColor = true; + this.radioButtonPolyKernel.CheckedChanged += new System.EventHandler(this.radioButtonPolyKernel_CheckedChanged); + // + // radioButtonPearson + // + this.radioButtonPearson.AutoSize = true; + this.radioButtonPearson.Location = new System.Drawing.Point(23, 116); + this.radioButtonPearson.Name = "radioButtonPearson"; + this.radioButtonPearson.Size = new System.Drawing.Size(14, 13); + this.radioButtonPearson.TabIndex = 4; + this.toolTip.SetToolTip(this.radioButtonPearson, "Pearson VII function-based universal kernel."); + this.radioButtonPearson.UseVisualStyleBackColor = true; + this.radioButtonPearson.CheckedChanged += new System.EventHandler(this.radioButtonPearson_CheckedChanged); + // + // groupBoxPearson + // + this.groupBoxPearson.Controls.Add(this.numericUpDownPearsonSigma); + this.groupBoxPearson.Controls.Add(this.label3); + this.groupBoxPearson.Controls.Add(this.numericUpDownPearsonOmega); + this.groupBoxPearson.Controls.Add(this.label2); + this.groupBoxPearson.Enabled = false; + this.groupBoxPearson.Location = new System.Drawing.Point(49, 80); + this.groupBoxPearson.Name = "groupBoxPearson"; + this.groupBoxPearson.Size = new System.Drawing.Size(186, 87); + this.groupBoxPearson.TabIndex = 3; + this.groupBoxPearson.TabStop = false; + this.groupBoxPearson.Text = "Pearson VII"; + this.toolTip.SetToolTip(this.groupBoxPearson, "Pearson VII function-based universal kernel."); + // + // numericUpDownPearsonSigma + // + this.numericUpDownPearsonSigma.DecimalPlaces = 1; + this.numericUpDownPearsonSigma.Location = new System.Drawing.Point(88, 51); + this.numericUpDownPearsonSigma.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownPearsonSigma.Name = "numericUpDownPearsonSigma"; + this.numericUpDownPearsonSigma.Size = new System.Drawing.Size(92, 20); + this.numericUpDownPearsonSigma.TabIndex = 5; + this.numericUpDownPearsonSigma.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(21, 53); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(36, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Sigma"; + // + // numericUpDownPearsonOmega + // + this.numericUpDownPearsonOmega.DecimalPlaces = 1; + this.numericUpDownPearsonOmega.Location = new System.Drawing.Point(88, 23); + this.numericUpDownPearsonOmega.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownPearsonOmega.Name = "numericUpDownPearsonOmega"; + this.numericUpDownPearsonOmega.Size = new System.Drawing.Size(92, 20); + this.numericUpDownPearsonOmega.TabIndex = 3; + this.numericUpDownPearsonOmega.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(21, 25); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(43, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Gamma"; + // + // radioButtonRBF + // + this.radioButtonRBF.AutoSize = true; + this.radioButtonRBF.Location = new System.Drawing.Point(23, 203); + this.radioButtonRBF.Name = "radioButtonRBF"; + this.radioButtonRBF.Size = new System.Drawing.Size(14, 13); + this.radioButtonRBF.TabIndex = 6; + this.toolTip.SetToolTip(this.radioButtonRBF, "K(x, y) = e^-(gamma * ^2)"); + this.radioButtonRBF.UseVisualStyleBackColor = true; + this.radioButtonRBF.CheckedChanged += new System.EventHandler(this.radioButtonRBF_CheckedChanged); + // + // groupBoxRBF + // + this.groupBoxRBF.Controls.Add(this.numericUpDownRBFGamma); + this.groupBoxRBF.Controls.Add(this.label1); + this.groupBoxRBF.Enabled = false; + this.groupBoxRBF.Location = new System.Drawing.Point(49, 173); + this.groupBoxRBF.Name = "groupBoxRBF"; + this.groupBoxRBF.Size = new System.Drawing.Size(186, 72); + this.groupBoxRBF.TabIndex = 5; + this.groupBoxRBF.TabStop = false; + this.groupBoxRBF.Text = "Radial Basis Function"; + this.toolTip.SetToolTip(this.groupBoxRBF, "K(x, y) = e^-(gamma * ^2)"); + // + // numericUpDownRBFGamma + // + this.numericUpDownRBFGamma.DecimalPlaces = 2; + this.numericUpDownRBFGamma.Location = new System.Drawing.Point(83, 30); + this.numericUpDownRBFGamma.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDownRBFGamma.Name = "numericUpDownRBFGamma"; + this.numericUpDownRBFGamma.Size = new System.Drawing.Size(92, 20); + this.numericUpDownRBFGamma.TabIndex = 1; + this.numericUpDownRBFGamma.Value = new decimal(new int[] { + 1, + 0, + 0, + 131072}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(16, 32); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(43, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Gamma"; + // + // FormForKernelEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(241, 280); + this.Controls.Add(this.radioButtonRBF); + this.Controls.Add(this.groupBoxRBF); + this.Controls.Add(this.radioButtonPearson); + this.Controls.Add(this.radioButtonPolyKernel); + this.Controls.Add(this.groupBoxPearson); + this.Controls.Add(this.groupBoxPolyKernel); + this.Controls.Add(this.buttonOk); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForKernelEditor"; + this.Text = "Kernel Editor"; + this.groupBoxPolyKernel.ResumeLayout(false); + this.groupBoxPolyKernel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPolyExponent)).EndInit(); + this.groupBoxPearson.ResumeLayout(false); + this.groupBoxPearson.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPearsonSigma)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPearsonOmega)).EndInit(); + this.groupBoxRBF.ResumeLayout(false); + this.groupBoxRBF.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRBFGamma)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.GroupBox groupBoxPolyKernel; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.RadioButton radioButtonPolyKernel; + private System.Windows.Forms.RadioButton radioButtonPearson; + private System.Windows.Forms.GroupBox groupBoxPearson; + private System.Windows.Forms.RadioButton radioButtonRBF; + private System.Windows.Forms.NumericUpDown numericUpDownPearsonOmega; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numericUpDownRBFGamma; + private System.Windows.Forms.GroupBox groupBoxRBF; + private System.Windows.Forms.NumericUpDown numericUpDownPearsonSigma; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.NumericUpDown numericUpDownPolyExponent; + private System.Windows.Forms.Label label4; + } +} \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.cs b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.cs new file mode 100644 index 0000000..9619651 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using weka.classifiers.functions.supportVector; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class FormForKernelEditor : Form + { + public FormForKernelEditor() + { + InitializeComponent(); + GeneratedKernel = new PolyKernel(); + ((PolyKernel)GeneratedKernel).setExponent((double)this.numericUpDownPolyExponent.Value); + } + + void updateUI() + { + groupBoxPolyKernel.Enabled = radioButtonPolyKernel.Checked; + groupBoxPearson.Enabled = radioButtonPearson.Checked; + groupBoxRBF.Enabled = radioButtonRBF.Checked; + } + + private void radioButtonPolyKernel_CheckedChanged(object sender, EventArgs e) + { + updateUI(); + } + + private void radioButtonRBF_CheckedChanged(object sender, EventArgs e) + { + updateUI(); + } + + private void radioButtonPearson_CheckedChanged(object sender, EventArgs e) + { + updateUI(); + } + + public Kernel GeneratedKernel = null; + + private void buttonOk_Click(object sender, EventArgs e) + { + if (this.radioButtonRBF.Checked) + { + RBFKernel MyGeneratedKernel = new RBFKernel(); + ((RBFKernel)MyGeneratedKernel).setGamma((double)this.numericUpDownRBFGamma.Value); + GeneratedKernel = (Kernel)(MyGeneratedKernel); + } + if (this.radioButtonPearson.Checked) + { + Puk MyGeneratedKernel = new Puk(); + ((Puk)MyGeneratedKernel).setSigma((double)this.numericUpDownPearsonSigma.Value); + ((Puk)MyGeneratedKernel).setOmega((double)this.numericUpDownPearsonOmega.Value); + GeneratedKernel = (Kernel)(MyGeneratedKernel); + } + if (this.radioButtonPolyKernel.Checked) + { + PolyKernel MyGeneratedKernel = new PolyKernel(); + MyGeneratedKernel.setExponent((double)this.numericUpDownPolyExponent.Value); + GeneratedKernel = (Kernel)(MyGeneratedKernel); + } + + } + + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.resx b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.resx new file mode 100644 index 0000000..c38c783 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/FormForKernelEditor.resx @@ -0,0 +1,1790 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.Designer.cs new file mode 100644 index 0000000..f6d7ea6 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.Designer.cs @@ -0,0 +1,268 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + partial class PanelForParamJ48 + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownSeedNumber = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBoxLaplacianSmoothing = new System.Windows.Forms.CheckBox(); + this.checkBoxUnPruned = new System.Windows.Forms.CheckBox(); + this.numericUpDownNumFolds = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownConfFactor = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMinInstLeaf = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.checkBoxSubTreeRaising = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumFolds)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConfFactor)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinInstLeaf)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxSubTreeRaising); + this.panel.Controls.Add(this.numericUpDownSeedNumber); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.checkBoxLaplacianSmoothing); + this.panel.Controls.Add(this.checkBoxUnPruned); + this.panel.Controls.Add(this.numericUpDownNumFolds); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.numericUpDownConfFactor); + this.panel.Controls.Add(this.numericUpDownMinInstLeaf); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 1; + // + // numericUpDownSeedNumber + // + this.numericUpDownSeedNumber.Location = new System.Drawing.Point(101, 203); + this.numericUpDownSeedNumber.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeedNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeedNumber.Name = "numericUpDownSeedNumber"; + this.numericUpDownSeedNumber.Size = new System.Drawing.Size(80, 20); + this.numericUpDownSeedNumber.TabIndex = 11; + this.toolTip.SetToolTip(this.numericUpDownSeedNumber, "Random seed value"); + this.numericUpDownSeedNumber.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 205); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Seed"; + this.toolTip.SetToolTip(this.label4, "Random seed value"); + // + // checkBoxLaplacianSmoothing + // + this.checkBoxLaplacianSmoothing.AutoSize = true; + this.checkBoxLaplacianSmoothing.Location = new System.Drawing.Point(15, 134); + this.checkBoxLaplacianSmoothing.Name = "checkBoxLaplacianSmoothing"; + this.checkBoxLaplacianSmoothing.Size = new System.Drawing.Size(123, 17); + this.checkBoxLaplacianSmoothing.TabIndex = 6; + this.checkBoxLaplacianSmoothing.Text = "Laplacian smoothing"; + this.toolTip.SetToolTip(this.checkBoxLaplacianSmoothing, "Whether counts at leaves are smoothed based on Laplace"); + this.checkBoxLaplacianSmoothing.UseVisualStyleBackColor = true; + // + // checkBoxUnPruned + // + this.checkBoxUnPruned.AutoSize = true; + this.checkBoxUnPruned.Location = new System.Drawing.Point(15, 111); + this.checkBoxUnPruned.Name = "checkBoxUnPruned"; + this.checkBoxUnPruned.Size = new System.Drawing.Size(74, 17); + this.checkBoxUnPruned.TabIndex = 5; + this.checkBoxUnPruned.Text = "UnPruned"; + this.toolTip.SetToolTip(this.checkBoxUnPruned, "Whether pruning is performed"); + this.checkBoxUnPruned.UseVisualStyleBackColor = true; + // + // numericUpDownNumFolds + // + this.numericUpDownNumFolds.Location = new System.Drawing.Point(105, 69); + this.numericUpDownNumFolds.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownNumFolds.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumFolds.Name = "numericUpDownNumFolds"; + this.numericUpDownNumFolds.Size = new System.Drawing.Size(76, 20); + this.numericUpDownNumFolds.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownNumFolds, "Determines the amount of data used for reduced-error pruning. \r\nOne fold is used " + + "for pruning, the rest for growing the tree."); + this.numericUpDownNumFolds.Value = new decimal(new int[] { + 3, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 71); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(60, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Num. Folds"; + this.toolTip.SetToolTip(this.label3, "Determines the amount of data used for reduced-error pruning. \r\nOne fold is used " + + "for pruning, the rest for growing the tree."); + // + // numericUpDownConfFactor + // + this.numericUpDownConfFactor.DecimalPlaces = 2; + this.numericUpDownConfFactor.Location = new System.Drawing.Point(105, 43); + this.numericUpDownConfFactor.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownConfFactor.Name = "numericUpDownConfFactor"; + this.numericUpDownConfFactor.Size = new System.Drawing.Size(76, 20); + this.numericUpDownConfFactor.TabIndex = 2; + this.toolTip.SetToolTip(this.numericUpDownConfFactor, "Confidence factor used for pruning (smaller values incur more pruning)."); + this.numericUpDownConfFactor.Value = new decimal(new int[] { + 25, + 0, + 0, + 131072}); + // + // numericUpDownMinInstLeaf + // + this.numericUpDownMinInstLeaf.Location = new System.Drawing.Point(105, 17); + this.numericUpDownMinInstLeaf.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMinInstLeaf.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMinInstLeaf.Name = "numericUpDownMinInstLeaf"; + this.numericUpDownMinInstLeaf.Size = new System.Drawing.Size(76, 20); + this.numericUpDownMinInstLeaf.TabIndex = 1; + this.toolTip.SetToolTip(this.numericUpDownMinInstLeaf, "Minimum number of instances per leaf."); + this.numericUpDownMinInstLeaf.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 45); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(65, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Conf. Factor"; + this.toolTip.SetToolTip(this.label2, "Confidence factor used for pruning (smaller values incur more pruning)."); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Min. Inst. Leaf"; + this.toolTip.SetToolTip(this.label1, "Minimum number of instances per leaf."); + // + // checkBoxSubTreeRaising + // + this.checkBoxSubTreeRaising.AutoSize = true; + this.checkBoxSubTreeRaising.Checked = true; + this.checkBoxSubTreeRaising.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxSubTreeRaising.Location = new System.Drawing.Point(15, 157); + this.checkBoxSubTreeRaising.Name = "checkBoxSubTreeRaising"; + this.checkBoxSubTreeRaising.Size = new System.Drawing.Size(101, 17); + this.checkBoxSubTreeRaising.TabIndex = 12; + this.checkBoxSubTreeRaising.Text = "Subtree Raising"; + this.toolTip.SetToolTip(this.checkBoxSubTreeRaising, "Whether to consider the subtree raising operation when pruning"); + this.checkBoxSubTreeRaising.UseVisualStyleBackColor = true; + // + // PanelForParamJ48 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamJ48"; + this.Size = new System.Drawing.Size(207, 276); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumFolds)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownConfFactor)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinInstLeaf)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownMinInstLeaf; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolTip toolTip; + public System.Windows.Forms.NumericUpDown numericUpDownConfFactor; + private System.Windows.Forms.Label label2; + public System.Windows.Forms.NumericUpDown numericUpDownNumFolds; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox checkBoxUnPruned; + private System.Windows.Forms.CheckBox checkBoxLaplacianSmoothing; + public System.Windows.Forms.NumericUpDown numericUpDownSeedNumber; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox checkBoxSubTreeRaising; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.cs new file mode 100644 index 0000000..b91ed79 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + public partial class PanelForParamJ48 : UserControl + { + public PanelForParamJ48() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamJ48.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/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.Designer.cs new file mode 100644 index 0000000..77651e0 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.Designer.cs @@ -0,0 +1,189 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamKNN + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.comboBoxDistanceWeight = new System.Windows.Forms.ComboBox(); + this.numericUpDownKNN = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBoxNormalize = new System.Windows.Forms.CheckBox(); + this.comboBoxDistance = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownKNN)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox1); + this.panel.Controls.Add(this.comboBoxDistanceWeight); + this.panel.Controls.Add(this.numericUpDownKNN); + this.panel.Controls.Add(this.label1); + this.panel.Controls.Add(this.label3); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 4; + // + // comboBoxDistanceWeight + // + this.comboBoxDistanceWeight.FormattingEnabled = true; + this.comboBoxDistanceWeight.Items.AddRange(new object[] { + "No Weighting", + "1/Distance", + "1-Distance"}); + this.comboBoxDistanceWeight.Location = new System.Drawing.Point(80, 64); + this.comboBoxDistanceWeight.Name = "comboBoxDistanceWeight"; + this.comboBoxDistanceWeight.Size = new System.Drawing.Size(104, 21); + this.comboBoxDistanceWeight.TabIndex = 5; + this.toolTip.SetToolTip(this.comboBoxDistanceWeight, "Distance weighting method used"); + // + // numericUpDownKNN + // + this.numericUpDownKNN.Location = new System.Drawing.Point(80, 19); + this.numericUpDownKNN.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownKNN.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownKNN.Name = "numericUpDownKNN"; + this.numericUpDownKNN.Size = new System.Drawing.Size(104, 20); + this.numericUpDownKNN.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownKNN, "Number of neighbours"); + this.numericUpDownKNN.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 68); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(68, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Dist. Weight."; + this.toolTip.SetToolTip(this.label1, "Distance weighting method used"); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(14, 23); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(30, 13); + this.label3.TabIndex = 3; + this.label3.Text = "KNN"; + this.toolTip.SetToolTip(this.label3, "Number of neighbours"); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBoxNormalize); + this.groupBox1.Controls.Add(this.comboBoxDistance); + this.groupBox1.Controls.Add(this.label17); + this.groupBox1.Location = new System.Drawing.Point(4, 101); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(192, 86); + this.groupBox1.TabIndex = 21; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Distance"; + // + // checkBoxNormalize + // + this.checkBoxNormalize.AutoSize = true; + this.checkBoxNormalize.Checked = true; + this.checkBoxNormalize.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxNormalize.Location = new System.Drawing.Point(12, 56); + this.checkBoxNormalize.Name = "checkBoxNormalize"; + this.checkBoxNormalize.Size = new System.Drawing.Size(72, 17); + this.checkBoxNormalize.TabIndex = 19; + this.checkBoxNormalize.Text = "Normalize"; + this.checkBoxNormalize.UseVisualStyleBackColor = true; + // + // comboBoxDistance + // + this.comboBoxDistance.FormattingEnabled = true; + this.comboBoxDistance.Items.AddRange(new object[] { + "Euclidean", + "Manhattan", + "Chebyshev"}); + this.comboBoxDistance.Location = new System.Drawing.Point(75, 24); + this.comboBoxDistance.Name = "comboBoxDistance"; + this.comboBoxDistance.Size = new System.Drawing.Size(102, 21); + this.comboBoxDistance.TabIndex = 18; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(8, 27); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(31, 13); + this.label17.TabIndex = 17; + this.label17.Text = "Type"; + // + // PanelForParamKNN + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamKNN"; + this.Size = new System.Drawing.Size(209, 279); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownKNN)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownKNN; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.ComboBox comboBoxDistanceWeight; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox checkBoxNormalize; + public System.Windows.Forms.ComboBox comboBoxDistance; + private System.Windows.Forms.Label label17; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.cs new file mode 100644 index 0000000..309ddee --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.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.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamKNN : UserControl + { + public PanelForParamKNN() + { + InitializeComponent(); + this.comboBoxDistanceWeight.SelectedText = "No Weighting"; + this.comboBoxDistance.SelectedText = "Euclidean"; + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.resx new file mode 100644 index 0000000..4909af1 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKNN.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.Designer.cs new file mode 100644 index 0000000..2890132 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.Designer.cs @@ -0,0 +1,122 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamKStar + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.numericUpDownGlobalBlend = new System.Windows.Forms.NumericUpDown(); + this.checkBoxBlendAuto = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGlobalBlend)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox1); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 2; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.numericUpDownGlobalBlend); + this.groupBox1.Controls.Add(this.checkBoxBlendAuto); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Location = new System.Drawing.Point(3, 14); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(194, 100); + this.groupBox1.TabIndex = 6; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Blend"; + // + // numericUpDownGlobalBlend + // + this.numericUpDownGlobalBlend.Location = new System.Drawing.Point(74, 28); + this.numericUpDownGlobalBlend.Name = "numericUpDownGlobalBlend"; + this.numericUpDownGlobalBlend.Size = new System.Drawing.Size(90, 20); + this.numericUpDownGlobalBlend.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownGlobalBlend, "Parameter for global blending"); + this.numericUpDownGlobalBlend.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + // + // checkBoxBlendAuto + // + this.checkBoxBlendAuto.AutoSize = true; + this.checkBoxBlendAuto.Location = new System.Drawing.Point(38, 65); + this.checkBoxBlendAuto.Name = "checkBoxBlendAuto"; + this.checkBoxBlendAuto.Size = new System.Drawing.Size(119, 17); + this.checkBoxBlendAuto.TabIndex = 5; + this.checkBoxBlendAuto.Text = "Automated Entropic"; + this.toolTip.SetToolTip(this.checkBoxBlendAuto, "Whether entropy-based blending is to be used"); + this.checkBoxBlendAuto.UseVisualStyleBackColor = true; + this.checkBoxBlendAuto.CheckedChanged += new System.EventHandler(this.checkBoxBlendAuto_CheckedChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(31, 30); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(37, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Global"; + this.toolTip.SetToolTip(this.label3, "Parameter for global blending"); + // + // PanelForParamKStar + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamKStar"; + this.Size = new System.Drawing.Size(209, 276); + this.panel.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGlobalBlend)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.CheckBox checkBoxBlendAuto; + public System.Windows.Forms.NumericUpDown numericUpDownGlobalBlend; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.ToolTip toolTip; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.cs new file mode 100644 index 0000000..6a98a04 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamKStar : UserControl + { + public PanelForParamKStar() + { + InitializeComponent(); + } + + private void checkBoxBlendAuto_CheckedChanged(object sender, EventArgs e) + { + numericUpDownGlobalBlend.Enabled = !checkBoxBlendAuto.Checked; + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamKStar.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/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.Designer.cs new file mode 100644 index 0000000..ed4d715 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.Designer.cs @@ -0,0 +1,76 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamNaiveBayes + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.checkBoxKernelEstimator = new System.Windows.Forms.CheckBox(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxKernelEstimator); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 5; + this.toolTip.SetToolTip(this.panel, "Use a kernel estimator for numeric attributes rather than a normal distribution."); + // + // checkBoxKernelEstimator + // + this.checkBoxKernelEstimator.AutoSize = true; + this.checkBoxKernelEstimator.Location = new System.Drawing.Point(40, 26); + this.checkBoxKernelEstimator.Name = "checkBoxKernelEstimator"; + this.checkBoxKernelEstimator.Size = new System.Drawing.Size(124, 17); + this.checkBoxKernelEstimator.TabIndex = 0; + this.checkBoxKernelEstimator.Text = "Use Kernel Estimator"; + this.checkBoxKernelEstimator.UseVisualStyleBackColor = true; + // + // PanelForParamNaiveBayes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamNaiveBayes"; + this.Size = new System.Drawing.Size(209, 275); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.CheckBox checkBoxKernelEstimator; + private System.Windows.Forms.ToolTip toolTip; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.cs new file mode 100644 index 0000000..d0b38ae --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamNaiveBayes : UserControl + { + public PanelForParamNaiveBayes() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamNaiveBayes.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/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.Designer.cs new file mode 100644 index 0000000..7827d1c --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.Designer.cs @@ -0,0 +1,103 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamOneR + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownMinBucketSize = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinBucketSize)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.numericUpDownMinBucketSize); + this.panel.Controls.Add(this.label4); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 4; + // + // numericUpDownMinBucketSize + // + this.numericUpDownMinBucketSize.Location = new System.Drawing.Point(107, 25); + this.numericUpDownMinBucketSize.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownMinBucketSize.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMinBucketSize.Name = "numericUpDownMinBucketSize"; + this.numericUpDownMinBucketSize.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMinBucketSize.TabIndex = 11; + this.toolTip.SetToolTip(this.numericUpDownMinBucketSize, "Minimum bucket size used for discretizing numeric attributes"); + this.numericUpDownMinBucketSize.Value = new decimal(new int[] { + 6, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(9, 28); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(87, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Min. Bucket Size"; + this.toolTip.SetToolTip(this.label4, "Minimum bucket size used for discretizing numeric attributes"); + // + // PanelForParamOneR + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamOneR"; + this.Size = new System.Drawing.Size(209, 281); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinBucketSize)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownMinBucketSize; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.Label label4; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.cs new file mode 100644 index 0000000..c1e7fc2 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamOneR : UserControl + { + public PanelForParamOneR() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamOneR.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/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.Designer.cs new file mode 100644 index 0000000..ea935f9 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.Designer.cs @@ -0,0 +1,251 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamPerceptron + { + /// + /// 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.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PanelForParamPerceptron)); + this.panel = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownMomentum = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownLearningRate = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSeed = new System.Windows.Forms.NumericUpDown(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.numericUpDownTrainingTime = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBoxNormAttribute = new System.Windows.Forms.CheckBox(); + this.checkBoxNormNumericClasses = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMomentum)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLearningRate)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTrainingTime)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxNormNumericClasses); + this.panel.Controls.Add(this.checkBoxNormAttribute); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.label1); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.numericUpDownMomentum); + this.panel.Controls.Add(this.numericUpDownLearningRate); + this.panel.Controls.Add(this.numericUpDownTrainingTime); + this.panel.Controls.Add(this.numericUpDownSeed); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 4; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 51); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(59, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Momentum"; + this.toolTip.SetToolTip(this.label2, "Momentum applied to the weights during updating\r\n"); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 25); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(74, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Learning Rate"; + this.toolTip.SetToolTip(this.label1, "Amount the weights that are updated"); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 178); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Seed"; + // + // numericUpDownMomentum + // + this.numericUpDownMomentum.DecimalPlaces = 1; + this.numericUpDownMomentum.Location = new System.Drawing.Point(98, 49); + this.numericUpDownMomentum.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMomentum.Name = "numericUpDownMomentum"; + this.numericUpDownMomentum.Size = new System.Drawing.Size(90, 20); + this.numericUpDownMomentum.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownMomentum, "Momentum applied to the weights during updating\r\n"); + this.numericUpDownMomentum.Value = new decimal(new int[] { + 2, + 0, + 0, + 65536}); + // + // numericUpDownLearningRate + // + this.numericUpDownLearningRate.DecimalPlaces = 1; + this.numericUpDownLearningRate.Location = new System.Drawing.Point(98, 23); + this.numericUpDownLearningRate.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownLearningRate.Name = "numericUpDownLearningRate"; + this.numericUpDownLearningRate.Size = new System.Drawing.Size(90, 20); + this.numericUpDownLearningRate.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownLearningRate, "Amount the weights that are updated"); + this.numericUpDownLearningRate.Value = new decimal(new int[] { + 3, + 0, + 0, + 65536}); + // + // numericUpDownSeed + // + this.numericUpDownSeed.Location = new System.Drawing.Point(98, 176); + this.numericUpDownSeed.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownSeed.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeed.Name = "numericUpDownSeed"; + this.numericUpDownSeed.Size = new System.Drawing.Size(90, 20); + this.numericUpDownSeed.TabIndex = 4; + this.numericUpDownSeed.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + // + // numericUpDownTrainingTime + // + this.numericUpDownTrainingTime.Location = new System.Drawing.Point(98, 75); + this.numericUpDownTrainingTime.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownTrainingTime.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownTrainingTime.Name = "numericUpDownTrainingTime"; + this.numericUpDownTrainingTime.Size = new System.Drawing.Size(90, 20); + this.numericUpDownTrainingTime.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownTrainingTime, "Number of epochs to train through. \r\nIf the validation set is non-zero then it ca" + + "n terminate the network early"); + this.numericUpDownTrainingTime.Value = new decimal(new int[] { + 500, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 77); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(67, 13); + this.label4.TabIndex = 3; + this.label4.Text = "Training time"; + this.toolTip.SetToolTip(this.label4, "Number of epochs to train through. \r\nIf the validation set is non-zero then it ca" + + "n terminate the network early"); + // + // checkBoxNormAttribute + // + this.checkBoxNormAttribute.AutoSize = true; + this.checkBoxNormAttribute.Checked = true; + this.checkBoxNormAttribute.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxNormAttribute.Location = new System.Drawing.Point(15, 111); + this.checkBoxNormAttribute.Name = "checkBoxNormAttribute"; + this.checkBoxNormAttribute.Size = new System.Drawing.Size(119, 17); + this.checkBoxNormAttribute.TabIndex = 5; + this.checkBoxNormAttribute.Text = "Normalize Attributes"; + this.toolTip.SetToolTip(this.checkBoxNormAttribute, resources.GetString("checkBoxNormAttribute.ToolTip")); + this.checkBoxNormAttribute.UseVisualStyleBackColor = true; + // + // checkBoxNormNumericClasses + // + this.checkBoxNormNumericClasses.AutoSize = true; + this.checkBoxNormNumericClasses.Checked = true; + this.checkBoxNormNumericClasses.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxNormNumericClasses.Location = new System.Drawing.Point(15, 139); + this.checkBoxNormNumericClasses.Name = "checkBoxNormNumericClasses"; + this.checkBoxNormNumericClasses.Size = new System.Drawing.Size(150, 17); + this.checkBoxNormNumericClasses.TabIndex = 6; + this.checkBoxNormNumericClasses.Text = "Normalize numeric classes"; + this.toolTip.SetToolTip(this.checkBoxNormNumericClasses, resources.GetString("checkBoxNormNumericClasses.ToolTip")); + this.checkBoxNormNumericClasses.UseVisualStyleBackColor = true; + // + // PanelForParamPerceptron + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamPerceptron"; + this.Size = new System.Drawing.Size(207, 278); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMomentum)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLearningRate)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownTrainingTime)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownSeed; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + public System.Windows.Forms.NumericUpDown numericUpDownMomentum; + public System.Windows.Forms.NumericUpDown numericUpDownLearningRate; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDownTrainingTime; + private System.Windows.Forms.CheckBox checkBoxNormAttribute; + private System.Windows.Forms.CheckBox checkBoxNormNumericClasses; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.cs new file mode 100644 index 0000000..a18b136 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamPerceptron : UserControl + { + public PanelForParamPerceptron() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.resx new file mode 100644 index 0000000..d038459 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamPerceptron.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + This will normalize the class if it's numeric. +This could help improve performance of the network. +It normalizes the class to be between -1 and 1. +Note that this is only internally, the output will be scaled back to the original range. + + + This will normalize the attributes. +This could help improve performance of the network. +This is not reliant on the class being numeric. +This will also normalize nominal attributes as well (after they have been run through the nominal to binary filter if that is in use) so that the nominal values are between -1 and 1 + + \ No newline at end of file diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.Designer.cs new file mode 100644 index 0000000..12abe6a --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.Designer.cs @@ -0,0 +1,202 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamRandomForest + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownSeed = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownNumTrees = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMaxDepth = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBoxMaxDepthUnlimited = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumTrees)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxDepth)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox1); + this.panel.Controls.Add(this.numericUpDownSeed); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.numericUpDownNumTrees); + this.panel.Controls.Add(this.label2); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 2; + // + // numericUpDownSeed + // + this.numericUpDownSeed.Location = new System.Drawing.Point(101, 136); + this.numericUpDownSeed.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeed.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeed.Name = "numericUpDownSeed"; + this.numericUpDownSeed.Size = new System.Drawing.Size(80, 20); + this.numericUpDownSeed.TabIndex = 11; + this.numericUpDownSeed.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 138); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Seed"; + // + // numericUpDownNumTrees + // + this.numericUpDownNumTrees.Location = new System.Drawing.Point(101, 100); + this.numericUpDownNumTrees.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownNumTrees.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumTrees.Name = "numericUpDownNumTrees"; + this.numericUpDownNumTrees.Size = new System.Drawing.Size(80, 20); + this.numericUpDownNumTrees.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownNumTrees, "Number of trees to be generated"); + this.numericUpDownNumTrees.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // numericUpDownMaxDepth + // + this.numericUpDownMaxDepth.Enabled = false; + this.numericUpDownMaxDepth.Location = new System.Drawing.Point(98, 24); + this.numericUpDownMaxDepth.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMaxDepth.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxDepth.Name = "numericUpDownMaxDepth"; + this.numericUpDownMaxDepth.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMaxDepth.TabIndex = 1; + this.numericUpDownMaxDepth.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 102); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(62, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Num. Trees"; + this.toolTip.SetToolTip(this.label2, "Number of trees to be generated"); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBoxMaxDepthUnlimited); + this.groupBox1.Controls.Add(this.numericUpDownMaxDepth); + this.groupBox1.Location = new System.Drawing.Point(3, 19); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(194, 61); + this.groupBox1.TabIndex = 12; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Maximum Depth"; + this.toolTip.SetToolTip(this.groupBox1, "Maximum depth of the trees"); + // + // checkBoxMaxDepthUnlimited + // + this.checkBoxMaxDepthUnlimited.AutoSize = true; + this.checkBoxMaxDepthUnlimited.Checked = true; + this.checkBoxMaxDepthUnlimited.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxMaxDepthUnlimited.Location = new System.Drawing.Point(16, 25); + this.checkBoxMaxDepthUnlimited.Name = "checkBoxMaxDepthUnlimited"; + this.checkBoxMaxDepthUnlimited.Size = new System.Drawing.Size(69, 17); + this.checkBoxMaxDepthUnlimited.TabIndex = 2; + this.checkBoxMaxDepthUnlimited.Text = "Unlimited"; + this.checkBoxMaxDepthUnlimited.UseVisualStyleBackColor = true; + this.checkBoxMaxDepthUnlimited.CheckedChanged += new System.EventHandler(this.checkBoxMaxDepthUnlimited_CheckedChanged); + // + // PanelForParamRandomForest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamRandomForest"; + this.Size = new System.Drawing.Size(209, 277); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumTrees)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxDepth)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownSeed; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDownNumTrees; + public System.Windows.Forms.NumericUpDown numericUpDownMaxDepth; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox checkBoxMaxDepthUnlimited; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.cs new file mode 100644 index 0000000..5db3e28 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamRandomForest : UserControl + { + public PanelForParamRandomForest() + { + InitializeComponent(); + } + + private void checkBoxMaxDepthUnlimited_CheckedChanged(object sender, EventArgs e) + { + this.numericUpDownMaxDepth.Enabled = !checkBoxMaxDepthUnlimited.Checked; + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomForest.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/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.Designer.cs new file mode 100644 index 0000000..44bea6c --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.Designer.cs @@ -0,0 +1,263 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamRandomTree + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBoxMaxDepthUnlimited = new System.Windows.Forms.CheckBox(); + this.numericUpDownMaxDepth = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSeed = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.numericUpDownMinWeight = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.checkBoxIsBackfitting = new System.Windows.Forms.CheckBox(); + this.numericUpDownBackFittingFolds = new System.Windows.Forms.NumericUpDown(); + this.panel.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxDepth)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinWeight)).BeginInit(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBackFittingFolds)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox2); + this.panel.Controls.Add(this.numericUpDownMinWeight); + this.panel.Controls.Add(this.label1); + this.panel.Controls.Add(this.groupBox1); + this.panel.Controls.Add(this.numericUpDownSeed); + this.panel.Controls.Add(this.label4); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 3; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBoxMaxDepthUnlimited); + this.groupBox1.Controls.Add(this.numericUpDownMaxDepth); + this.groupBox1.Location = new System.Drawing.Point(3, 19); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(194, 61); + this.groupBox1.TabIndex = 12; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Maximum Depth"; + this.toolTip.SetToolTip(this.groupBox1, "Maximum depth of the tree"); + // + // checkBoxMaxDepthUnlimited + // + this.checkBoxMaxDepthUnlimited.AutoSize = true; + this.checkBoxMaxDepthUnlimited.Checked = true; + this.checkBoxMaxDepthUnlimited.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxMaxDepthUnlimited.Location = new System.Drawing.Point(16, 25); + this.checkBoxMaxDepthUnlimited.Name = "checkBoxMaxDepthUnlimited"; + this.checkBoxMaxDepthUnlimited.Size = new System.Drawing.Size(69, 17); + this.checkBoxMaxDepthUnlimited.TabIndex = 2; + this.checkBoxMaxDepthUnlimited.Text = "Unlimited"; + this.checkBoxMaxDepthUnlimited.UseVisualStyleBackColor = true; + // + // numericUpDownMaxDepth + // + this.numericUpDownMaxDepth.Enabled = false; + this.numericUpDownMaxDepth.Location = new System.Drawing.Point(98, 24); + this.numericUpDownMaxDepth.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownMaxDepth.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxDepth.Name = "numericUpDownMaxDepth"; + this.numericUpDownMaxDepth.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMaxDepth.TabIndex = 1; + this.numericUpDownMaxDepth.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // numericUpDownSeed + // + this.numericUpDownSeed.Location = new System.Drawing.Point(101, 217); + this.numericUpDownSeed.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeed.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeed.Name = "numericUpDownSeed"; + this.numericUpDownSeed.Size = new System.Drawing.Size(80, 20); + this.numericUpDownSeed.TabIndex = 11; + this.toolTip.SetToolTip(this.numericUpDownSeed, "Random seed value"); + this.numericUpDownSeed.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 219); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Seed"; + this.toolTip.SetToolTip(this.label4, "Random seed value"); + // + // numericUpDownMinWeight + // + this.numericUpDownMinWeight.DecimalPlaces = 1; + this.numericUpDownMinWeight.Location = new System.Drawing.Point(101, 97); + this.numericUpDownMinWeight.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownMinWeight.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMinWeight.Name = "numericUpDownMinWeight"; + this.numericUpDownMinWeight.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMinWeight.TabIndex = 14; + this.toolTip.SetToolTip(this.numericUpDownMinWeight, "Minimum total weight of the instances in a leaf"); + this.numericUpDownMinWeight.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 99); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(64, 13); + this.label1.TabIndex = 13; + this.label1.Text = "Min. Weight"; + this.toolTip.SetToolTip(this.label1, "Minimum total weight of the instances in a leaf"); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.checkBoxIsBackfitting); + this.groupBox2.Controls.Add(this.numericUpDownBackFittingFolds); + this.groupBox2.Location = new System.Drawing.Point(3, 129); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(194, 61); + this.groupBox2.TabIndex = 13; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Backfitting folds"; + this.toolTip.SetToolTip(this.groupBox2, "Amount of data used for backfitting. \r\nOne fold is used for backfitting, the rest" + + " for growing the tree. \r\n"); + // + // checkBoxIsBackfitting + // + this.checkBoxIsBackfitting.AutoSize = true; + this.checkBoxIsBackfitting.Location = new System.Drawing.Point(16, 25); + this.checkBoxIsBackfitting.Name = "checkBoxIsBackfitting"; + this.checkBoxIsBackfitting.Size = new System.Drawing.Size(56, 17); + this.checkBoxIsBackfitting.TabIndex = 2; + this.checkBoxIsBackfitting.Text = "Active"; + this.checkBoxIsBackfitting.UseVisualStyleBackColor = true; + this.checkBoxIsBackfitting.CheckedChanged += new System.EventHandler(this.checkBoxIsBackfitting_CheckedChanged); + // + // numericUpDownBackFittingFolds + // + this.numericUpDownBackFittingFolds.Enabled = false; + this.numericUpDownBackFittingFolds.Location = new System.Drawing.Point(98, 24); + this.numericUpDownBackFittingFolds.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownBackFittingFolds.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownBackFittingFolds.Name = "numericUpDownBackFittingFolds"; + this.numericUpDownBackFittingFolds.Size = new System.Drawing.Size(80, 20); + this.numericUpDownBackFittingFolds.TabIndex = 1; + this.numericUpDownBackFittingFolds.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // PanelForParamRandomTree + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamRandomTree"; + this.Size = new System.Drawing.Size(206, 275); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxDepth)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinWeight)).EndInit(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBackFittingFolds)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox checkBoxMaxDepthUnlimited; + public System.Windows.Forms.NumericUpDown numericUpDownMaxDepth; + public System.Windows.Forms.NumericUpDown numericUpDownSeed; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ToolTip toolTip; + public System.Windows.Forms.NumericUpDown numericUpDownMinWeight; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.CheckBox checkBoxIsBackfitting; + public System.Windows.Forms.NumericUpDown numericUpDownBackFittingFolds; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.cs new file mode 100644 index 0000000..12f2f68 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamRandomTree : UserControl + { + public PanelForParamRandomTree() + { + InitializeComponent(); + } + + private void checkBoxIsBackfitting_CheckedChanged(object sender, EventArgs e) + { + numericUpDownBackFittingFolds.Enabled = checkBoxIsBackfitting.Checked; + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamRandomTree.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/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.Designer.cs new file mode 100644 index 0000000..ebdb12e --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.Designer.cs @@ -0,0 +1,162 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamSVM + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.textBoxForKernelType = new System.Windows.Forms.TextBox(); + this.buttonEditKernel = new System.Windows.Forms.Button(); + this.numericUpDownSeed = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownC = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownC)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.textBoxForKernelType); + this.panel.Controls.Add(this.buttonEditKernel); + this.panel.Controls.Add(this.numericUpDownSeed); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.numericUpDownC); + this.panel.Controls.Add(this.label3); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(233, 207); + this.panel.TabIndex = 4; + // + // textBoxForKernelType + // + this.textBoxForKernelType.Location = new System.Drawing.Point(83, 50); + this.textBoxForKernelType.Name = "textBoxForKernelType"; + this.textBoxForKernelType.ReadOnly = true; + this.textBoxForKernelType.Size = new System.Drawing.Size(134, 20); + this.textBoxForKernelType.TabIndex = 9; + this.textBoxForKernelType.Text = "Polynomial"; + this.toolTip.SetToolTip(this.textBoxForKernelType, "Kernel type"); + // + // buttonEditKernel + // + this.buttonEditKernel.Location = new System.Drawing.Point(16, 48); + this.buttonEditKernel.Name = "buttonEditKernel"; + this.buttonEditKernel.Size = new System.Drawing.Size(54, 23); + this.buttonEditKernel.TabIndex = 8; + this.buttonEditKernel.Text = "Kernel"; + this.toolTip.SetToolTip(this.buttonEditKernel, "Kernel type"); + this.buttonEditKernel.UseVisualStyleBackColor = true; + this.buttonEditKernel.Click += new System.EventHandler(this.buttonEditKernel_Click); + // + // numericUpDownSeed + // + this.numericUpDownSeed.Location = new System.Drawing.Point(83, 124); + this.numericUpDownSeed.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownSeed.Name = "numericUpDownSeed"; + this.numericUpDownSeed.Size = new System.Drawing.Size(134, 20); + this.numericUpDownSeed.TabIndex = 7; + this.toolTip.SetToolTip(this.numericUpDownSeed, "Random seed value"); + this.numericUpDownSeed.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(13, 126); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Seed"; + this.toolTip.SetToolTip(this.label2, "Random seed value"); + // + // numericUpDownC + // + this.numericUpDownC.DecimalPlaces = 1; + this.numericUpDownC.Location = new System.Drawing.Point(83, 18); + this.numericUpDownC.Maximum = new decimal(new int[] { + 1410065408, + 2, + 0, + 0}); + this.numericUpDownC.Name = "numericUpDownC"; + this.numericUpDownC.Size = new System.Drawing.Size(134, 20); + this.numericUpDownC.TabIndex = 4; + this.toolTip.SetToolTip(this.numericUpDownC, "Complexity parameter"); + this.numericUpDownC.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(13, 20); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(57, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Complexity"; + this.toolTip.SetToolTip(this.label3, "Complexity parameter"); + // + // PanelForParamSVM + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamSVM"; + this.Size = new System.Drawing.Size(239, 214); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownC)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownC; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolTip toolTip; + public System.Windows.Forms.NumericUpDown numericUpDownSeed; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBoxForKernelType; + private System.Windows.Forms.Button buttonEditKernel; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.cs new file mode 100644 index 0000000..3640a22 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using weka.classifiers.functions.supportVector; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamSVM : UserControl + { + FormForClassificationInfo ClassifInfoParent; + + public PanelForParamSVM(FormForClassificationInfo ClassifInfoParent) + { + InitializeComponent(); + this.ClassifInfoParent = ClassifInfoParent; + textBoxForKernelType.Text = ClassifInfoParent.GeneratedKernel.toString(); + } + + private void buttonEditKernel_Click(object sender, EventArgs e) + { + FormForKernelEditor WindowForKernelEditor = new FormForKernelEditor(); + if(WindowForKernelEditor.ShowDialog()!= DialogResult.OK) return; + this.ClassifInfoParent.GeneratedKernel = WindowForKernelEditor.GeneratedKernel; + textBoxForKernelType.Text = WindowForKernelEditor.GeneratedKernel.toString(); + + + + } + + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamSVM.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/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.Designer.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.Designer.cs new file mode 100644 index 0000000..45a5be9 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.Designer.cs @@ -0,0 +1,56 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + partial class PanelForParamZeroR + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // panel + // + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 2; + // + // PanelForParamZeroR + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamZeroR"; + this.Size = new System.Drawing.Size(206, 283); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.cs b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.cs new file mode 100644 index 0000000..dff8c2c --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo +{ + public partial class PanelForParamZeroR : UserControl + { + public PanelForParamZeroR() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.resx b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Classes/Machine Learning/ClassificationInfo/PanelForParamZeroR.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/Forms/ClusteringForms/FormForEMInfo.Designer.cs b/Classes/Machine Learning/ClusteringForms/FormForEMInfo.Designer.cs similarity index 100% rename from Forms/ClusteringForms/FormForEMInfo.Designer.cs rename to Classes/Machine Learning/ClusteringForms/FormForEMInfo.Designer.cs diff --git a/Forms/ClusteringForms/FormForEMInfo.cs b/Classes/Machine Learning/ClusteringForms/FormForEMInfo.cs similarity index 100% rename from Forms/ClusteringForms/FormForEMInfo.cs rename to Classes/Machine Learning/ClusteringForms/FormForEMInfo.cs diff --git a/Forms/FormForClassificationTree.resx b/Classes/Machine Learning/ClusteringForms/FormForEMInfo.resx similarity index 100% rename from Forms/FormForClassificationTree.resx rename to Classes/Machine Learning/ClusteringForms/FormForEMInfo.resx diff --git a/Forms/ClusteringForms/FormForHierarchical.Designer.cs b/Classes/Machine Learning/ClusteringForms/FormForHierarchical.Designer.cs similarity index 100% rename from Forms/ClusteringForms/FormForHierarchical.Designer.cs rename to Classes/Machine Learning/ClusteringForms/FormForHierarchical.Designer.cs diff --git a/Forms/ClusteringForms/FormForHierarchical.cs b/Classes/Machine Learning/ClusteringForms/FormForHierarchical.cs similarity index 100% rename from Forms/ClusteringForms/FormForHierarchical.cs rename to Classes/Machine Learning/ClusteringForms/FormForHierarchical.cs diff --git a/Forms/FormsForGraphsDisplay/FormForMaxMinRequest.resx b/Classes/Machine Learning/ClusteringForms/FormForHierarchical.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForMaxMinRequest.resx rename to Classes/Machine Learning/ClusteringForms/FormForHierarchical.resx diff --git a/Forms/ClusteringForms/FormForKMeansInfo.Designer.cs b/Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.Designer.cs similarity index 100% rename from Forms/ClusteringForms/FormForKMeansInfo.Designer.cs rename to Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.Designer.cs diff --git a/Forms/ClusteringForms/FormForKMeansInfo.cs b/Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.cs similarity index 100% rename from Forms/ClusteringForms/FormForKMeansInfo.cs rename to Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.cs diff --git a/Forms/FormsForGraphsDisplay/FormForPie.resx b/Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForPie.resx rename to Classes/Machine Learning/ClusteringForms/FormForKMeansInfo.resx diff --git a/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.Designer.cs b/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.Designer.cs new file mode 100644 index 0000000..c82124f --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.Designer.cs @@ -0,0 +1,133 @@ +namespace HCSAnalyzer.Forms.FormsForOptions +{ + partial class FormForClusteringInfo + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("EM"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("K-Means"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Hierarchical"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Farthest First"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("CobWeb"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Manual"); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForClusteringInfo)); + this.panelForDisplay = new System.Windows.Forms.Panel(); + this.treeViewForOptions = new System.Windows.Forms.TreeView(); + this.buttonOK = new System.Windows.Forms.Button(); + this.richTextBoxForInfo = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // panelForDisplay + // + this.panelForDisplay.AutoScroll = true; + this.panelForDisplay.Location = new System.Drawing.Point(187, 9); + this.panelForDisplay.Name = "panelForDisplay"; + this.panelForDisplay.Size = new System.Drawing.Size(266, 276); + this.panelForDisplay.TabIndex = 6; + // + // treeViewForOptions + // + this.treeViewForOptions.Location = new System.Drawing.Point(7, 9); + this.treeViewForOptions.Name = "treeViewForOptions"; + treeNode1.Name = "Node0"; + treeNode1.Tag = "EM"; + treeNode1.Text = "EM"; + treeNode2.Name = "Node1"; + treeNode2.Tag = "K-Means"; + treeNode2.Text = "K-Means"; + treeNode3.Name = "Node0"; + treeNode3.Tag = "Hierarchical"; + treeNode3.Text = "Hierarchical"; + treeNode4.Name = "Node0"; + treeNode4.Tag = "FarthestFirst"; + treeNode4.Text = "Farthest First"; + treeNode5.Name = "Node1"; + treeNode5.Tag = "CobWeb"; + treeNode5.Text = "CobWeb"; + treeNode6.Name = "Node0"; + treeNode6.Tag = "Manual"; + treeNode6.Text = "Manual"; + this.treeViewForOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3, + treeNode4, + treeNode5, + treeNode6}); + this.treeViewForOptions.ShowRootLines = false; + this.treeViewForOptions.Size = new System.Drawing.Size(174, 276); + this.treeViewForOptions.TabIndex = 5; + this.treeViewForOptions.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewForOptions_AfterSelect); + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(378, 377); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "Ok"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // richTextBoxForInfo + // + this.richTextBoxForInfo.Anchor = System.Windows.Forms.AnchorStyles.None; + this.richTextBoxForInfo.Location = new System.Drawing.Point(7, 293); + this.richTextBoxForInfo.Name = "richTextBoxForInfo"; + this.richTextBoxForInfo.ReadOnly = true; + this.richTextBoxForInfo.Size = new System.Drawing.Size(446, 81); + this.richTextBoxForInfo.TabIndex = 7; + this.richTextBoxForInfo.Text = ""; + this.richTextBoxForInfo.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxForInfo_LinkClicked); + // + // FormForClusteringInfo + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(457, 404); + this.Controls.Add(this.richTextBoxForInfo); + this.Controls.Add(this.panelForDisplay); + this.Controls.Add(this.treeViewForOptions); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForClusteringInfo"; + this.Text = "Clustering parameters"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panelForDisplay; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.RichTextBox richTextBoxForInfo; + public System.Windows.Forms.TreeView treeViewForOptions; + } +} \ No newline at end of file diff --git a/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.cs b/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.cs new file mode 100644 index 0000000..fe262b1 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions +{ + public partial class FormForClusteringInfo : Form + { + cGlobalInfo GlobalInfo; + cListClusteringAlgo ListClusteringAlgo; + + public FormForClusteringInfo(List ListDescriptors, cGlobalInfo GlobalInfo) + { + InitializeComponent(); + this.GlobalInfo = GlobalInfo; + this.treeViewForOptions.SelectedNode = this.treeViewForOptions.Nodes[0]; + ListClusteringAlgo = new cListClusteringAlgo(ListDescriptors); + } + + private void treeViewForOptions_AfterSelect(object sender, TreeViewEventArgs e) + { + this.panelForDisplay.Controls.Clear(); + string TagName= (string)e.Node.Tag; + + Panel PanelToDisp = ListClusteringAlgo.GetPanel(TagName); + if (PanelToDisp == null) return; + this.panelForDisplay.Controls.Add(PanelToDisp); + + if (TagName == "EM") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Expectation Maximization (EM)\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Expectation_maximization"); + } + else if (TagName == "K-Means") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("K-Means\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/K-means_clustering"); + } + else if (TagName == "Hierarchical") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Hierarchical Clustering\n------------------------------------------------------\nNote: well suited for large signatures, but computationaly heavy regarding the number of experiments.\nFor more information, go to: http://en.wikipedia.org/wiki/Hierarchical_clustering"); + } + else if (TagName == "FarthestFirst") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Farthest First Clustering\n------------------------------------------------------\nFor more information:\n Hochbaum, Shmoys (1985).\nA best possible heuristic for the k-center problem.\nMathematics of Operations Research. 10(2):180-184."); + } + else if (TagName == "CobWeb") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("CobWeb Clustering\n------------------------------------------------------\nFor more information, go to: http://en.wikipedia.org/wiki/Cobweb_(clustering)"); + } + else if (TagName == "Manual") + { + richTextBoxForInfo.Clear(); + richTextBoxForInfo.AppendText("Manual Clustering\n------------------------------------------------------\nIn this mode, classes are defined by a descriptor.\nWarning: the descriptor number of values should be lower than the defined number of distinct cellular phenotypes."); + } + } + + public cParamAlgo GetSelectedAlgoAndParameters() + { + cParamAlgo ToReturn = ListClusteringAlgo.GetListParams((string)treeViewForOptions.SelectedNode.Tag); + return ToReturn; + } + + private void richTextBoxForInfo_LinkClicked(object sender, LinkClickedEventArgs e) + { + GlobalInfo.WindowHCSAnalyzer.ClickOnLink(e.LinkText); + } + } + + + +} diff --git a/Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.resx b/Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.resx rename to Classes/Machine Learning/ClusteringInfo/FormForClusteringInfo.resx diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.Designer.cs new file mode 100644 index 0000000..b6a2621 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.Designer.cs @@ -0,0 +1,195 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + partial class PanelForParamCobWeb + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownAcuity = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSeedNumber = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDownCutOff = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.toolTipForInfo = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAcuity)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCutOff)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.numericUpDownCutOff); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.numericUpDownAcuity); + this.panel.Controls.Add(this.numericUpDownSeedNumber); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.label2); + this.panel.Location = new System.Drawing.Point(0, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 264); + this.panel.TabIndex = 1; + // + // numericUpDownAcuity + // + this.numericUpDownAcuity.DecimalPlaces = 1; + this.numericUpDownAcuity.Increment = new decimal(new int[] { + 1, + 0, + 0, + 327680}); + this.numericUpDownAcuity.Location = new System.Drawing.Point(78, 18); + this.numericUpDownAcuity.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownAcuity.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 458752}); + this.numericUpDownAcuity.Name = "numericUpDownAcuity"; + this.numericUpDownAcuity.Size = new System.Drawing.Size(107, 20); + this.numericUpDownAcuity.TabIndex = 8; + this.toolTipForInfo.SetToolTip(this.numericUpDownAcuity, "Acuity: Set the minimum standard deviation for numeric attributes"); + this.numericUpDownAcuity.Value = new decimal(new int[] { + 10, + 0, + 0, + 65536}); + // + // numericUpDownSeedNumber + // + this.numericUpDownSeedNumber.Location = new System.Drawing.Point(78, 79); + this.numericUpDownSeedNumber.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeedNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeedNumber.Name = "numericUpDownSeedNumber"; + this.numericUpDownSeedNumber.Size = new System.Drawing.Size(107, 20); + this.numericUpDownSeedNumber.TabIndex = 9; + this.numericUpDownSeedNumber.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 81); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Seed"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 20); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Acuity"; + this.toolTipForInfo.SetToolTip(this.label2, "set the minimum standard deviation for numeric attributes"); + // + // numericUpDownCutOff + // + this.numericUpDownCutOff.DecimalPlaces = 12; + this.numericUpDownCutOff.Increment = new decimal(new int[] { + 1, + 0, + 0, + 327680}); + this.numericUpDownCutOff.Location = new System.Drawing.Point(78, 48); + this.numericUpDownCutOff.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownCutOff.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 458752}); + this.numericUpDownCutOff.Name = "numericUpDownCutOff"; + this.numericUpDownCutOff.Size = new System.Drawing.Size(107, 20); + this.numericUpDownCutOff.TabIndex = 11; + this.toolTipForInfo.SetToolTip(this.numericUpDownCutOff, "Cutoff: Set the category utility threshold by which to prune nodes"); + this.numericUpDownCutOff.Value = new decimal(new int[] { + 833273639, + 6568031, + 0, + 1245184}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 50); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(37, 13); + this.label4.TabIndex = 10; + this.label4.Text = "CutOff"; + this.toolTipForInfo.SetToolTip(this.label4, "Set the category utility threshold by which to prune nodes"); + // + // PanelForParamCobWeb + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamCobWeb"; + this.Size = new System.Drawing.Size(235, 271); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAcuity)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownCutOff)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownAcuity; + public System.Windows.Forms.NumericUpDown numericUpDownSeedNumber; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + public System.Windows.Forms.NumericUpDown numericUpDownCutOff; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ToolTip toolTipForInfo; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.cs new file mode 100644 index 0000000..627809e --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + public partial class PanelForParamCobWeb : UserControl + { + public PanelForParamCobWeb() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.resx new file mode 100644 index 0000000..e8ef9f0 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamCobWeb.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/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.Designer.cs new file mode 100644 index 0000000..0d79946 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.Designer.cs @@ -0,0 +1,249 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + partial class PanelForParamEM + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownMinStdev = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownSeedNumber = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMaxIterations = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.checkBoxAutomatedClassNum = new System.Windows.Forms.CheckBox(); + this.numericUpDownNumClasses = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTipForInfo = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinStdev)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxIterations)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.numericUpDownMinStdev); + this.panel.Controls.Add(this.numericUpDownSeedNumber); + this.panel.Controls.Add(this.numericUpDownMaxIterations); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.label2); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.checkBoxAutomatedClassNum); + this.panel.Controls.Add(this.numericUpDownNumClasses); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 264); + this.panel.TabIndex = 0; + // + // numericUpDownMinStdev + // + this.numericUpDownMinStdev.DecimalPlaces = 7; + this.numericUpDownMinStdev.Increment = new decimal(new int[] { + 1, + 0, + 0, + 327680}); + this.numericUpDownMinStdev.Location = new System.Drawing.Point(78, 92); + this.numericUpDownMinStdev.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownMinStdev.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 458752}); + this.numericUpDownMinStdev.Name = "numericUpDownMinStdev"; + this.numericUpDownMinStdev.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMinStdev.TabIndex = 8; + this.toolTipForInfo.SetToolTip(this.numericUpDownMinStdev, "Minimum standard deviation"); + this.numericUpDownMinStdev.Value = new decimal(new int[] { + 1, + 0, + 0, + 393216}); + // + // numericUpDownSeedNumber + // + this.numericUpDownSeedNumber.Location = new System.Drawing.Point(78, 123); + this.numericUpDownSeedNumber.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeedNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeedNumber.Name = "numericUpDownSeedNumber"; + this.numericUpDownSeedNumber.Size = new System.Drawing.Size(80, 20); + this.numericUpDownSeedNumber.TabIndex = 9; + this.toolTipForInfo.SetToolTip(this.numericUpDownSeedNumber, "Random seed value"); + this.numericUpDownSeedNumber.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // numericUpDownMaxIterations + // + this.numericUpDownMaxIterations.Location = new System.Drawing.Point(78, 62); + this.numericUpDownMaxIterations.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownMaxIterations.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxIterations.Name = "numericUpDownMaxIterations"; + this.numericUpDownMaxIterations.Size = new System.Drawing.Size(80, 20); + this.numericUpDownMaxIterations.TabIndex = 10; + this.toolTipForInfo.SetToolTip(this.numericUpDownMaxIterations, "Maximum Iterations"); + this.numericUpDownMaxIterations.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 125); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Seed"; + this.toolTipForInfo.SetToolTip(this.label3, "Random seed value"); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 94); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(52, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Min. Stdv"; + this.toolTipForInfo.SetToolTip(this.label2, "Minimum standard deviation"); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 64); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(39, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Max It."; + this.toolTipForInfo.SetToolTip(this.label4, "Maximum Iterations"); + // + // checkBoxAutomatedClassNum + // + this.checkBoxAutomatedClassNum.AutoSize = true; + this.checkBoxAutomatedClassNum.Location = new System.Drawing.Point(170, 19); + this.checkBoxAutomatedClassNum.Name = "checkBoxAutomatedClassNum"; + this.checkBoxAutomatedClassNum.Size = new System.Drawing.Size(48, 17); + this.checkBoxAutomatedClassNum.TabIndex = 4; + this.checkBoxAutomatedClassNum.Text = "Auto"; + this.toolTipForInfo.SetToolTip(this.checkBoxAutomatedClassNum, "The class number will be automatically estimated.\r\n\r\nWarning: this process is tim" + + "e consuming, and\r\ncan result in a class number higher the number\r\nof phenotypes " + + "allowed."); + this.checkBoxAutomatedClassNum.UseVisualStyleBackColor = true; + this.checkBoxAutomatedClassNum.CheckedChanged += new System.EventHandler(this.checkBoxAutomatedClassNum_CheckedChanged); + // + // numericUpDownNumClasses + // + this.numericUpDownNumClasses.Location = new System.Drawing.Point(79, 17); + this.numericUpDownNumClasses.Maximum = new decimal(new int[] { + 1000000, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Name = "numericUpDownNumClasses"; + this.numericUpDownNumClasses.Size = new System.Drawing.Size(79, 20); + this.numericUpDownNumClasses.TabIndex = 3; + this.toolTipForInfo.SetToolTip(this.numericUpDownNumClasses, "Number of classes"); + this.numericUpDownNumClasses.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(43, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Classes"; + this.toolTipForInfo.SetToolTip(this.label1, "Number of classes"); + // + // PanelForParamEM + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamEM"; + this.Size = new System.Drawing.Size(238, 271); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinStdev)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxIterations)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownNumClasses; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox checkBoxAutomatedClassNum; + private System.Windows.Forms.ToolTip toolTipForInfo; + public System.Windows.Forms.NumericUpDown numericUpDownMinStdev; + public System.Windows.Forms.NumericUpDown numericUpDownSeedNumber; + public System.Windows.Forms.NumericUpDown numericUpDownMaxIterations; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label4; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.cs new file mode 100644 index 0000000..4d7e605 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + public partial class PanelForParamEM : UserControl + { + public PanelForParamEM() + { + InitializeComponent(); + + } + + public object GetPanel() + { + return this; + + } + + private void checkBoxAutomatedClassNum_CheckedChanged(object sender, EventArgs e) + { + this.numericUpDownNumClasses.Enabled = !this.checkBoxAutomatedClassNum.Checked; + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.resx new file mode 100644 index 0000000..e8ef9f0 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamEM.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/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.Designer.cs new file mode 100644 index 0000000..48f0659 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.Designer.cs @@ -0,0 +1,144 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + partial class PanelForParamFarthestFirst + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.numericUpDownSeedNumber = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownNumClasses = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.numericUpDownSeedNumber); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.numericUpDownNumClasses); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 260); + this.panel.TabIndex = 1; + // + // numericUpDownSeedNumber + // + this.numericUpDownSeedNumber.Location = new System.Drawing.Point(79, 50); + this.numericUpDownSeedNumber.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeedNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeedNumber.Name = "numericUpDownSeedNumber"; + this.numericUpDownSeedNumber.Size = new System.Drawing.Size(90, 20); + this.numericUpDownSeedNumber.TabIndex = 15; + this.toolTip.SetToolTip(this.numericUpDownSeedNumber, "Random seed"); + this.numericUpDownSeedNumber.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 52); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 13; + this.label3.Text = "Seed"; + this.toolTip.SetToolTip(this.label3, "Random seed"); + // + // numericUpDownNumClasses + // + this.numericUpDownNumClasses.Location = new System.Drawing.Point(79, 17); + this.numericUpDownNumClasses.Maximum = new decimal(new int[] { + 1000000, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Name = "numericUpDownNumClasses"; + this.numericUpDownNumClasses.Size = new System.Drawing.Size(90, 20); + this.numericUpDownNumClasses.TabIndex = 12; + this.toolTip.SetToolTip(this.numericUpDownNumClasses, "Number of classes"); + this.numericUpDownNumClasses.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(43, 13); + this.label1.TabIndex = 11; + this.label1.Text = "Classes"; + this.toolTip.SetToolTip(this.label1, "Number of classes"); + // + // PanelForParamFarthestFirst + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamFarthestFirst"; + this.Size = new System.Drawing.Size(206, 266); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownNumClasses; + private System.Windows.Forms.Label label1; + public System.Windows.Forms.NumericUpDown numericUpDownSeedNumber; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolTip toolTip; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.cs new file mode 100644 index 0000000..1ad3625 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + public partial class PanelForParamFarthestFirst : UserControl + { + public PanelForParamFarthestFirst() + { + InitializeComponent(); + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamFarthestFirst.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/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.Designer.cs new file mode 100644 index 0000000..952861e --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.Designer.cs @@ -0,0 +1,193 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + partial class PanelForParamHierarchical + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBoxNormalize = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.comboBoxDistance = new System.Windows.Forms.ComboBox(); + this.comboBoxLinkType = new System.Windows.Forms.ComboBox(); + this.label18 = new System.Windows.Forms.Label(); + this.numericUpDownNumClasses = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTipForInfo = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox1); + this.panel.Controls.Add(this.comboBoxLinkType); + this.panel.Controls.Add(this.label18); + this.panel.Controls.Add(this.numericUpDownNumClasses); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 271); + this.panel.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBoxNormalize); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.comboBoxDistance); + this.groupBox1.Location = new System.Drawing.Point(4, 52); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(192, 86); + this.groupBox1.TabIndex = 21; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Distance"; + this.toolTipForInfo.SetToolTip(this.groupBox1, "Distance function"); + // + // checkBoxNormalize + // + this.checkBoxNormalize.AutoSize = true; + this.checkBoxNormalize.Checked = true; + this.checkBoxNormalize.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxNormalize.Location = new System.Drawing.Point(12, 56); + this.checkBoxNormalize.Name = "checkBoxNormalize"; + this.checkBoxNormalize.Size = new System.Drawing.Size(72, 17); + this.checkBoxNormalize.TabIndex = 19; + this.checkBoxNormalize.Text = "Normalize"; + this.checkBoxNormalize.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(8, 27); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(31, 13); + this.label2.TabIndex = 17; + this.label2.Text = "Type"; + // + // comboBoxDistance + // + this.comboBoxDistance.FormattingEnabled = true; + this.comboBoxDistance.Items.AddRange(new object[] { + "Euclidean", + "Manhattan", + "Chebyshev"}); + this.comboBoxDistance.Location = new System.Drawing.Point(75, 24); + this.comboBoxDistance.Name = "comboBoxDistance"; + this.comboBoxDistance.Size = new System.Drawing.Size(102, 21); + this.comboBoxDistance.TabIndex = 3; + // + // comboBoxLinkType + // + this.comboBoxLinkType.FormattingEnabled = true; + this.comboBoxLinkType.Items.AddRange(new object[] { + "SINGLE", + "COMPLETE", + "AVERAGE", + "MEAN", + "CENTROID", + "WARD", + "ADJCOMLPETE"}); + this.comboBoxLinkType.Location = new System.Drawing.Point(79, 161); + this.comboBoxLinkType.Name = "comboBoxLinkType"; + this.comboBoxLinkType.Size = new System.Drawing.Size(102, 21); + this.comboBoxLinkType.TabIndex = 5; + this.toolTipForInfo.SetToolTip(this.comboBoxLinkType, "Link type"); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(11, 164); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(50, 13); + this.label18.TabIndex = 4; + this.label18.Text = "Link type"; + // + // numericUpDownNumClasses + // + this.numericUpDownNumClasses.Location = new System.Drawing.Point(79, 17); + this.numericUpDownNumClasses.Maximum = new decimal(new int[] { + 1000000, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Name = "numericUpDownNumClasses"; + this.numericUpDownNumClasses.Size = new System.Drawing.Size(102, 20); + this.numericUpDownNumClasses.TabIndex = 1; + this.toolTipForInfo.SetToolTip(this.numericUpDownNumClasses, "Number of classes"); + this.numericUpDownNumClasses.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(43, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Classes"; + this.toolTipForInfo.SetToolTip(this.label1, "Number of classes"); + // + // PanelForParamHierarchical + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamHierarchical"; + this.Size = new System.Drawing.Size(209, 282); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + public System.Windows.Forms.NumericUpDown numericUpDownNumClasses; + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.ComboBox comboBoxLinkType; + private System.Windows.Forms.Label label18; + public System.Windows.Forms.ComboBox comboBoxDistance; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox checkBoxNormalize; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ToolTip toolTipForInfo; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.cs new file mode 100644 index 0000000..0ab601b --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.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.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + public partial class PanelForParamHierarchical : UserControl + { + public PanelForParamHierarchical() + { + InitializeComponent(); + this.comboBoxDistance.SelectedText = "Euclidean"; + this.comboBoxLinkType.SelectedText = "COMPLETE"; + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.resx new file mode 100644 index 0000000..e8ef9f0 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamHierarchical.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/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.Designer.cs new file mode 100644 index 0000000..774ce5b --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.Designer.cs @@ -0,0 +1,243 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + partial class PanelForParamKMeans + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.checkBoxNormalize = new System.Windows.Forms.CheckBox(); + this.comboBoxDistance = new System.Windows.Forms.ComboBox(); + this.label17 = new System.Windows.Forms.Label(); + this.numericUpDownSeedNumber = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMaxIterations = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownNumClasses = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTipForInfo = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxIterations)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).BeginInit(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox1); + this.panel.Controls.Add(this.numericUpDownSeedNumber); + this.panel.Controls.Add(this.numericUpDownMaxIterations); + this.panel.Controls.Add(this.label3); + this.panel.Controls.Add(this.label4); + this.panel.Controls.Add(this.numericUpDownNumClasses); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(200, 260); + this.panel.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.checkBoxNormalize); + this.groupBox1.Controls.Add(this.comboBoxDistance); + this.groupBox1.Controls.Add(this.label17); + this.groupBox1.Location = new System.Drawing.Point(4, 133); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(192, 86); + this.groupBox1.TabIndex = 20; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Distance"; + this.toolTipForInfo.SetToolTip(this.groupBox1, "Distance function"); + // + // checkBoxNormalize + // + this.checkBoxNormalize.AutoSize = true; + this.checkBoxNormalize.Checked = true; + this.checkBoxNormalize.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxNormalize.Location = new System.Drawing.Point(12, 56); + this.checkBoxNormalize.Name = "checkBoxNormalize"; + this.checkBoxNormalize.Size = new System.Drawing.Size(72, 17); + this.checkBoxNormalize.TabIndex = 19; + this.checkBoxNormalize.Text = "Normalize"; + this.toolTipForInfo.SetToolTip(this.checkBoxNormalize, "Are the values normalized"); + this.checkBoxNormalize.UseVisualStyleBackColor = true; + // + // comboBoxDistance + // + this.comboBoxDistance.FormattingEnabled = true; + this.comboBoxDistance.Items.AddRange(new object[] { + "Euclidean", + "Manhattan"}); + this.comboBoxDistance.Location = new System.Drawing.Point(75, 24); + this.comboBoxDistance.Name = "comboBoxDistance"; + this.comboBoxDistance.Size = new System.Drawing.Size(102, 21); + this.comboBoxDistance.TabIndex = 18; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(8, 27); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(31, 13); + this.label17.TabIndex = 17; + this.label17.Text = "Type"; + // + // numericUpDownSeedNumber + // + this.numericUpDownSeedNumber.Location = new System.Drawing.Point(79, 93); + this.numericUpDownSeedNumber.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownSeedNumber.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSeedNumber.Name = "numericUpDownSeedNumber"; + this.numericUpDownSeedNumber.Size = new System.Drawing.Size(102, 20); + this.numericUpDownSeedNumber.TabIndex = 15; + this.toolTipForInfo.SetToolTip(this.numericUpDownSeedNumber, "Random seed value"); + this.numericUpDownSeedNumber.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // numericUpDownMaxIterations + // + this.numericUpDownMaxIterations.Location = new System.Drawing.Point(79, 64); + this.numericUpDownMaxIterations.Maximum = new decimal(new int[] { + -1530494976, + 232830, + 0, + 0}); + this.numericUpDownMaxIterations.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownMaxIterations.Name = "numericUpDownMaxIterations"; + this.numericUpDownMaxIterations.Size = new System.Drawing.Size(102, 20); + this.numericUpDownMaxIterations.TabIndex = 16; + this.toolTipForInfo.SetToolTip(this.numericUpDownMaxIterations, "Maximum Iterations"); + this.numericUpDownMaxIterations.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 95); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 13); + this.label3.TabIndex = 13; + this.label3.Text = "Seed"; + this.toolTipForInfo.SetToolTip(this.label3, "Random seed value"); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 66); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(39, 13); + this.label4.TabIndex = 14; + this.label4.Text = "Max It."; + this.toolTipForInfo.SetToolTip(this.label4, "Maximum Iterations"); + // + // numericUpDownNumClasses + // + this.numericUpDownNumClasses.Location = new System.Drawing.Point(79, 17); + this.numericUpDownNumClasses.Maximum = new decimal(new int[] { + 1000000, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownNumClasses.Name = "numericUpDownNumClasses"; + this.numericUpDownNumClasses.Size = new System.Drawing.Size(102, 20); + this.numericUpDownNumClasses.TabIndex = 12; + this.toolTipForInfo.SetToolTip(this.numericUpDownNumClasses, "Number of classes"); + this.numericUpDownNumClasses.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(43, 13); + this.label1.TabIndex = 11; + this.label1.Text = "Classes"; + this.toolTipForInfo.SetToolTip(this.label1, "Number of classes"); + // + // PanelForParamKMeans + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamKMeans"; + this.Size = new System.Drawing.Size(207, 266); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSeedNumber)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxIterations)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumClasses)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + public System.Windows.Forms.NumericUpDown numericUpDownSeedNumber; + public System.Windows.Forms.NumericUpDown numericUpDownMaxIterations; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDownNumClasses; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolTip toolTipForInfo; + public System.Windows.Forms.ComboBox comboBoxDistance; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox checkBoxNormalize; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.cs new file mode 100644 index 0000000..c4f85bf --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.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.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo +{ + public partial class PanelForParamKMeans : UserControl + { + public PanelForParamKMeans() + { + InitializeComponent(); + this.comboBoxDistance.SelectedText = "Euclidean"; + + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.resx new file mode 100644 index 0000000..e8ef9f0 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamKMeans.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/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.Designer.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.Designer.cs new file mode 100644 index 0000000..295d0ca --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.Designer.cs @@ -0,0 +1,85 @@ +namespace HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo +{ + partial class PanelForParamManual + { + /// + /// 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.components = new System.ComponentModel.Container(); + this.panel = new System.Windows.Forms.Panel(); + this.comboBoxForDescriptorManualClustering = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.panel.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.comboBoxForDescriptorManualClustering); + this.panel.Controls.Add(this.label1); + this.panel.Location = new System.Drawing.Point(3, 0); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(231, 264); + this.panel.TabIndex = 1; + // + // comboBoxForDescriptorManualClustering + // + this.comboBoxForDescriptorManualClustering.FormattingEnabled = true; + this.comboBoxForDescriptorManualClustering.Location = new System.Drawing.Point(92, 37); + this.comboBoxForDescriptorManualClustering.Name = "comboBoxForDescriptorManualClustering"; + this.comboBoxForDescriptorManualClustering.Size = new System.Drawing.Size(112, 21); + this.comboBoxForDescriptorManualClustering.TabIndex = 6; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(17, 40); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(55, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Descriptor"; + // + // PanelForParamManual + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForParamManual"; + this.Size = new System.Drawing.Size(237, 268); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolTip toolTip; + public System.Windows.Forms.ComboBox comboBoxForDescriptorManualClustering; + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.cs b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.cs new file mode 100644 index 0000000..277fec6 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo +{ + public partial class PanelForParamManual : UserControl + { + public PanelForParamManual(List ListDescritpors) + { + InitializeComponent(); + + foreach (var item in ListDescritpors) + { + comboBoxForDescriptorManualClustering.Items.Add(item); + } + + + + } + } +} diff --git a/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.resx b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/Classes/Machine Learning/ClusteringInfo/PanelForParamManual.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/Forms/FormClassification.Designer.cs b/Classes/Machine Learning/FormClassification.Designer.cs similarity index 98% rename from Forms/FormClassification.Designer.cs rename to Classes/Machine Learning/FormClassification.Designer.cs index 537ac40..05611af 100644 --- a/Forms/FormClassification.Designer.cs +++ b/Classes/Machine Learning/FormClassification.Designer.cs @@ -58,8 +58,8 @@ private void InitializeComponent() this.comboBoxForNeutralClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxForNeutralClass.FormattingEnabled = true; this.comboBoxForNeutralClass.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", diff --git a/Forms/FormClassification.cs b/Classes/Machine Learning/FormClassification.cs similarity index 94% rename from Forms/FormClassification.cs rename to Classes/Machine Learning/FormClassification.cs index 7fc8e9b..6d6f3a9 100644 --- a/Forms/FormClassification.cs +++ b/Classes/Machine Learning/FormClassification.cs @@ -25,7 +25,7 @@ private void comboBoxForNeutralClass_DrawItem(object sender, DrawItemEventArgs e { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(CurrentScreening.GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(CurrentScreening.GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxForNeutralClass.Items[e.Index].ToString(), comboBoxForNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); diff --git a/Forms/FormsForOptions/FormForHistogramMode.resx b/Classes/Machine Learning/FormClassification.resx similarity index 100% rename from Forms/FormsForOptions/FormForHistogramMode.resx rename to Classes/Machine Learning/FormClassification.resx diff --git a/Forms/FormDendogram.Designer.cs b/Classes/Machine Learning/FormDendogram.Designer.cs similarity index 100% rename from Forms/FormDendogram.Designer.cs rename to Classes/Machine Learning/FormDendogram.Designer.cs diff --git a/Forms/FormDendogram.cs b/Classes/Machine Learning/FormDendogram.cs similarity index 68% rename from Forms/FormDendogram.cs rename to Classes/Machine Learning/FormDendogram.cs index aebf0eb..0c71bdc 100644 --- a/Forms/FormDendogram.cs +++ b/Classes/Machine Learning/FormDendogram.cs @@ -18,9 +18,10 @@ public partial class FormDendogram : Form Graphics g; public cGlobalInfo GlobalInfo; - public FormDendogram() + public FormDendogram(cGlobalInfo GlobalInfo) { InitializeComponent(); + this.GlobalInfo = GlobalInfo; } /// @@ -45,7 +46,7 @@ private int DrawSignature(cWell Well, int Size, int PosX, int PosY) Rectangle CurrentRect = new Rectangle(5, PosY, 8, Size); - SolidBrush CurrBrush = new SolidBrush(Well.GetColor()); + SolidBrush CurrBrush = new SolidBrush(Well.GetClassColor()); // draw the rectangle g.FillRectangle(CurrBrush, CurrentRect); @@ -81,6 +82,70 @@ private int DrawSignature(cWell Well, int Size, int PosX, int PosY) return PosX + RealIdx * Size; } + /// + /// Draw the dendogram signature for a specific well + /// + /// + /// + /// + /// + /// Lenght of the signature + private int DrawSignatureFromInstance(weka.core.Instance CurrentInstance, int Size, int PosX, int PosY) + { + if (CurrentInstance == null) return 0; + + int RealIdx = 0; + int SizeFont = Size / 4; + int ScrollShiftY = this.VerticalScroll.Value; + + double Min, Max; + int ConvertedValue; + + // g.DrawString("[" + Well.GetPosX() + "x" + Well.GetPosY() + "]", new Font("Arial", 8), Brushes.Black, 15, PosY - ScrollShiftY); + + Rectangle CurrentRect = new Rectangle(5, PosY, 8, Size); + + + //SolidBrush CurrBrush = new SolidBrush(Colour); + + // draw the rectangle + // g.FillRectangle(CurrBrush, CurrentRect); + + for (int iDesc = 0; iDesc < CurrentDendo.InfoForHierarchical.ListInstances.numAttributes(); iDesc++) + { + // if (!GlobalInfo.CurrentScreen.ListDescriptors[iDesc].IsActive()) continue; + + // specify the rect shape + CurrentRect = new Rectangle(PosX + RealIdx * Size, PosY, Size, Size); + + // specify the color + //cDescriptor CurrentDesc = Well.ListDescriptors[iDesc]; + + byte[][] LUT = GlobalInfo.LUT; + + Min = CurrentDendo.InfoForHierarchical.ListMin[RealIdx]; + Max = CurrentDendo.InfoForHierarchical.ListMax[RealIdx]; + + if (Min == Max) + ConvertedValue = 0; + else + ConvertedValue = (int)(((CurrentInstance.value(iDesc) - Min) * (LUT[0].Length - 1)) / (Max - Min)); + if (ConvertedValue >= LUT[0].Length) ConvertedValue = LUT[0].Length - 1; + + SolidBrush CurrBrush = new SolidBrush(Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue])); + + // draw the rectangle + g.FillRectangle(CurrBrush, CurrentRect); + + RealIdx++; + } + return PosX + RealIdx * Size; + } + + + + + private void ReDrawDendo() { if (CurrentDendo == null) return; @@ -108,8 +173,9 @@ private void ReDrawDendo() int InitialShiftXForName = 60; int SizeSquareForSignature = this.panelForDendogram.Height / RealNumToDisp; - int SizeSquareForSignatureX = (this.panelForDendogram.Width-60) / GlobalInfo.CurrentScreen.GetNumberOfActiveDescriptor(); + int SizeSquareForSignatureX = (this.panelForDendogram.Width - 60) / CurrentDendo.InfoForHierarchical.ListInstances.numAttributes(); + if (SizeSquareForSignatureX < 0) SizeSquareForSignatureX = 0; if (SizeSquareForSignatureX < SizeSquareForSignature) SizeSquareForSignature = SizeSquareForSignatureX; @@ -133,6 +199,12 @@ private void ReDrawDendo() if (AssociatedWell != null) DrawSignature(AssociatedWell, SizeSquareForSignature, InitialShiftXForName, PosY - ScrollShiftY - (ShiftY / 2)); + else + DrawSignatureFromInstance(CurrentDendo.GetTree()[i].AssociatedInstance, SizeSquareForSignature, InitialShiftXForName, PosY - ScrollShiftY - (ShiftY / 2)); + + + + if (CurrentDendo.GetTree()[i].ConnectedWith == null) continue; diff --git a/Forms/IO/FormForCellByCellClusteringResults.resx b/Classes/Machine Learning/FormDendogram.resx similarity index 100% rename from Forms/IO/FormForCellByCellClusteringResults.resx rename to Classes/Machine Learning/FormDendogram.resx diff --git a/Forms/FormForClassificationTree.Designer.cs b/Classes/Machine Learning/FormForClassificationTree.Designer.cs similarity index 95% rename from Forms/FormForClassificationTree.Designer.cs rename to Classes/Machine Learning/FormForClassificationTree.Designer.cs index d57cc55..153b3cf 100644 --- a/Forms/FormForClassificationTree.Designer.cs +++ b/Classes/Machine Learning/FormForClassificationTree.Designer.cs @@ -45,7 +45,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.richTextBoxConsoleForClassification.Location = new System.Drawing.Point(-1, 3); this.richTextBoxConsoleForClassification.Name = "richTextBoxConsoleForClassification"; - this.richTextBoxConsoleForClassification.Size = new System.Drawing.Size(331, 484); + this.richTextBoxConsoleForClassification.Size = new System.Drawing.Size(141, 220); this.richTextBoxConsoleForClassification.TabIndex = 14; this.richTextBoxConsoleForClassification.Text = ""; // @@ -56,6 +56,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.gViewerForTreeClassif.AsyncLayout = false; this.gViewerForTreeClassif.AutoScroll = true; + this.gViewerForTreeClassif.AutoSize = true; this.gViewerForTreeClassif.BackwardEnabled = true; this.gViewerForTreeClassif.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.gViewerForTreeClassif.BuildHitTree = false; @@ -75,7 +76,7 @@ private void InitializeComponent() this.gViewerForTreeClassif.SaveButtonVisible = true; this.gViewerForTreeClassif.SaveGraphButtonVisible = true; this.gViewerForTreeClassif.SaveInVectorFormatEnabled = true; - this.gViewerForTreeClassif.Size = new System.Drawing.Size(564, 484); + this.gViewerForTreeClassif.Size = new System.Drawing.Size(242, 220); this.gViewerForTreeClassif.TabIndex = 13; this.gViewerForTreeClassif.ToolBarIsVisible = true; this.gViewerForTreeClassif.ZoomF = 1D; @@ -97,21 +98,22 @@ private void InitializeComponent() // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.richTextBoxConsoleForClassification); - this.splitContainer1.Size = new System.Drawing.Size(907, 490); - this.splitContainer1.SplitterDistance = 570; + this.splitContainer1.Size = new System.Drawing.Size(395, 226); + this.splitContainer1.SplitterDistance = 248; this.splitContainer1.TabIndex = 15; // // FormForClassificationTree // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(914, 495); + this.ClientSize = new System.Drawing.Size(402, 231); this.Controls.Add(this.splitContainer1); this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormForClassificationTree"; this.Text = "Classification Information"; this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); this.splitContainer1.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); diff --git a/Forms/FormForClassificationTree.cs b/Classes/Machine Learning/FormForClassificationTree.cs similarity index 100% rename from Forms/FormForClassificationTree.cs rename to Classes/Machine Learning/FormForClassificationTree.cs diff --git a/Forms/IO/FormForHistogramScreen.resx b/Classes/Machine Learning/FormForClassificationTree.resx similarity index 100% rename from Forms/IO/FormForHistogramScreen.resx rename to Classes/Machine Learning/FormForClassificationTree.resx diff --git a/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.Designer.cs b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.Designer.cs new file mode 100644 index 0000000..b7841ac --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.Designer.cs @@ -0,0 +1,83 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + partial class PanelForCellularPhenotypesColor + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.groupBox29 = new System.Windows.Forms.GroupBox(); + this.panelForCellularPhenotypes = new System.Windows.Forms.Panel(); + this.panel.SuspendLayout(); + this.groupBox29.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox29); + this.panel.Location = new System.Drawing.Point(71, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(269, 331); + this.panel.TabIndex = 2; + // + // groupBox29 + // + this.groupBox29.Controls.Add(this.panelForCellularPhenotypes); + this.groupBox29.Location = new System.Drawing.Point(3, 3); + this.groupBox29.Name = "groupBox29"; + this.groupBox29.Size = new System.Drawing.Size(263, 322); + this.groupBox29.TabIndex = 3; + this.groupBox29.TabStop = false; + this.groupBox29.Text = "Cellular Phenotypes"; + // + // panelForCellularPhenotypes + // + this.panelForCellularPhenotypes.Location = new System.Drawing.Point(6, 19); + this.panelForCellularPhenotypes.Name = "panelForCellularPhenotypes"; + this.panelForCellularPhenotypes.Size = new System.Drawing.Size(251, 298); + this.panelForCellularPhenotypes.TabIndex = 0; + // + // PanelForCellularPhenotypesColor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForCellularPhenotypesColor"; + this.Size = new System.Drawing.Size(411, 473); + this.panel.ResumeLayout(false); + this.groupBox29.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.GroupBox groupBox29; + public System.Windows.Forms.Panel panelForCellularPhenotypes; + + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.cs b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.cs new file mode 100644 index 0000000..c7bc516 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + public partial class PanelForCellularPhenotypesColor : UserControl + { + public PanelForCellularPhenotypesColor(cGlobalInfo GlobalInfo) + { + InitializeComponent(); + + this.panelForCellularPhenotypes.Controls.Add(new PanelForPhenotypeEditing(GlobalInfo)); + + } + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.resx b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForCellularPhenotypesColor.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/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.Designer.cs b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.Designer.cs new file mode 100644 index 0000000..aad8571 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.Designer.cs @@ -0,0 +1,350 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + partial class PanelForOptions3D + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.groupBox21 = new System.Windows.Forms.GroupBox(); + this.numericUpDownWellSize = new System.Windows.Forms.NumericUpDown(); + this.label27 = new System.Windows.Forms.Label(); + this.numericUpDownWellOpacity = new System.Windows.Forms.NumericUpDown(); + this.label25 = new System.Windows.Forms.Label(); + this.groupBoxForDRC = new System.Windows.Forms.GroupBox(); + this.checkBoxDRC = new System.Windows.Forms.CheckBox(); + this.numericUpDownDRCOpacity = new System.Windows.Forms.NumericUpDown(); + this.label26 = new System.Windows.Forms.Label(); + this.groupBoxForSurfaceAnalysis = new System.Windows.Forms.GroupBox(); + this.checkBox3DComputeThinPlate = new System.Windows.Forms.CheckBox(); + this.numericUpDown3DThinPlateRegularization = new System.Windows.Forms.NumericUpDown(); + this.label28 = new System.Windows.Forms.Label(); + this.checkBox3DDisplayThinPlate = new System.Windows.Forms.CheckBox(); + this.checkBox3DDisplayIsoRatioCurves = new System.Windows.Forms.CheckBox(); + this.checkBox3DDisplayIsoboles = new System.Windows.Forms.CheckBox(); + this.groupBox23 = new System.Windows.Forms.GroupBox(); + this.checkBox3DPlateInformation = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + this.groupBox21.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellSize)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellOpacity)).BeginInit(); + this.groupBoxForDRC.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDRCOpacity)).BeginInit(); + this.groupBoxForSurfaceAnalysis.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3DThinPlateRegularization)).BeginInit(); + this.groupBox23.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBox3DComputeThinPlate); + this.panel.Controls.Add(this.checkBoxDRC); + this.panel.Controls.Add(this.groupBox21); + this.panel.Controls.Add(this.groupBoxForDRC); + this.panel.Controls.Add(this.groupBoxForSurfaceAnalysis); + this.panel.Controls.Add(this.groupBox23); + this.panel.Location = new System.Drawing.Point(-1, -2); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(266, 335); + this.panel.TabIndex = 0; + // + // groupBox21 + // + this.groupBox21.Controls.Add(this.numericUpDownWellSize); + this.groupBox21.Controls.Add(this.label27); + this.groupBox21.Controls.Add(this.numericUpDownWellOpacity); + this.groupBox21.Controls.Add(this.label25); + this.groupBox21.Location = new System.Drawing.Point(5, 62); + this.groupBox21.Name = "groupBox21"; + this.groupBox21.Size = new System.Drawing.Size(255, 76); + this.groupBox21.TabIndex = 24; + this.groupBox21.TabStop = false; + this.groupBox21.Text = "Wells Display"; + // + // numericUpDownWellSize + // + this.numericUpDownWellSize.DecimalPlaces = 2; + this.numericUpDownWellSize.Location = new System.Drawing.Point(91, 47); + this.numericUpDownWellSize.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownWellSize.Name = "numericUpDownWellSize"; + this.numericUpDownWellSize.Size = new System.Drawing.Size(63, 20); + this.numericUpDownWellSize.TabIndex = 5; + this.numericUpDownWellSize.Value = new decimal(new int[] { + 9, + 0, + 0, + 65536}); + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(8, 51); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(49, 13); + this.label27.TabIndex = 4; + this.label27.Text = "Well size"; + // + // numericUpDownWellOpacity + // + this.numericUpDownWellOpacity.DecimalPlaces = 2; + this.numericUpDownWellOpacity.Location = new System.Drawing.Point(91, 21); + this.numericUpDownWellOpacity.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownWellOpacity.Name = "numericUpDownWellOpacity"; + this.numericUpDownWellOpacity.Size = new System.Drawing.Size(63, 20); + this.numericUpDownWellOpacity.TabIndex = 1; + this.numericUpDownWellOpacity.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(8, 25); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(65, 13); + this.label25.TabIndex = 0; + this.label25.Text = "Well opacity"; + // + // groupBoxForDRC + // + this.groupBoxForDRC.Controls.Add(this.numericUpDownDRCOpacity); + this.groupBoxForDRC.Controls.Add(this.label26); + this.groupBoxForDRC.Enabled = false; + this.groupBoxForDRC.Location = new System.Drawing.Point(5, 145); + this.groupBoxForDRC.Name = "groupBoxForDRC"; + this.groupBoxForDRC.Size = new System.Drawing.Size(255, 56); + this.groupBoxForDRC.TabIndex = 25; + this.groupBoxForDRC.TabStop = false; + this.groupBoxForDRC.Text = " "; + // + // checkBoxDRC + // + this.checkBoxDRC.AutoSize = true; + this.checkBoxDRC.Location = new System.Drawing.Point(15, 144); + this.checkBoxDRC.Name = "checkBoxDRC"; + this.checkBoxDRC.Size = new System.Drawing.Size(138, 17); + this.checkBoxDRC.TabIndex = 23; + this.checkBoxDRC.Text = "Dose Response Curves"; + this.checkBoxDRC.UseVisualStyleBackColor = true; + this.checkBoxDRC.CheckedChanged += new System.EventHandler(this.checkBoxDRC_CheckedChanged); + // + // numericUpDownDRCOpacity + // + this.numericUpDownDRCOpacity.DecimalPlaces = 2; + this.numericUpDownDRCOpacity.Location = new System.Drawing.Point(102, 23); + this.numericUpDownDRCOpacity.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownDRCOpacity.Name = "numericUpDownDRCOpacity"; + this.numericUpDownDRCOpacity.Size = new System.Drawing.Size(63, 20); + this.numericUpDownDRCOpacity.TabIndex = 3; + this.numericUpDownDRCOpacity.Value = new decimal(new int[] { + 7, + 0, + 0, + 65536}); + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(20, 26); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(67, 13); + this.label26.TabIndex = 2; + this.label26.Text = "DRC opacity"; + // + // groupBoxForSurfaceAnalysis + // + this.groupBoxForSurfaceAnalysis.Controls.Add(this.numericUpDown3DThinPlateRegularization); + this.groupBoxForSurfaceAnalysis.Controls.Add(this.label28); + this.groupBoxForSurfaceAnalysis.Controls.Add(this.checkBox3DDisplayThinPlate); + this.groupBoxForSurfaceAnalysis.Controls.Add(this.checkBox3DDisplayIsoRatioCurves); + this.groupBoxForSurfaceAnalysis.Controls.Add(this.checkBox3DDisplayIsoboles); + this.groupBoxForSurfaceAnalysis.Enabled = false; + this.groupBoxForSurfaceAnalysis.Location = new System.Drawing.Point(5, 207); + this.groupBoxForSurfaceAnalysis.Name = "groupBoxForSurfaceAnalysis"; + this.groupBoxForSurfaceAnalysis.Size = new System.Drawing.Size(255, 121); + this.groupBoxForSurfaceAnalysis.TabIndex = 26; + this.groupBoxForSurfaceAnalysis.TabStop = false; + this.groupBoxForSurfaceAnalysis.Text = " "; + // + // checkBox3DComputeThinPlate + // + this.checkBox3DComputeThinPlate.AutoSize = true; + this.checkBox3DComputeThinPlate.Location = new System.Drawing.Point(15, 207); + this.checkBox3DComputeThinPlate.Name = "checkBox3DComputeThinPlate"; + this.checkBox3DComputeThinPlate.Size = new System.Drawing.Size(104, 17); + this.checkBox3DComputeThinPlate.TabIndex = 22; + this.checkBox3DComputeThinPlate.Text = "Surface Analysis"; + this.checkBox3DComputeThinPlate.UseVisualStyleBackColor = true; + this.checkBox3DComputeThinPlate.CheckedChanged += new System.EventHandler(this.checkBox3DComputeThinPlate_CheckedChanged); + // + // numericUpDown3DThinPlateRegularization + // + this.numericUpDown3DThinPlateRegularization.DecimalPlaces = 2; + this.numericUpDown3DThinPlateRegularization.Location = new System.Drawing.Point(134, 46); + this.numericUpDown3DThinPlateRegularization.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.numericUpDown3DThinPlateRegularization.Name = "numericUpDown3DThinPlateRegularization"; + this.numericUpDown3DThinPlateRegularization.Size = new System.Drawing.Size(63, 20); + this.numericUpDown3DThinPlateRegularization.TabIndex = 5; + this.numericUpDown3DThinPlateRegularization.Value = new decimal(new int[] { + 15, + 0, + 0, + 131072}); + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(54, 48); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(74, 13); + this.label28.TabIndex = 4; + this.label28.Text = "Regularization"; + // + // checkBox3DDisplayThinPlate + // + this.checkBox3DDisplayThinPlate.AutoSize = true; + this.checkBox3DDisplayThinPlate.Checked = true; + this.checkBox3DDisplayThinPlate.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox3DDisplayThinPlate.Location = new System.Drawing.Point(20, 24); + this.checkBox3DDisplayThinPlate.Name = "checkBox3DDisplayThinPlate"; + this.checkBox3DDisplayThinPlate.Size = new System.Drawing.Size(100, 17); + this.checkBox3DDisplayThinPlate.TabIndex = 4; + this.checkBox3DDisplayThinPlate.Text = "Display Surface"; + this.checkBox3DDisplayThinPlate.UseVisualStyleBackColor = true; + // + // checkBox3DDisplayIsoRatioCurves + // + this.checkBox3DDisplayIsoRatioCurves.AutoSize = true; + this.checkBox3DDisplayIsoRatioCurves.Checked = true; + this.checkBox3DDisplayIsoRatioCurves.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox3DDisplayIsoRatioCurves.Location = new System.Drawing.Point(19, 74); + this.checkBox3DDisplayIsoRatioCurves.Name = "checkBox3DDisplayIsoRatioCurves"; + this.checkBox3DDisplayIsoRatioCurves.Size = new System.Drawing.Size(135, 17); + this.checkBox3DDisplayIsoRatioCurves.TabIndex = 3; + this.checkBox3DDisplayIsoRatioCurves.Text = "Display Iso ratio curves"; + this.checkBox3DDisplayIsoRatioCurves.UseVisualStyleBackColor = true; + // + // checkBox3DDisplayIsoboles + // + this.checkBox3DDisplayIsoboles.AutoSize = true; + this.checkBox3DDisplayIsoboles.Checked = true; + this.checkBox3DDisplayIsoboles.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox3DDisplayIsoboles.Location = new System.Drawing.Point(19, 97); + this.checkBox3DDisplayIsoboles.Name = "checkBox3DDisplayIsoboles"; + this.checkBox3DDisplayIsoboles.Size = new System.Drawing.Size(102, 17); + this.checkBox3DDisplayIsoboles.TabIndex = 3; + this.checkBox3DDisplayIsoboles.Text = "Display Isoboles"; + this.checkBox3DDisplayIsoboles.UseVisualStyleBackColor = true; + // + // groupBox23 + // + this.groupBox23.Controls.Add(this.checkBox3DPlateInformation); + this.groupBox23.Location = new System.Drawing.Point(3, 3); + this.groupBox23.Name = "groupBox23"; + this.groupBox23.Size = new System.Drawing.Size(257, 55); + this.groupBox23.TabIndex = 23; + this.groupBox23.TabStop = false; + this.groupBox23.Text = "Plate Display"; + // + // checkBox3DPlateInformation + // + this.checkBox3DPlateInformation.AutoSize = true; + this.checkBox3DPlateInformation.Checked = true; + this.checkBox3DPlateInformation.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox3DPlateInformation.Location = new System.Drawing.Point(11, 23); + this.checkBox3DPlateInformation.Name = "checkBox3DPlateInformation"; + this.checkBox3DPlateInformation.Size = new System.Drawing.Size(142, 17); + this.checkBox3DPlateInformation.TabIndex = 5; + this.checkBox3DPlateInformation.Text = "Display Plate Information"; + this.checkBox3DPlateInformation.UseVisualStyleBackColor = true; + // + // PanelForOptions3D + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForOptions3D"; + this.Size = new System.Drawing.Size(486, 568); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.groupBox21.ResumeLayout(false); + this.groupBox21.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellSize)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellOpacity)).EndInit(); + this.groupBoxForDRC.ResumeLayout(false); + this.groupBoxForDRC.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDRCOpacity)).EndInit(); + this.groupBoxForSurfaceAnalysis.ResumeLayout(false); + this.groupBoxForSurfaceAnalysis.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3DThinPlateRegularization)).EndInit(); + this.groupBox23.ResumeLayout(false); + this.groupBox23.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.GroupBox groupBox23; + public System.Windows.Forms.CheckBox checkBox3DPlateInformation; + private System.Windows.Forms.GroupBox groupBox21; + public System.Windows.Forms.NumericUpDown numericUpDownWellSize; + private System.Windows.Forms.Label label27; + public System.Windows.Forms.NumericUpDown numericUpDownWellOpacity; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.GroupBox groupBoxForDRC; + public System.Windows.Forms.CheckBox checkBoxDRC; + public System.Windows.Forms.NumericUpDown numericUpDownDRCOpacity; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.GroupBox groupBoxForSurfaceAnalysis; + public System.Windows.Forms.CheckBox checkBox3DComputeThinPlate; + public System.Windows.Forms.NumericUpDown numericUpDown3DThinPlateRegularization; + private System.Windows.Forms.Label label28; + public System.Windows.Forms.CheckBox checkBox3DDisplayThinPlate; + public System.Windows.Forms.CheckBox checkBox3DDisplayIsoRatioCurves; + public System.Windows.Forms.CheckBox checkBox3DDisplayIsoboles; + + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.cs b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.cs new file mode 100644 index 0000000..fa2dda9 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + public partial class PanelForOptions3D : UserControl + { + public PanelForOptions3D() + { + InitializeComponent(); + } + + + private void checkBox3DComputeThinPlate_CheckedChanged(object sender, EventArgs e) + { + this.groupBoxForSurfaceAnalysis.Enabled = this.checkBox3DComputeThinPlate.Checked; + } + + private void checkBoxDRC_CheckedChanged(object sender, EventArgs e) + { + this.groupBoxForDRC.Enabled = this.checkBoxDRC.Checked; + } + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.resx b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForOptions3D.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/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.Designer.cs b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.Designer.cs new file mode 100644 index 0000000..825ce01 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.Designer.cs @@ -0,0 +1,206 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + partial class PanelForPlatesandWells + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.numericUpDownGutter = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBoxForWellInfo = new System.Windows.Forms.GroupBox(); + this.radioButtonWellInfoDescValue = new System.Windows.Forms.RadioButton(); + this.radioButtonWellInfoConcentration = new System.Windows.Forms.RadioButton(); + this.radioButtonWellInfoLocusID = new System.Windows.Forms.RadioButton(); + this.radioButtonWellInfoInfo = new System.Windows.Forms.RadioButton(); + this.radioButtonWellInfoName = new System.Windows.Forms.RadioButton(); + this.checkBoxDisplayWellInformation = new System.Windows.Forms.CheckBox(); + this.panel.SuspendLayout(); + this.groupBox6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGutter)).BeginInit(); + this.groupBoxForWellInfo.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.checkBoxDisplayWellInformation); + this.panel.Controls.Add(this.groupBox6); + this.panel.Controls.Add(this.groupBoxForWellInfo); + this.panel.Location = new System.Drawing.Point(45, 21); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(269, 263); + this.panel.TabIndex = 1; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.numericUpDownGutter); + this.groupBox6.Controls.Add(this.label3); + this.groupBox6.Location = new System.Drawing.Point(6, 150); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(257, 53); + this.groupBox6.TabIndex = 20; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Plate Design"; + // + // numericUpDownGutter + // + this.numericUpDownGutter.Location = new System.Drawing.Point(50, 21); + this.numericUpDownGutter.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.numericUpDownGutter.Name = "numericUpDownGutter"; + this.numericUpDownGutter.Size = new System.Drawing.Size(97, 20); + this.numericUpDownGutter.TabIndex = 1; + this.numericUpDownGutter.Value = new decimal(new int[] { + 4, + 0, + 0, + 0}); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(8, 23); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(36, 13); + this.label3.TabIndex = 0; + this.label3.Text = "Gutter"; + // + // groupBoxForWellInfo + // + this.groupBoxForWellInfo.Controls.Add(this.radioButtonWellInfoDescValue); + this.groupBoxForWellInfo.Controls.Add(this.radioButtonWellInfoConcentration); + this.groupBoxForWellInfo.Controls.Add(this.radioButtonWellInfoLocusID); + this.groupBoxForWellInfo.Controls.Add(this.radioButtonWellInfoInfo); + this.groupBoxForWellInfo.Controls.Add(this.radioButtonWellInfoName); + this.groupBoxForWellInfo.Enabled = false; + this.groupBoxForWellInfo.Location = new System.Drawing.Point(6, 8); + this.groupBoxForWellInfo.Name = "groupBoxForWellInfo"; + this.groupBoxForWellInfo.Size = new System.Drawing.Size(257, 136); + this.groupBoxForWellInfo.TabIndex = 19; + this.groupBoxForWellInfo.TabStop = false; + this.groupBoxForWellInfo.Text = " "; + // + // radioButtonWellInfoDescValue + // + this.radioButtonWellInfoDescValue.AutoSize = true; + this.radioButtonWellInfoDescValue.Location = new System.Drawing.Point(11, 42); + this.radioButtonWellInfoDescValue.Name = "radioButtonWellInfoDescValue"; + this.radioButtonWellInfoDescValue.Size = new System.Drawing.Size(82, 17); + this.radioButtonWellInfoDescValue.TabIndex = 20; + this.radioButtonWellInfoDescValue.Text = "Mean Value"; + this.radioButtonWellInfoDescValue.UseVisualStyleBackColor = true; + // + // radioButtonWellInfoConcentration + // + this.radioButtonWellInfoConcentration.AutoSize = true; + this.radioButtonWellInfoConcentration.Location = new System.Drawing.Point(11, 111); + this.radioButtonWellInfoConcentration.Name = "radioButtonWellInfoConcentration"; + this.radioButtonWellInfoConcentration.Size = new System.Drawing.Size(91, 17); + this.radioButtonWellInfoConcentration.TabIndex = 19; + this.radioButtonWellInfoConcentration.Text = "Concentration"; + this.radioButtonWellInfoConcentration.UseVisualStyleBackColor = true; + // + // radioButtonWellInfoLocusID + // + this.radioButtonWellInfoLocusID.AutoSize = true; + this.radioButtonWellInfoLocusID.Location = new System.Drawing.Point(11, 88); + this.radioButtonWellInfoLocusID.Name = "radioButtonWellInfoLocusID"; + this.radioButtonWellInfoLocusID.Size = new System.Drawing.Size(68, 17); + this.radioButtonWellInfoLocusID.TabIndex = 19; + this.radioButtonWellInfoLocusID.Text = "Locus ID"; + this.radioButtonWellInfoLocusID.UseVisualStyleBackColor = true; + // + // radioButtonWellInfoInfo + // + this.radioButtonWellInfoInfo.AutoSize = true; + this.radioButtonWellInfoInfo.Location = new System.Drawing.Point(11, 65); + this.radioButtonWellInfoInfo.Name = "radioButtonWellInfoInfo"; + this.radioButtonWellInfoInfo.Size = new System.Drawing.Size(43, 17); + this.radioButtonWellInfoInfo.TabIndex = 19; + this.radioButtonWellInfoInfo.Text = "Info"; + this.radioButtonWellInfoInfo.UseVisualStyleBackColor = true; + // + // radioButtonWellInfoName + // + this.radioButtonWellInfoName.AutoSize = true; + this.radioButtonWellInfoName.Checked = true; + this.radioButtonWellInfoName.Location = new System.Drawing.Point(11, 19); + this.radioButtonWellInfoName.Name = "radioButtonWellInfoName"; + this.radioButtonWellInfoName.Size = new System.Drawing.Size(53, 17); + this.radioButtonWellInfoName.TabIndex = 19; + this.radioButtonWellInfoName.TabStop = true; + this.radioButtonWellInfoName.Text = "Name"; + this.radioButtonWellInfoName.UseVisualStyleBackColor = true; + // + // checkBoxDisplayWellInformation + // + this.checkBoxDisplayWellInformation.AutoSize = true; + this.checkBoxDisplayWellInformation.Location = new System.Drawing.Point(16, 5); + this.checkBoxDisplayWellInformation.Name = "checkBoxDisplayWellInformation"; + this.checkBoxDisplayWellInformation.Size = new System.Drawing.Size(135, 17); + this.checkBoxDisplayWellInformation.TabIndex = 18; + this.checkBoxDisplayWellInformation.Text = "Display well information"; + this.checkBoxDisplayWellInformation.UseVisualStyleBackColor = true; + this.checkBoxDisplayWellInformation.CheckedChanged += new System.EventHandler(this.checkBoxDisplayWellInformation_CheckedChanged); + // + // PanelForPlatesandWells + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForPlatesandWells"; + this.Size = new System.Drawing.Size(539, 428); + this.panel.ResumeLayout(false); + this.panel.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownGutter)).EndInit(); + this.groupBoxForWellInfo.ResumeLayout(false); + this.groupBoxForWellInfo.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.GroupBox groupBox6; + public System.Windows.Forms.NumericUpDown numericUpDownGutter; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBoxForWellInfo; + public System.Windows.Forms.RadioButton radioButtonWellInfoDescValue; + public System.Windows.Forms.RadioButton radioButtonWellInfoConcentration; + public System.Windows.Forms.RadioButton radioButtonWellInfoLocusID; + public System.Windows.Forms.RadioButton radioButtonWellInfoInfo; + public System.Windows.Forms.RadioButton radioButtonWellInfoName; + public System.Windows.Forms.CheckBox checkBoxDisplayWellInformation; + + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.cs b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.cs new file mode 100644 index 0000000..070e9dd --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + public partial class PanelForPlatesandWells : UserControl + { + public PanelForPlatesandWells() + { + InitializeComponent(); + } + + private void checkBoxDisplayWellInformation_CheckedChanged(object sender, EventArgs e) + { + groupBoxForWellInfo.Enabled = checkBoxDisplayWellInformation.Checked; + } + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.resx b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForPlatesandWells.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/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.Designer.cs b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.Designer.cs new file mode 100644 index 0000000..1edb4eb --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.Designer.cs @@ -0,0 +1,82 @@ +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + partial class PanelForWellClassesColor + { + /// + /// 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.panel = new System.Windows.Forms.Panel(); + this.groupBox28 = new System.Windows.Forms.GroupBox(); + this.panelForWellClasses = new System.Windows.Forms.Panel(); + this.panel.SuspendLayout(); + this.groupBox28.SuspendLayout(); + this.SuspendLayout(); + // + // panel + // + this.panel.Controls.Add(this.groupBox28); + this.panel.Location = new System.Drawing.Point(17, 3); + this.panel.Name = "panel"; + this.panel.Size = new System.Drawing.Size(269, 295); + this.panel.TabIndex = 2; + // + // groupBox28 + // + this.groupBox28.Controls.Add(this.panelForWellClasses); + this.groupBox28.Location = new System.Drawing.Point(3, 3); + this.groupBox28.Name = "groupBox28"; + this.groupBox28.Size = new System.Drawing.Size(263, 288); + this.groupBox28.TabIndex = 2; + this.groupBox28.TabStop = false; + this.groupBox28.Text = "Well Classes"; + // + // panelForWellClasses + // + this.panelForWellClasses.Location = new System.Drawing.Point(6, 19); + this.panelForWellClasses.Name = "panelForWellClasses"; + this.panelForWellClasses.Size = new System.Drawing.Size(251, 264); + this.panelForWellClasses.TabIndex = 0; + // + // PanelForWellClassesColor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.panel); + this.Name = "PanelForWellClassesColor"; + this.Size = new System.Drawing.Size(303, 441); + this.panel.ResumeLayout(false); + this.groupBox28.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Panel panel; + private System.Windows.Forms.GroupBox groupBox28; + public System.Windows.Forms.Panel panelForWellClasses; + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.cs b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.cs new file mode 100644 index 0000000..06d97bc --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions.PanelForOptions +{ + public partial class PanelForWellClassesColor : UserControl + { + public PanelForWellClassesColor(cGlobalInfo GlobalInfo) + { + InitializeComponent(); + + this.panelForWellClasses.Controls.Add(new PanelForClassEditing(GlobalInfo)); + + //Controls.Add(new PanelForClassEditing(this)); + //panelForCellularPhenotypes.Controls.Add(new PanelForPhenotypeEditing(this)); + + + } + } +} diff --git a/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.resx b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Classes/Machine Learning/PanelForOptions/PanelForWellClassesColor.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/Classes/cDendoGram.cs b/Classes/Machine Learning/cDendoGram.cs similarity index 89% rename from Classes/cDendoGram.cs rename to Classes/Machine Learning/cDendoGram.cs index 33ff800..a6f6cc1 100644 --- a/Classes/cDendoGram.cs +++ b/Classes/Machine Learning/cDendoGram.cs @@ -8,16 +8,108 @@ using weka.clusterers; using weka.core; using weka.core.neighboursearch; +using System.Windows.Forms; namespace HCSAnalyzer.Classes { public class cDendoGram - { - public class Node + { + private cOurTree OurTree; + private System.Windows.Forms.Panel PanelDendogram; + cGlobalInfo GlobalInfo; + public cInfoForHierarchical InfoForHierarchical; + int NumClusters; + + public cDendoGram(cGlobalInfo GlobalInfo, Instances ListInstances, int NumClusters) + { + this.GlobalInfo = GlobalInfo; + InfoForHierarchical = new cInfoForHierarchical(); + InfoForHierarchical.ListInstances = ListInstances; + this.NumClusters = NumClusters; + + this.InfoForHierarchical.UpDateMinMax(); + + RunClustering(); + } + + + public cDendoGram(cGlobalInfo GlobalInfo, bool IsFullScreen, int NumClusters) + { + this.GlobalInfo = GlobalInfo; + this.NumClusters = NumClusters; + this.InfoForHierarchical = null; + + if (IsFullScreen) + this.InfoForHierarchical = GlobalInfo.CurrentScreen.CreateInstancesWithUniqueClasse(); + else + this.InfoForHierarchical = GlobalInfo.CurrentScreen.GetCurrentDisplayPlate().CreateInstancesWithUniqueClasse(); + + this.InfoForHierarchical.UpDateMinMax(GlobalInfo.CurrentScreen); + + RunClustering(); + } + + + void RunClustering() { + weka.clusterers.HierarchicalClusterer HClusterer = new HierarchicalClusterer(); + + string OptionDistance = " -A \"weka.core."; + //string OptionDistance = ""; + + switch (GlobalInfo.OptionsWindow.comboBoxHierarchicalDistance.SelectedIndex) + { + case 0: + //OptionDistance += "BhattacharyyaDistance"; + OptionDistance += "EuclideanDistance"; + break; + case 1: + OptionDistance += "ManhattanDistance"; + break; + case 2: + OptionDistance += "ChebyshevDistance"; + break; + default: + break; + } + + OptionDistance += " -R first-last\""; + + + string[] TAGS_LINK_TYPE = { "SINGLE", "COMPLETE","AVERAGE", "MEAN", "CENTROID", "WARD", "ADJCOMPLETE"}; + + string WekaOption = "-L " + TAGS_LINK_TYPE[GlobalInfo.OptionsWindow.comboBoxHierarchicalLinkType.SelectedIndex] + OptionDistance; + + HClusterer.setOptions(weka.core.Utils.splitOptions(WekaOption)); + + //BhattacharyyaDistance Dist2 = new BhattacharyyaDistance(); + //HClusterer.setDistanceFunction(Dist2); + + HClusterer.setNumClusters(NumClusters); + if (this.InfoForHierarchical.ListInstances.numInstances() < 2) + { + MessageBox.Show("You need at least 2 instances to perform this clustering", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + HClusterer.buildClusterer(this.InfoForHierarchical.ListInstances); + + GenerateDendogram(HClusterer.graph(), TAGS_LINK_TYPE[GlobalInfo.OptionsWindow.comboBoxHierarchicalLinkType.SelectedIndex], GlobalInfo.OptionsWindow.comboBoxHierarchicalDistance.SelectedItem.ToString()); + } + + public cDendoGram(HierarchicalClusterer GeneratedHierarchicalClusterer, cGlobalInfo GlobalInfo) + { + this.GlobalInfo = GlobalInfo; + GenerateDendogram(GeneratedHierarchicalClusterer.graph(), + GeneratedHierarchicalClusterer.getLinkType().toString(), + GeneratedHierarchicalClusterer.getDistanceFunction().ToString()); + + } + public class Node + { public string Name; public double BranchLenght; @@ -28,6 +120,8 @@ public class Node //public double PosX; public Node ConnectedWith; public cWell AssociatedWell = null; + public weka.core.Instance AssociatedInstance = null; + public Node(string Name, double Lenght, double PosY, double PosX) { @@ -36,6 +130,7 @@ public Node(string Name, double Lenght, double PosY, double PosX) this.PosY = PosY; this.PosXCorner = PosX + this.BranchLenght; this.PosX = PosX; + } } @@ -93,7 +188,12 @@ public List ProcessConnection(string LigneToProcess) Node1 = new Node(Name, BranchLenght, CurrentIdx++, 0); if (Name.IndexOf("Input") == -1) { - Node1.AssociatedWell = OurDendo.InfoForHierarchical.ListIndexedWells[(int)(double.Parse(Name))]; + if (OurDendo.InfoForHierarchical.ListIndexedWells.Count > 0) + { + int ValPos = (int)(double.Parse(Name)); + Node1.AssociatedWell = OurDendo.InfoForHierarchical.ListIndexedWells[ValPos]; + Node1.AssociatedInstance = OurDendo.InfoForHierarchical.ListInstances.instance(ValPos); + } } } Values = DoubleNode[1].Split(':'); @@ -115,7 +215,12 @@ public List ProcessConnection(string LigneToProcess) Node2 = new Node(Name, BranchLenght, CurrentIdx++, 0); if (Name.IndexOf("Input") == -1) { - Node2.AssociatedWell = OurDendo.InfoForHierarchical.ListIndexedWells[(int)(double.Parse(Name))]; + if (OurDendo.InfoForHierarchical.ListIndexedWells.Count > 0) + { + int ValPos = (int)(double.Parse(Name)); + Node2.AssociatedWell = OurDendo.InfoForHierarchical.ListIndexedWells[ValPos]; + Node2.AssociatedInstance = OurDendo.InfoForHierarchical.ListInstances.instance(ValPos); + } } } @@ -181,16 +286,11 @@ public cOurTree ParseString(string Ligne) } } - private cOurTree OurTree; - private System.Windows.Forms.Panel PanelDendogram; - cGlobalInfo GlobalInfo; - public cInfoForHierarchical InfoForHierarchical; - private void GenerateDendogram(string ToProcess, string LinkType, string Distance) { ClassNewickParser NewickParser = new ClassNewickParser(); NewickParser.OurDendo = this; - FormDendogram DendogramDisplay = new FormDendogram(); + FormDendogram DendogramDisplay = new FormDendogram(this.GlobalInfo); PanelDendogram = DendogramDisplay.panelForDendogram; @@ -449,59 +549,6 @@ public override String getRevision() } - public cDendoGram(cGlobalInfo GlobalInfo, bool IsFullScreen) - { - this.GlobalInfo = GlobalInfo; - - this.InfoForHierarchical = null; - - if (IsFullScreen) - this.InfoForHierarchical = GlobalInfo.CurrentScreen.CreateInstancesWithUniqueClasse(); - else - this.InfoForHierarchical = GlobalInfo.CurrentScreen.GetCurrentDisplayPlate().CreateInstancesWithUniqueClasse(); - - this.InfoForHierarchical.UpDateMinMax(GlobalInfo.CurrentScreen); - - weka.clusterers.HierarchicalClusterer HClusterer = new HierarchicalClusterer(); - - string OptionDistance = " -A \"weka.core."; - //string OptionDistance = ""; - - switch (GlobalInfo.OptionsWindow.comboBoxHierarchicalDistance.SelectedIndex) - { - case 0: - //OptionDistance += "BhattacharyyaDistance"; - OptionDistance += "EuclideanDistance"; - break; - case 1: - OptionDistance += "ManhattanDistance"; - break; - case 2: - OptionDistance += "ChebyshevDistance"; - break; - default: - break; - } - - OptionDistance += " -R first-last\""; - - - string[] TAGS_LINK_TYPE = { "SINGLE", "COMPLETE","AVERAGE", "MEAN", "CENTROID", "WARD", "ADJCOMPLETE"}; - - string WekaOption = "-L " + TAGS_LINK_TYPE[GlobalInfo.OptionsWindow.comboBoxHierarchicalLinkType.SelectedIndex] + OptionDistance; - - HClusterer.setOptions(weka.core.Utils.splitOptions(WekaOption)); - - //BhattacharyyaDistance Dist2 = new BhattacharyyaDistance(); - //HClusterer.setDistanceFunction(Dist2); - - HClusterer.setNumClusters(1); - HClusterer.buildClusterer(this.InfoForHierarchical.Ninsts); - - GenerateDendogram(HClusterer.graph(), TAGS_LINK_TYPE[GlobalInfo.OptionsWindow.comboBoxHierarchicalLinkType.SelectedIndex], GlobalInfo.OptionsWindow.comboBoxHierarchicalDistance.SelectedItem.ToString()); - } - - public cOurTree GetTree() { return this.OurTree; @@ -553,10 +600,5 @@ private Microsoft.Msagl.Drawing.Graph ComputeAndDisplayGraph() } - - - - - } } diff --git a/Classes/Machine Learning/cMachineLearning.cs b/Classes/Machine Learning/cMachineLearning.cs new file mode 100644 index 0000000..3b24a89 --- /dev/null +++ b/Classes/Machine Learning/cMachineLearning.cs @@ -0,0 +1,761 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using weka.clusterers; +using weka.core; +using HCSAnalyzer.Forms.FormsForOptions; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using System.Windows; +using System.Windows.Forms; +using System.Data; +using weka.classifiers; +using HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo; +using weka.classifiers.trees; +using Microsoft.Msagl.GraphViewerGdi; +using HCSAnalyzer.Forms; +using weka.classifiers.functions; +using weka.classifiers.rules; +using weka.classifiers.bayes; +using weka.classifiers.lazy; +using LibPlateAnalysis; +using HCSAnalyzer.Forms.IO; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Classes.Machine_Learning +{ + + public class cClusteringObject + { + public Evaluation Evaluation; + public Classifier Model; + public int FoldNumber; + + public cClusteringObject(Classifier Model, Evaluation Evaluation, int NumFolds) + { + this.FoldNumber = NumFolds; + this.Model = Model; + this.Evaluation = Evaluation; + } + } + + public class cMachineLearning + { + cGlobalInfo GlobalInfo; + public int NumberOfClusters { get; private set; } + // public Instances ListInstancesWithoutClasses; + public FastVector attValsWithoutClasses; + // public FastVector attValsWithClasses; + public Clusterer SelectedClusterer; + public Classifier CurrentClassifier; + DataTable dt; + public cExtendedList Classes = new cExtendedList(); + List ListDescriptors = new List(); + + public cMachineLearning(cGlobalInfo GlobalInfo) + { + this.GlobalInfo = GlobalInfo; + } + + //public cMachineLearning(cGlobalInfo GlobalInfo, Instances ListIntancesWithoutClasses) + //{ + // this.GlobalInfo = GlobalInfo; + // this.ListInstancesWithoutClasses = ListIntancesWithoutClasses; + + //} + + #region Clustering + public cParamAlgo AskAndGetClusteringAlgo() + { + FormForClusteringInfo WindowForClusteringParam = new FormForClusteringInfo(this.ListDescriptors, this.GlobalInfo); + if (WindowForClusteringParam.ShowDialog() != System.Windows.Forms.DialogResult.OK) return null; + + return WindowForClusteringParam.GetSelectedAlgoAndParameters(); + } + + /// + /// display a GUI and generate the WEKA based clusterer + /// + /// list of the weka instance + /// weka clusterer + public Clusterer BuildClusterer(cParamAlgo ClusteringAlgo, DataTable dt) + { + // FormForClusteringInfo WindowForClusteringParam = new FormForClusteringInfo(this.ListDescriptors, this.GlobalInfo); + // if (WindowForClusteringParam.ShowDialog() != System.Windows.Forms.DialogResult.OK) return null; + + // = AskAndGetAlgo(); + + this.dt = dt; + foreach (DataColumn item in dt.Columns) + { + this.ListDescriptors.Add(item.Caption); + } + + cListValuesParam Parameters = ClusteringAlgo.GetListValuesParam(); + + Clusterer ClustererToReturn = null; + Instances ListInstancesWithoutClasses = CreateInstancesWithoutClass(dt); + #region EM + if (ClusteringAlgo.Name == "EM") + { + ClustererToReturn = new EM(); + + if (Parameters.ListCheckValues.Get("checkBoxAutomatedClassNum").Value) + ((EM)ClustererToReturn).setNumClusters(-1); + else + ((EM)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); + + ((EM)ClustererToReturn).setMaxIterations((int)Parameters.ListDoubleValues.Get("numericUpDownMaxIterations").Value); + ((EM)ClustererToReturn).setMinStdDev((double)Parameters.ListDoubleValues.Get("numericUpDownMinStdev").Value); + ((EM)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + } + #endregion + #region K Means + else if (ClusteringAlgo.Name == "K-Means") + { + ClustererToReturn = new SimpleKMeans(); + ((SimpleKMeans)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); + ((SimpleKMeans)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + + string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; + + if (DistanceType == "Euclidean") + { + EuclideanDistance ED = new EuclideanDistance(); + ED.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); + ((SimpleKMeans)ClustererToReturn).setDistanceFunction(ED); + } + else if (DistanceType == "Manhattan") + { + ManhattanDistance MD = new ManhattanDistance(); + MD.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); + ((SimpleKMeans)ClustererToReturn).setDistanceFunction(MD); + } + else return null; + ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + } + #endregion + //#region K Means++ + //else if (ClusteringAlgo.Name == "K-Means++") + //{ + // ClustererToReturn = new SimpleKMeans(); + // ((SimpleKMeans)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); + // ((SimpleKMeans)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + + // string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; + + // if (DistanceType == "Euclidean") + // { + // EuclideanDistance ED = new EuclideanDistance(); + // ED.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); + // ((SimpleKMeans)ClustererToReturn).setDistanceFunction(ED); + // } + // else if (DistanceType == "Manhattan") + // { + // ManhattanDistance MD = new ManhattanDistance(); + // MD.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); + // ((SimpleKMeans)ClustererToReturn).setDistanceFunction(MD); + // } + // else return null; + // ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + // this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + //} + //#endregion + + #region hierarchical + else if (ClusteringAlgo.Name == "Hierarchical") + { + ClustererToReturn = new weka.clusterers.HierarchicalClusterer(); + string OptionDistance = " -N " + (int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value; + + string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; + OptionDistance += " -A \"weka.core."; + switch (DistanceType) + { + case "Euclidean": + OptionDistance += "EuclideanDistance"; + break; + case "Manhattan": + OptionDistance += "ManhattanDistance"; + break; + case "Chebyshev": + OptionDistance += "ChebyshevDistance"; + break; + default: + break; + } + + if (!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value) + OptionDistance += " -D"; + OptionDistance += " -R "; + + + OptionDistance += "first-last\""; + string WekaOption = "-L " + (string)Parameters.ListTextValues.Get("comboBoxLinkType").Value + OptionDistance; + ((HierarchicalClusterer)ClustererToReturn).setOptions(weka.core.Utils.splitOptions(WekaOption)); + + ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + } + #endregion + #region Farthest First + else if (ClusteringAlgo.Name == "FarthestFirst") + { + ClustererToReturn = new weka.clusterers.FarthestFirst(); + + ((FarthestFirst)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); + ((FarthestFirst)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + } + #endregion + #region CobWeb + else if (ClusteringAlgo.Name == "CobWeb") + { + ClustererToReturn = new weka.clusterers.Cobweb(); + + ((Cobweb)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + ((Cobweb)ClustererToReturn).setAcuity((double)Parameters.ListDoubleValues.Get("numericUpDownAcuity").Value); + ((Cobweb)ClustererToReturn).setCutoff((double)Parameters.ListDoubleValues.Get("numericUpDownCutOff").Value); + ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); + + this.NumberOfClusters = ClustererToReturn.numberOfClusters(); + } + #endregion + #region Manual + else if (ClusteringAlgo.Name == "Manual") + { + string DescriptorName = (string)Parameters.ListTextValues.Get("comboBoxForDescriptorManualClustering").Value; + + // this.Classes = new double[ListInstancesWithoutClasses.numInstances()]; + + for (int IdxPt = 0; IdxPt < this.Classes.Count/2; IdxPt++) + { + this.Classes[IdxPt] = 2; + } + this.NumberOfClusters = 2; + // break; + + //int IdxDesc = -1; + //foreach (string item in this.ListDescriptors) + //{ + // IdxDesc++; + // if (item == DescriptorName) break; + //} + + //int Idx=0; + + + //foreach (Instance item in ListInstancesWithoutClasses) + //{ + // this.Classes.Add(((int)item.value(IdxDesc)) % GlobalInfo.GetNumberofDefinedCellularPhenotypes()); + //} + + //// re - ordonner les valeurs du discripteur afin que les classes se suivent sans laisser de classe vide !! + //this.NumberOfClusters = GlobalInfo.GetNumberofDefinedCellularPhenotypes(); + } + #endregion + + else + { + System.Windows.Forms.MessageBox.Show("Clustering method not implemented !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } + return ClustererToReturn; + } + + /// + /// Evalute and display a WEKA clusterer + /// + /// weka clusterer + /// list of instances for the validation + /// Text box for the results (can be NULL) + /// Panel to display visual results if avalaible (can be NULL) + /// + public ClusterEvaluation EvaluteAndDisplayClusterer(RichTextBox RichTextBoxToDisplayResults, + Panel PanelTodisplayGraphicalResults, Instances ListInstanceForValid) + { + ClusterEvaluation eval = new ClusterEvaluation(); + eval.setClusterer(SelectedClusterer); + eval.evaluateClusterer(ListInstanceForValid); + + if ((RichTextBoxToDisplayResults != null) && (eval.getNumClusters() > GlobalInfo.GetNumberofDefinedCellularPhenotypes())) + { + RichTextBoxToDisplayResults.Clear(); + RichTextBoxToDisplayResults.AppendText("Error: " + eval.getNumClusters() + " clusters identifed."); + RichTextBoxToDisplayResults.AppendText("The maximum number of cluster is " + GlobalInfo.GetNumberofDefinedCellularPhenotypes() + "."); + return null; + + } + if (RichTextBoxToDisplayResults != null) + { + RichTextBoxToDisplayResults.Clear(); + RichTextBoxToDisplayResults.AppendText(eval.clusterResultsToString()); + } + + + RichTextBoxToDisplayResults.AppendText("\n" + ListInstanceForValid.numAttributes() + " attributes:\n\n"); + for (int IdxAttributes = 0; IdxAttributes < ListInstanceForValid.numAttributes() ; IdxAttributes++) + { + RichTextBoxToDisplayResults.AppendText(IdxAttributes + "\t: " + ListInstanceForValid.attribute(IdxAttributes).name() + "\n"); + } + + + + if (PanelTodisplayGraphicalResults != null) PanelTodisplayGraphicalResults.Controls.Clear(); + + if ((PanelTodisplayGraphicalResults != null) && (SelectedClusterer.GetType().Name == "HierarchicalClusterer")) + { + Button ButtonToDisplayHierarchicalClustering = new Button(); + ButtonToDisplayHierarchicalClustering.Text = "Display Hierarchical Tree"; + ButtonToDisplayHierarchicalClustering.Width *= 2; + ButtonToDisplayHierarchicalClustering.Location = new System.Drawing.Point((PanelTodisplayGraphicalResults.Width - ButtonToDisplayHierarchicalClustering.Width) / 2, + (PanelTodisplayGraphicalResults.Height - ButtonToDisplayHierarchicalClustering.Height) / 2); + + ButtonToDisplayHierarchicalClustering.Anchor = AnchorStyles.None; + ButtonToDisplayHierarchicalClustering.Click += new EventHandler(ClickToDisplayHierarchicalTree); + PanelTodisplayGraphicalResults.Controls.Add(ButtonToDisplayHierarchicalClustering); + } + + return eval; + + } + #endregion + + public FormForClassificationInfo AskAndGetClassifAlgo() + { + FormForClassificationInfo WindowForClassifParam = new FormForClassificationInfo(this.GlobalInfo); + if (WindowForClassifParam.ShowDialog() != System.Windows.Forms.DialogResult.OK) return null; + + return WindowForClassifParam;//.GetSelectedAlgoAndParameters(); + } + + /// + /// Build the learning model for classification + /// + /// list of instances + /// Number of Clusters + /// Text box for the results (can be NULL) + /// Panel to display visual results if avalaible (can be NULL) + public Classifier PerformTraining(FormForClassificationInfo WindowForClassificationParam, Instances InstancesList, int NumberofClusters, RichTextBox TextBoxForFeedback, Panel PanelForVisualFeedback, out weka.classifiers.Evaluation ModelEvaluation, bool IsCellular) + { + // weka.classifiers.Evaluation ModelEvaluation = null; + // FormForClassificationInfo WindowForClassificationParam = new FormForClassificationInfo(GlobalInfo); + ModelEvaluation = null; + // if (WindowForClassificationParam.ShowDialog() != System.Windows.Forms.DialogResult.OK) return null; + // weka.classifiers.Evaluation ModelEvaluation = new Evaluation( + + + cParamAlgo ClassifAlgoParams = WindowForClassificationParam.GetSelectedAlgoAndParameters(); + if (ClassifAlgoParams == null) return null; + + //this.Cursor = Cursors.WaitCursor; + + // cParamAlgo ClassificationAlgo = WindowForClassificationParam.GetSelectedAlgoAndParameters(); + cListValuesParam Parameters = ClassifAlgoParams.GetListValuesParam(); + + //Classifier this.CurrentClassifier = null; + + // -------------------------- Classification ------------------------------- + // create the instances + // InstancesList = this.ListInstances; + this.attValsWithoutClasses = new FastVector(); + + if(IsCellular) + for (int i = 0; i < GlobalInfo.ListCellularPhenotypes.Count; i++) + this.attValsWithoutClasses.addElement(GlobalInfo.ListCellularPhenotypes[i].Name); + else + for (int i = 0; i < GlobalInfo.ListWellClasses.Count; i++) + this.attValsWithoutClasses.addElement(GlobalInfo.ListWellClasses[i].Name); + + + InstancesList.insertAttributeAt(new weka.core.Attribute("Class", this.attValsWithoutClasses), InstancesList.numAttributes()); + + for (int i = 0; i < Classes.Count; i++) + InstancesList.get(i).setValue(InstancesList.numAttributes() - 1, Classes[i]); + InstancesList.setClassIndex(InstancesList.numAttributes() - 1); + + weka.core.Instances train = new weka.core.Instances(InstancesList, 0, InstancesList.numInstances()); + + if (PanelForVisualFeedback != null) + PanelForVisualFeedback.Controls.Clear(); + + #region List classifiers + + #region J48 + if (ClassifAlgoParams.Name == "J48") + { + this.CurrentClassifier = new weka.classifiers.trees.J48(); + ((J48)this.CurrentClassifier).setMinNumObj((int)Parameters.ListDoubleValues.Get("numericUpDownMinInstLeaf").Value); + ((J48)this.CurrentClassifier).setConfidenceFactor((float)Parameters.ListDoubleValues.Get("numericUpDownConfFactor").Value); + ((J48)this.CurrentClassifier).setNumFolds((int)Parameters.ListDoubleValues.Get("numericUpDownNumFolds").Value); + ((J48)this.CurrentClassifier).setUnpruned((bool)Parameters.ListCheckValues.Get("checkBoxUnPruned").Value); + ((J48)this.CurrentClassifier).setUseLaplace((bool)Parameters.ListCheckValues.Get("checkBoxLaplacianSmoothing").Value); + ((J48)this.CurrentClassifier).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); + ((J48)this.CurrentClassifier).setSubtreeRaising((bool)Parameters.ListCheckValues.Get("checkBoxSubTreeRaising").Value); + + // CurrentClassif.SetJ48Tree((J48)this.CurrentClassifier, Classes.Length); + this.CurrentClassifier.buildClassifier(train); + // display results training + // display tree + if (PanelForVisualFeedback != null) + { + GViewer GraphView = DisplayTree(GlobalInfo, ((J48)this.CurrentClassifier)).gViewerForTreeClassif; + GraphView.Size = new System.Drawing.Size(PanelForVisualFeedback.Width, PanelForVisualFeedback.Height); + GraphView.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + PanelForVisualFeedback.Controls.Clear(); + PanelForVisualFeedback.Controls.Add(GraphView); + } + } + #endregion + #region Random Tree + else if (ClassifAlgoParams.Name == "RandomTree") + { + this.CurrentClassifier = new weka.classifiers.trees.RandomTree(); + + if ((bool)Parameters.ListCheckValues.Get("checkBoxMaxDepthUnlimited").Value) + ((RandomTree)this.CurrentClassifier).setMaxDepth(0); + else + ((RandomTree)this.CurrentClassifier).setMaxDepth((int)Parameters.ListDoubleValues.Get("numericUpDownMaxDepth").Value); + ((RandomTree)this.CurrentClassifier).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeed").Value); + ((RandomTree)this.CurrentClassifier).setMinNum((double)Parameters.ListDoubleValues.Get("numericUpDownMinWeight").Value); + + if ((bool)Parameters.ListCheckValues.Get("checkBoxIsBackfitting").Value) + { + ((RandomTree)this.CurrentClassifier).setNumFolds((int)Parameters.ListDoubleValues.Get("numericUpDownBackFittingFolds").Value); + } + else + { + ((RandomTree)this.CurrentClassifier).setNumFolds(0); + } + this.CurrentClassifier.buildClassifier(train); + //string StringForTree = ((RandomTree)this.CurrentClassifier).graph().Remove(0, ((RandomTree)this.CurrentClassifier).graph().IndexOf("{") + 2); + + //Microsoft.Msagl.GraphViewerGdi.GViewer GraphView = new GViewer(); + //GraphView.Graph = GlobalInfo.WindowHCSAnalyzer.ComputeAndDisplayGraph(StringForTree);//.Remove(StringForTree.Length - 3, 3)); + + //GraphView.Size = new System.Drawing.Size(panelForGraphicalResults.Width, panelForGraphicalResults.Height); + //GraphView.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + //this.panelForGraphicalResults.Controls.Clear(); + //this.panelForGraphicalResults.Controls.Add(GraphView); + + + } + #endregion + #region Random Forest + else if (ClassifAlgoParams.Name == "RandomForest") + { + this.CurrentClassifier = new weka.classifiers.trees.RandomForest(); + + if ((bool)Parameters.ListCheckValues.Get("checkBoxMaxDepthUnlimited").Value) + ((RandomForest)this.CurrentClassifier).setMaxDepth(0); + else + ((RandomForest)this.CurrentClassifier).setMaxDepth((int)Parameters.ListDoubleValues.Get("numericUpDownMaxDepth").Value); + + ((RandomForest)this.CurrentClassifier).setNumTrees((int)Parameters.ListDoubleValues.Get("numericUpDownNumTrees").Value); + ((RandomForest)this.CurrentClassifier).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeed").Value); + + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region KStar + else if (ClassifAlgoParams.Name == "KStar") + { + this.CurrentClassifier = new weka.classifiers.lazy.KStar(); + ((KStar)this.CurrentClassifier).setGlobalBlend((int)Parameters.ListDoubleValues.Get("numericUpDownGlobalBlend").Value); + ((KStar)this.CurrentClassifier).setEntropicAutoBlend((bool)Parameters.ListCheckValues.Get("checkBoxBlendAuto").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region SVM + else if (ClassifAlgoParams.Name == "SVM") + { + this.CurrentClassifier = new weka.classifiers.functions.SMO(); + ((SMO)this.CurrentClassifier).setC((double)Parameters.ListDoubleValues.Get("numericUpDownC").Value); + ((SMO)this.CurrentClassifier).setKernel(WindowForClassificationParam.GeneratedKernel); + ((SMO)this.CurrentClassifier).setRandomSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeed").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region KNN + else if (ClassifAlgoParams.Name == "KNN") + { + this.CurrentClassifier = new weka.classifiers.lazy.IBk(); + + string OptionDistance = " -K " + (int)Parameters.ListDoubleValues.Get("numericUpDownKNN").Value + " -W 0 "; + + string WeightType = (string)Parameters.ListTextValues.Get("comboBoxDistanceWeight").Value; + switch (WeightType) + { + case "No Weighting": + OptionDistance += ""; + break; + case "1/Distance": + OptionDistance += "-I"; + break; + case "1-Distance": + OptionDistance += "-F"; + break; + default: + break; + } + OptionDistance += " -A \"weka.core.neighboursearch.LinearNNSearch -A \\\"weka.core."; + + string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; + // OptionDistance += " -A \"weka.core."; + switch (DistanceType) + { + case "Euclidean": + OptionDistance += "EuclideanDistance"; + break; + case "Manhattan": + OptionDistance += "ManhattanDistance"; + break; + case "Chebyshev": + OptionDistance += "ChebyshevDistance"; + break; + default: + break; + } + + if (!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value) + OptionDistance += " -D"; + OptionDistance += " -R "; + + OptionDistance += "first-last\\\"\""; + ((IBk)this.CurrentClassifier).setOptions(weka.core.Utils.splitOptions(OptionDistance)); + + //((IBk)this.CurrentClassifier).setKNN((int)Parameters.ListDoubleValues.Get("numericUpDownKNN").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region Multilayer Perceptron + else if (ClassifAlgoParams.Name == "Perceptron") + { + this.CurrentClassifier = new weka.classifiers.functions.MultilayerPerceptron(); + ((MultilayerPerceptron)this.CurrentClassifier).setMomentum((double)Parameters.ListDoubleValues.Get("numericUpDownMomentum").Value); + ((MultilayerPerceptron)this.CurrentClassifier).setLearningRate((double)Parameters.ListDoubleValues.Get("numericUpDownLearningRate").Value); + ((MultilayerPerceptron)this.CurrentClassifier).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeed").Value); + ((MultilayerPerceptron)this.CurrentClassifier).setTrainingTime((int)Parameters.ListDoubleValues.Get("numericUpDownTrainingTime").Value); + ((MultilayerPerceptron)this.CurrentClassifier).setNormalizeAttributes((bool)Parameters.ListCheckValues.Get("checkBoxNormAttribute").Value); + ((MultilayerPerceptron)this.CurrentClassifier).setNormalizeNumericClass((bool)Parameters.ListCheckValues.Get("checkBoxNormNumericClasses").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region ZeroR + else if (ClassifAlgoParams.Name == "ZeroR") + { + this.CurrentClassifier = new weka.classifiers.rules.OneR(); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region OneR + else if (ClassifAlgoParams.Name == "OneR") + { + this.CurrentClassifier = new weka.classifiers.rules.OneR(); + ((OneR)this.CurrentClassifier).setMinBucketSize((int)Parameters.ListDoubleValues.Get("numericUpDownMinBucketSize").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + #region Naive Bayes + else if (ClassifAlgoParams.Name == "NaiveBayes") + { + this.CurrentClassifier = new weka.classifiers.bayes.NaiveBayes(); + ((NaiveBayes)this.CurrentClassifier).setUseKernelEstimator((bool)Parameters.ListCheckValues.Get("checkBoxKernelEstimator").Value); + this.CurrentClassifier.buildClassifier(train); + } + #endregion + + + #endregion + + if (TextBoxForFeedback != null) + { + TextBoxForFeedback.Clear(); + TextBoxForFeedback.AppendText(this.CurrentClassifier.ToString()); + } + + TextBoxForFeedback.AppendText("\n" + (InstancesList.numAttributes()-1) + " attributes:\n\n"); + for (int IdxAttributes = 0; IdxAttributes < InstancesList.numAttributes()-1; IdxAttributes++) + { + TextBoxForFeedback.AppendText(IdxAttributes + "\t: " + InstancesList.attribute(IdxAttributes).name() + "\n"); + } + + #region evaluation of the model and results display + + if ((WindowForClassificationParam.numericUpDownFoldNumber.Enabled) && (TextBoxForFeedback != null)) + { + + TextBoxForFeedback.AppendText("\n-----------------------------\nModel validation\n-----------------------------\n"); + ModelEvaluation = new weka.classifiers.Evaluation(InstancesList); + ModelEvaluation.crossValidateModel(this.CurrentClassifier, InstancesList, (int)WindowForClassificationParam.numericUpDownFoldNumber.Value, new java.util.Random(1)); + TextBoxForFeedback.AppendText(ModelEvaluation.toSummaryString()); + TextBoxForFeedback.AppendText("\n-----------------------------\nConfusion Matrix:\n-----------------------------\n"); + double[][] ConfusionMatrix = ModelEvaluation.confusionMatrix(); + + string NewLine = ""; + for (int i = 0; i < ConfusionMatrix[0].Length; i++) + { + NewLine += "c" + i + "\t"; + } + TextBoxForFeedback.AppendText(NewLine + "\n\n"); + + for (int j = 0; j < ConfusionMatrix.Length; j++) + { + NewLine = ""; + for (int i = 0; i < ConfusionMatrix[0].Length; i++) + { + NewLine += ConfusionMatrix[j][i] + "\t"; + } + // if + TextBoxForFeedback.AppendText(NewLine + "| c" + j + " <=> " + GlobalInfo.ListCellularPhenotypes[j].Name + "\n"); + } + } + #endregion + + return this.CurrentClassifier; + } + + public void PerformClassification() + { + System.Windows.Forms.DialogResult IsKeepOriginalDesc = System.Windows.Forms.MessageBox.Show("Keep original descriptors ?", "Classification", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (IsKeepOriginalDesc == System.Windows.Forms.DialogResult.Cancel) return; + + // ----------------------- Classification ------------------------------ + int DescrCount = GlobalInfo.CurrentScreen.ListDescriptors.Count; + + // first we update the descriptor + for (int i = 0; i < this.NumberOfClusters; i++) + GlobalInfo.CurrentScreen.ListDescriptors.AddNew(new cDescriptorsType("Ratio_" + GlobalInfo.ListCellularPhenotypes[i].Name, true, 1, GlobalInfo)); + + FormForProgress ProgressWindow = new FormForProgress(); + ProgressWindow.Show(); + + int IdxProgress = 0; + int MaxProgress = 0; + + foreach (cPlate CurrentPlateToProcess in GlobalInfo.CurrentScreen.ListPlatesAvailable) + MaxProgress += (int)CurrentPlateToProcess.ListActiveWells.Count; + ProgressWindow.progressBar.Maximum = MaxProgress; + + FastVector attVals = new FastVector(); + for (int i = 0; i < this.NumberOfClusters; i++) + attVals.addElement(i.ToString()); + + foreach (cPlate CurrentPlateToProcess in GlobalInfo.CurrentScreen.ListPlatesAvailable) + { + foreach (cWell TmpWell in CurrentPlateToProcess.ListActiveWells) + { + ProgressWindow.progressBar.Value = IdxProgress++; + + DataTable FinalDataTable = new DataTable(); + TmpWell.AssociatedPlate.DBConnection = new cDBConnection(TmpWell.AssociatedPlate, TmpWell.SQLTableName); + TmpWell.AssociatedPlate.DBConnection.AddWellToDataTable(TmpWell, FinalDataTable, this.GlobalInfo); + //TmpWell.AssociatedPlate.DBConnection.AddWellToDataTable(TmpWell, FinalDataTable, checkBoxIncludeWellClassAsDesc.Checked, GlobalInfo); + Instances ListInstancesTOClassify = this.CreateInstancesWithoutClass(FinalDataTable); + + ListInstancesTOClassify.insertAttributeAt(new weka.core.Attribute("Class", attVals), ListInstancesTOClassify.numAttributes()); + ListInstancesTOClassify.setClassIndex(ListInstancesTOClassify.numAttributes() - 1); + + cExtendedList ListNewClasses = new cExtendedList(); + + for (int i = 0; i < ListInstancesTOClassify.numInstances(); i++) + { + // ClassId contains the new class + double classId = this.CurrentClassifier.classifyInstance(ListInstancesTOClassify.instance(i)); + ListNewClasses.Add(classId); + } + + // ------------- update class within the database ----------------------------- + TmpWell.AssociatedPlate.DBConnection.ChangePhenotypeClass(TmpWell, ListNewClasses); + + List Histo = ListNewClasses.CreateHistogram(0, ListInstancesTOClassify.numClasses() , ListInstancesTOClassify.numClasses() ); + List LDesc = new List(); + + for (int IdxHisto = 0; IdxHisto < Histo[1].Length; IdxHisto++) + { + Histo[1][IdxHisto] = (100.0 * Histo[1][IdxHisto]) / (double)ListInstancesTOClassify.numInstances(); + + cDescriptor NewDesc = new cDescriptor(Histo[1][IdxHisto], GlobalInfo.CurrentScreen.ListDescriptors[IdxHisto + DescrCount], GlobalInfo.CurrentScreen); + LDesc.Add(NewDesc); + } + + TmpWell.AddDescriptors(LDesc); + TmpWell.AssociatedPlate.DBConnection.DB_CloseConnection(); + + } + } + ProgressWindow.Close(); + + if (IsKeepOriginalDesc == System.Windows.Forms.DialogResult.No) + { + // int DescNumToRemove = GlobalInfo.CurrentScreen.ListDescriptors.Count - + for (int IdxDesc = 0; IdxDesc < DescrCount; IdxDesc++) + GlobalInfo.CurrentScreen.ListDescriptors.RemoveDesc(GlobalInfo.CurrentScreen.ListDescriptors[0], GlobalInfo.CurrentScreen); + } + + GlobalInfo.CurrentScreen.ListDescriptors.UpDateDisplay(); + GlobalInfo.CurrentScreen.UpDatePlateListWithFullAvailablePlate(); + + for (int idxP = 0; idxP < GlobalInfo.CurrentScreen.ListPlatesActive.Count; idxP++) + GlobalInfo.CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); + + //WindowFormForCellbyCellClassif.Close(); + //WindowClusteringInfo.Close(); + + } + + private void ClickToDisplayHierarchicalTree(object sender, EventArgs e) + { + cDendoGram Dendogram = new cDendoGram(((HierarchicalClusterer)SelectedClusterer), null); + + FormDendogram WindowForDendoGram = new FormDendogram(GlobalInfo); + WindowForDendoGram.CurrentDendo = Dendogram; + WindowForDendoGram.Show(); + } + + public FormForClassificationTree DisplayTree(cGlobalInfo GlobalInfo, J48 J48Model) + { + FormForClassificationTree WindowForTree = new FormForClassificationTree(); + string StringForTree = J48Model.graph().Remove(0, J48Model.graph().IndexOf("{") + 2); + WindowForTree.gViewerForTreeClassif.Graph = GlobalInfo.WindowHCSAnalyzer.ComputeAndDisplayGraph(StringForTree.Remove(StringForTree.Length - 3, 3)); + return WindowForTree; + } + + public Instances CreateInstancesWithoutClass(DataTable dt) + { + weka.core.FastVector atts = new FastVector(); + int columnNo = 0; + + // Descriptors loop + for (int i = 0; i < dt.Columns.Count; i++) + { + //if (ParentScreening.ListDescriptors[i].IsActive() == false) continue; + atts.addElement(new weka.core.Attribute(dt.Columns[i].ColumnName)); + columnNo++; + } + // weka.core.FastVector attVals = new FastVector(); + Instances data1 = new Instances("MyRelation", atts, 0); + + for (int IdxRow = 0; IdxRow < dt.Rows.Count; IdxRow++) + { + double[] vals = new double[data1.numAttributes()]; + for (int Col = 0; Col < columnNo; Col++) + { + // if (Glo .ListDescriptors[Col].IsActive() == false) continue; + vals[Col] = double.Parse(dt.Rows[IdxRow][Col].ToString()); + } + data1.add(new DenseInstance(1.0, vals)); + } + + return data1; + } + } + + + + +} diff --git a/Classes/Machine Learning/cParamForClusteringAndClassif.cs b/Classes/Machine Learning/cParamForClusteringAndClassif.cs new file mode 100644 index 0000000..74f3f39 --- /dev/null +++ b/Classes/Machine Learning/cParamForClusteringAndClassif.cs @@ -0,0 +1,411 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Forms.FormsForOptions.PanelForOptions; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo; +using HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo; +using HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children +{ + public class cListDoubleValues : List + { + public cDoubleValue Get(string NameVariable) + { + foreach (cDoubleValue item in this) + { + if (item.Name == NameVariable) return item; + } + return null; + } + + } + + public class cListCheckValues : List + { + public cCheckValue Get(string NameVariable) + { + foreach (cCheckValue item in this) + { + if (item.Name == NameVariable) return item; + } + return null; + } + + + } + + public class cListColorValue : List + { + public cColorValue Get(string NameVariable) + { + foreach (cColorValue item in this) + { + if (item.Name == NameVariable) return item; + } + return null; + } + + } + + public class cListTextValue : List + { + public cTextValue Get(string NameVariable) + { + foreach (cTextValue item in this) + { + if (item.Name == NameVariable) return item; + } + return null; + } + + } + + + public class cListValuesParam + { + public cListDoubleValues ListDoubleValues = new cListDoubleValues(); + public cListCheckValues ListCheckValues = new cListCheckValues(); + public cListColorValue ListColorValues = new cListColorValue(); + public cListTextValue ListTextValues = new cListTextValue(); + + } + + #region Parent Class + [Serializable] + public abstract class cParamAlgo + { + + protected Panel PanelToDisplay; + public string Name; + + + public Panel GetPanel() + { + PanelToDisplay.Location = new System.Drawing.Point(0, 0); + return PanelToDisplay; + } + + public cParamAlgo(string Name) + { + this.Name = Name; + } + + /// + /// recursive loop to gather all the controls + /// + /// + /// + private IEnumerable GetAllControls(Control container) + { + List controlList = new List(); + foreach (Control c in container.Controls) + { + controlList.AddRange(GetAllControls(c)); + controlList.Add(c); + } + return controlList; + } + + public cListValuesParam GetListValuesParam() + { + cListValuesParam ListValuesParam = new cListValuesParam(); + IEnumerable ListAllCtrls = GetAllControls(this.PanelToDisplay); + + foreach (Control ctl in ListAllCtrls) + { + Type CtlType = ctl.GetType(); + + if (CtlType == typeof(CheckBox)) + { + cCheckValue NewValue = new cCheckValue(((CheckBox)ctl).Checked, ctl.Name); + ListValuesParam.ListCheckValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(RadioButton)) + { + cCheckValue NewValue = new cCheckValue(((RadioButton)ctl).Checked, ctl.Name); + ListValuesParam.ListCheckValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(NumericUpDown)) + { + cDoubleValue NewValue = new cDoubleValue((double)((NumericUpDown)ctl).Value, ctl.Name); + ListValuesParam.ListDoubleValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(TextBox)) + { + cTextValue NewValue = new cTextValue(((TextBox)ctl).Text, ctl.Name); + ListValuesParam.ListTextValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(Panel)) + { + cColorValue NewValue = new cColorValue(((Panel)ctl).BackColor, ctl.Name); + ListValuesParam.ListColorValues.Add(NewValue); + ctl.Tag = NewValue; + } + else if (CtlType == typeof(ComboBox)) + { + cTextValue NewValue = new cTextValue(((ComboBox)ctl).Text, ctl.Name); + ListValuesParam.ListTextValues.Add(NewValue); + ctl.Tag = NewValue; + } + + + } + return ListValuesParam; + } + } + #endregion + + #region ------------------------------------ Specific classification ------------------------------------ + + public class cListClassificationAlgo : List + { + public cListClassificationAlgo(FormForClassificationInfo ForClassificationInfo) + { + this.Add(new cParamJ48("J48")); + this.Add(new cParamRandomForest("RandomForest")); + this.Add(new cParamRandomTree("RandomTree")); + this.Add(new cParamKStar("KStar")); + this.Add(new cParamSVM("SVM", ForClassificationInfo)); + this.Add(new cParamKNN("KNN")); + this.Add(new cParamPerceptron("Perceptron")); + this.Add(new cParamZeroR("ZeroR")); + this.Add(new cParamOneR("OneR")); + this.Add(new cParamNaiveBayes("NaiveBayes")); + } + + public Panel GetPanel(string Name) + { + if (Name == null) return null; + + foreach (var item in this) + if (item.Name == Name) return item.GetPanel(); + + return null; + } + + public cParamAlgo GetListParams(string CategoryName) + { + foreach (cParamAlgo item in this) + { + if (item.Name == CategoryName) return item; + } + return null; + + } + } + + + [Serializable] + public class cParamJ48 : cParamAlgo + { + public cParamJ48(string Name) + : base(Name) + { + PanelForParamJ48 PanelForOption = new PanelForParamJ48(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamRandomForest : cParamAlgo + { + public cParamRandomForest(string Name) + : base(Name) + { + PanelForParamRandomForest PanelForOption = new PanelForParamRandomForest(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamRandomTree : cParamAlgo + { + public cParamRandomTree(string Name) + : base(Name) + { + PanelForParamRandomTree PanelForOption = new PanelForParamRandomTree(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamKStar : cParamAlgo + { + public cParamKStar(string Name) + : base(Name) + { + PanelForParamKStar PanelForOption = new PanelForParamKStar(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamKNN : cParamAlgo + { + public cParamKNN(string Name) + : base(Name) + { + PanelForParamKNN PanelForOption = new PanelForParamKNN(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamSVM : cParamAlgo + { + public cParamSVM(string Name, FormForClassificationInfo ForClassificationInfo) + : base(Name) + { + PanelForParamSVM PanelForOption = new PanelForParamSVM(ForClassificationInfo); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamPerceptron : cParamAlgo + { + public cParamPerceptron(string Name) + : base(Name) + { + PanelForParamPerceptron PanelForOption = new PanelForParamPerceptron(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamZeroR : cParamAlgo + { + public cParamZeroR(string Name) + : base(Name) + { + PanelForParamZeroR PanelForOption = new PanelForParamZeroR(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamOneR : cParamAlgo + { + public cParamOneR(string Name) + : base(Name) + { + PanelForParamOneR PanelForOption = new PanelForParamOneR(); + this.PanelToDisplay = PanelForOption.panel; + } + } + [Serializable] + public class cParamNaiveBayes : cParamAlgo + { + public cParamNaiveBayes(string Name) + : base(Name) + { + PanelForParamNaiveBayes PanelForOption = new PanelForParamNaiveBayes(); + this.PanelToDisplay = PanelForOption.panel; + } + } + #endregion + + #region ------------------------------------ Specific Clustering ------------------------------------ + public class cListClusteringAlgo : List + { + public cListClusteringAlgo(List ListDescritpors) + { + this.Add(new cParamEM("EM")); + this.Add(new cParamKMeans("K-Means")); + this.Add(new cParamHierarchical("Hierarchical")); + this.Add(new cParamFarthestFirst("FarthestFirst")); + this.Add(new cParamCobWeb("CobWeb")); + this.Add(new cParamManual("Manual", ListDescritpors)); + } + + public Panel GetPanel(string Name) + { + if (Name == null) return null; + + foreach (var item in this) + if (item.Name == Name) return item.GetPanel(); + + return null; + } + + public cParamAlgo GetListParams(string CategoryName) + { + foreach (cParamAlgo item in this) + { + if (item.Name == CategoryName) return item; + } + return null; + + } + } + + [Serializable] + public class cParamEM : cParamAlgo + { + public cParamEM(string Name) + : base(Name) + { + PanelForParamEM PanelForOption = new PanelForParamEM(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamKMeans : cParamAlgo + { + public cParamKMeans(string Name) + : base(Name) + { + PanelForParamKMeans PanelForOption = new PanelForParamKMeans(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamHierarchical : cParamAlgo + { + public cParamHierarchical(string Name) + : base(Name) + { + PanelForParamHierarchical PanelForOption = new PanelForParamHierarchical(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamFarthestFirst : cParamAlgo + { + public cParamFarthestFirst(string Name) + : base(Name) + { + PanelForParamFarthestFirst PanelForOption = new PanelForParamFarthestFirst(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamCobWeb : cParamAlgo + { + public cParamCobWeb(string Name) + : base(Name) + { + PanelForParamCobWeb PanelForOption = new PanelForParamCobWeb(); + this.PanelToDisplay = PanelForOption.panel; + } + } + + [Serializable] + public class cParamManual : cParamAlgo + { + public cParamManual(string Name, List ListDescritpors) + : base(Name) + { + PanelForParamManual PanelForOption = new PanelForParamManual(ListDescritpors); + this.PanelToDisplay = PanelForOption.panel; + } + } +#endregion + +} diff --git a/Classes/MetaComponents/DataAnalysis/cDisplayCorrelationMatrix.cs b/Classes/MetaComponents/DataAnalysis/cDisplayCorrelationMatrix.cs new file mode 100644 index 0000000..456e34b --- /dev/null +++ b/Classes/MetaComponents/DataAnalysis/cDisplayCorrelationMatrix.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes; +using HCSAnalyzer.Classes.Base_Classes.DataAnalysis; +using HCSAnalyzer.Classes.Base_Classes.Viewers; + +namespace HCSAnalyzer.Classes.MetaComponents +{ + class cDisplayCorrelationMatrix : cComponent + { + cExtendedTable Input; + eCorrelationType CorrelationType = eCorrelationType.PEARSON; + + public cDisplayCorrelationMatrix() + { + this.Title = "Display Correlation Matrix"; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + Process(); + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + void Process() + { + // here is the core of the meta component ... + // just a list of Component steps + + cCorrelationMatrix MyCorrelation = new cCorrelationMatrix(); + MyCorrelation.SetCorrelationType(this.CorrelationType); + MyCorrelation.SetInputData(Input); + MyCorrelation.Run(); + + cViewerTable MyTable = new cViewerTable(); + MyTable.SetInputData(MyCorrelation.GetOutPut()); + MyTable.Run(); + + cDesignerSinglePanel MyDesigner = new cDesignerSinglePanel(); + MyDesigner.SetInputData(MyTable.GetOutPut()); + MyDesigner.Run(); + + cDisplayToWindow MyDisplay = new cDisplayToWindow(); + MyDisplay.SetInputData(MyDesigner.GetOutPut()); + MyDisplay.Title = this.Title; + MyDisplay.Run(); + MyDisplay.Display(); + } + + public void SetCorrelationType(eCorrelationType Type) + { + this.CorrelationType = Type; + } + + public void Set_Data(cExtendedTable Input) + { + this.Input = Input; + } + } +} diff --git a/Classes/MetaComponents/Display/cDisplayExtendedTable.cs b/Classes/MetaComponents/Display/cDisplayExtendedTable.cs new file mode 100644 index 0000000..1691cb8 --- /dev/null +++ b/Classes/MetaComponents/Display/cDisplayExtendedTable.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using HCSAnalyzer.Classes.Base_Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; + +namespace HCSAnalyzer.Classes.MetaComponents +{ + class cDisplayExtendedTable : cComponent + { + cExtendedTable Input; + + + public cDisplayExtendedTable() + { + this.Title = "Display ExtendedDataTable"; + } + + public cFeedBackMessage Run() + { + cFeedBackMessage FeedBackMessage; + if (this.Input == null) + { + FeedBackMessage = new cFeedBackMessage(false); + FeedBackMessage.Message = "No input data defined."; + return FeedBackMessage; + } + Process(); + FeedBackMessage = new cFeedBackMessage(true); + return FeedBackMessage; + } + + void Process() + { + // here is the core of the meta component ... + // just a list of Component steps + + cViewerTable MyTable = new cViewerTable(); + MyTable.SetInputData(this.Input); + MyTable.DigitNumber = 5; + MyTable.Run(); + + cDesignerSinglePanel MyDesigner = new cDesignerSinglePanel(); + MyDesigner.SetInputData(MyTable.GetOutPut()); + MyDesigner.Run(); + + cDisplayToWindow MyDisplay = new cDisplayToWindow(); + MyDisplay.SetInputData(MyDesigner.GetOutPut()); + MyDisplay.Title = this.Input.Name; + MyDisplay.Run(); + MyDisplay.Display(); + } + + + public void Set_Data(cExtendedTable Input) + { + this.Input = Input; + } + } +} + diff --git a/Classes/cB-Score.cs b/Classes/SystematicErrors/cB-Score.cs similarity index 100% rename from Classes/cB-Score.cs rename to Classes/SystematicErrors/cB-Score.cs diff --git a/Classes/cEdgeEffect.cs b/Classes/SystematicErrors/cEdgeEffect.cs similarity index 99% rename from Classes/cEdgeEffect.cs rename to Classes/SystematicErrors/cEdgeEffect.cs index 9c1cc8b..e483850 100644 --- a/Classes/cEdgeEffect.cs +++ b/Classes/SystematicErrors/cEdgeEffect.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using LibPlateAnalysis; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer.Classes { diff --git a/Classes/cDescriptor.cs b/Classes/cDescriptor.cs deleted file mode 100644 index 8ca7e48..0000000 --- a/Classes/cDescriptor.cs +++ /dev/null @@ -1,637 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; - -namespace LibPlateAnalysis -{ - - public enum eDistances { EUCLIDEAN , MANHATTAN, VECTOR_COS, BHATTACHARYYA, EMD }; - public enum eDataType { HISTOGRAM, SINGLE }; - - public class cDescriptorsType - { - public bool IsConnectedToDatabase { get; private set;} - - public eDataType DataType { get; private set; } - - public cDescriptorsType(string Name, bool IsActive, int BinNumber, bool IsConnectedToDB, cGlobalInfo GlobalInfo) - { - //this.AssociatedcListDescriptors = AssociatedcListDescriptors; - this.Name = Name; - this.ActiveState = IsActive; - this.NumBin = BinNumber; - - if (BinNumber == 1) DataType = eDataType.SINGLE; - else - DataType = eDataType.HISTOGRAM; - - this.IsConnectedToDatabase = IsConnectedToDB; - this.GlobalInfo = GlobalInfo; - CreateAssociatedWindow(); - } - public cDescriptorsType(string Name, bool IsActive, int BinNumber, cGlobalInfo GlobalInfo) - { - //this.AssociatedcListDescriptors = AssociatedcListDescriptors; - this.Name = Name; - this.ActiveState = IsActive; - this.NumBin = BinNumber; - - if (BinNumber == 1) DataType = eDataType.SINGLE; - else - DataType = eDataType.HISTOGRAM; - - - this.IsConnectedToDatabase = false; - this.GlobalInfo = GlobalInfo; - CreateAssociatedWindow(); - } - /*public cDescriptorsType(cDescriptor Example, bool IsActive) - { - this.Name = Example.GetName(); - this.ActiveState = IsActive; - this.IsSingle = Example.GetAssociatedType().IsSingle; - CreateAssociatedWindow(); - - }*/ - - private string Name; - - public string GetName() - { - return Name; - } - - // private cListDescriptors AssociatedcListDescriptors = null; - - private int NumBin; - - - public int GetBinNumber() - { - return NumBin; - } - - //public string GetDataType() - //{ - // if (NumBin == 1) return "Single"; - // else - // return "Histogram"; - //} - - private bool ActiveState; - - public void SetActiveState(bool IsActive) - { - this.ActiveState = IsActive; - } - - public bool IsActive() - { - return this.ActiveState; - } - - public bool ChangeName(string NewName) - { - this.Name = NewName; - return true; - } - - - public void ChangeBinNumber(int NewBinNumber) - { - int IdxDesc = GlobalInfo.CurrentScreen.ListDescriptors.GetDescriptorIndex(this); - - foreach (cPlate TmpPlate in GlobalInfo.CurrentScreen.ListPlatesAvailable) - { - for (int Col = 0; Col <= GlobalInfo.CurrentScreen.Columns; Col++) - for (int Row = 0; Row <= GlobalInfo.CurrentScreen.Rows; Row++) - { - cWell TmpWell = TmpPlate.GetWell(Col, Row, false); - if (TmpWell == null) continue; - TmpWell.ListDescriptors[IdxDesc].RefreshHisto(NewBinNumber); - } - } - - this.NumBin = NewBinNumber; - - } - cGlobalInfo GlobalInfo; - public FormForDescriptorInfo WindowDescriptorInfo;// = new FormForDescriptorInfo(); - - private void CreateAssociatedWindow() - { - WindowDescriptorInfo = new FormForDescriptorInfo(this); - WindowDescriptorInfo.CurrentDesc = this; - WindowDescriptorInfo.Text = this.Name; - } - - } - - public class cListDescriptors : List - { - CheckedListBox AssociatedListBox; - ComboBox AssociatedListDescriptorToDisplay; - public int CurrentSelectedDescriptor = -1; - - public int GetDescriptorIndex(cDescriptorsType DescriptorType) - { - int DescIndex = -1; - foreach (cDescriptorsType TmpDescType in this) - { - DescIndex++; - if (TmpDescType.GetName() == DescriptorType.GetName()) return DescIndex; - } - DescIndex = -1; - - return -1; - } - - public int GetDescriptorIndex(string DescriptorName) - { - int DescIndex = -1; - foreach (cDescriptorsType TmpDescType in this) - { - DescIndex++; - if (TmpDescType.GetName() == DescriptorName) return DescIndex; - } - - - return -1; - } - - public void SetCurrentSelectedDescriptor(int Desc) - { - this.CurrentSelectedDescriptor = Desc; - this.AssociatedListDescriptorToDisplay.SelectedIndex = Desc; - } - - public cListDescriptors(CheckedListBox AssociatedListBox, ComboBox AssociatedComboBox) - { - this.AssociatedListBox = AssociatedListBox; - this.AssociatedListDescriptorToDisplay = AssociatedComboBox; - - } - - /// - /// Clear the object as well as the associated control - /// - public void Clean() - { - this.Clear(); - AssociatedListBox.Items.Clear(); - AssociatedListDescriptorToDisplay.Items.Clear(); - } - - /// - /// Add a descritpor to the global descriptor list - /// - /// - /// return false if the descriptor type already exist - public bool AddNew(cDescriptorsType DescriptorsType) - { - foreach (cDescriptorsType temp in this) - { - if (temp.GetName() == DescriptorsType.GetName()) - return false; - } - - this.Add(DescriptorsType); - this.AssociatedListBox.Items.Add(DescriptorsType.GetName(), true); - this.AssociatedListDescriptorToDisplay.Items.Add(DescriptorsType.GetName()); - return true; - } - - public void RemoveDesc(cDescriptorsType DescriptorTypeToBeRemoved, cScreening CurrentScreen) - { - for (int i = 0; i < this.Count; i++) - { - cDescriptorsType TmpType = this[i]; - - if (DescriptorTypeToBeRemoved == TmpType) - { - foreach (cPlate TmpPlate in CurrentScreen.ListPlatesAvailable) - { - foreach (cWell Tmpwell in TmpPlate.ListActiveWells) Tmpwell.ListDescriptors.RemoveAt(i); - } - - this.RemoveAt(i); - AssociatedListBox.Items.RemoveAt(i); - AssociatedListDescriptorToDisplay.Items.RemoveAt(i); - AssociatedListDescriptorToDisplay.SelectedIndex = 0; - return; - - } - } - } - - public void RemoveDescUnSafe(cDescriptorsType DescriptorTypeToBeRemoved, cScreening CurrentScreen) - { - for (int i = 0; i < this.Count; i++) - { - cDescriptorsType TmpType = this[i]; - - if (DescriptorTypeToBeRemoved == TmpType) - { - foreach (cPlate TmpPlate in CurrentScreen.ListPlatesAvailable) - { - foreach (cWell Tmpwell in TmpPlate.ListActiveWells) Tmpwell.ListDescriptors.RemoveAt(i); - } - - this.RemoveAt(i); - AssociatedListBox.Items.RemoveAt(i); - AssociatedListDescriptorToDisplay.Items.RemoveAt(i); - - return; - - } - } - } - - public List GetListNameActives() - { - List NameActiveDesc = new List(); - - foreach (cDescriptorsType TmpDesc in this) - { - if (TmpDesc.IsActive()) NameActiveDesc.Add(TmpDesc.GetName()); - } - return NameActiveDesc; - } - - /// - /// - /// - /// - public void SetItemState(int IdxDesc, bool IsActive) - { - if (IsActive) - { - AssociatedListBox.SetItemCheckState(IdxDesc, CheckState.Checked); - this[IdxDesc].SetActiveState(true); - } - else - { - AssociatedListBox.SetItemCheckState(IdxDesc, CheckState.Unchecked); - this[IdxDesc].SetActiveState(false); - } - - } - - public void UpDateDisplay() - { - int Idx = 0; - foreach (cDescriptorsType TmpType in this) - { - AssociatedListBox.Items[Idx] = TmpType.GetName(); - AssociatedListDescriptorToDisplay.Items[Idx] = TmpType.GetName(); - Idx++; - } - } - - public cExtendedList GetValue(List ListPlate, cDescriptorsType Desc) - { - cExtendedList ToReturn = new cExtendedList(); - - int Idx = this.GetDescriptorIndex(Desc); - - foreach (cPlate CurrentPlate in ListPlate) - foreach (cWell TmpWell in CurrentPlate.ListActiveWells) - ToReturn.Add(TmpWell.ListDescriptors[Idx].GetValue()); - return ToReturn; - } - - } - - - public class cDescriptor - { - //string Name; - //public bool IsSingle; - - public cDescriptorsType Type{ get; private set;} - - public cWell AssociatedWell; - - private cScreening CurrentScreening; - - public cDescriptorsType GetAssociatedType() - { - return this.Type; - } - - public cHisto Histogram; - - private double AverageValue = 0; - - private double ComputeDistributionDistanceToReference() - { - return 0; - - } - - public int HistoBins; - - #region public - - /// - /// Return the value associated to a descriptor within a well - /// - /// if scalar mode: average else distance between histograms - public double GetValue() - { - if (CurrentScreening.Reference == null) - { - //if (Type.GetBinNumber() > 1) - //{ - // // MessageBox.Show("GetWeightedMean() not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - - // //return HistoValues.GetWeightedMean(); - // return -1; - //} - //else - // return Histogram.GetXvalues()[0]; - return this.AverageValue;// this.Histogram.GetAverageValue(); - } - else - { - MessageBox.Show("GetValue() not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - - //if (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricEuclidean.Checked) - // return HistoValues.Dist_Euclidean(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); - //else if - // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricManhattan.Checked) - // return HistoValues.Dist_Manhattan(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); - //else if - // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricCosine.Checked) - // return HistoValues.Dist_VectorCosine(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); - //else if - // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricBhattacharyya.Checked) - // return HistoValues.Dist_BhattacharyyaCoefficient(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); - //else if - // (CurrentScreening.GlobalInfo.OptionsWindow.radioButtonDistributionMetricEMD.Checked) - // return HistoValues.Dist_EarthMover(CurrentScreening.Reference[CurrentScreening.ListDescriptors.IndexOf(Type)]); - //else - return -1; - } - - - - } - - public void RefreshHisto(int NewNumBins) - { - this.HistoBins = NewNumBins; - this.Histogram = new cHisto(this.GetOriginalValues(), HistoBins); - - - } - - - - public void SetHistoValues(List ListXValues, List ListYValues) - { - this.Histogram = new cHisto(ListXValues, ListYValues); - UpDateDescriptorStatistics(); - - } - - public void SetHistoValues(double Value) - { - this.Histogram = new cHisto(Value); - this.AverageValue = Value; - // HistoValues[0] = Value; - // UpDateDescriptorStatistics(); - - } - - public void SetHistoValues(int Idx, double Value) - { - this.Histogram.SetYvalues(Value, Idx); - // HistoValues[Idx] = Value; - UpDateDescriptorStatistics(); - - } - - public cExtendedList GetHistovalues() - { - return this.Histogram.GetYvalues(); - } - - public double GetHistovalue(int Idx) - { - return this.Histogram.GetYvalues()[Idx]; - } - - public double GetHistoXvalue(int Idx) - { - return this.Histogram.GetXvalues()[Idx]; - } - - /// - /// return the descriptor name - /// - /// the Descriptor name - public string GetName() - { - return this.Type.GetName(); - } - - - /// - /// Update the descritpor statistic (Average, first and last value) - /// - public void UpDateDescriptorStatistics() - { - // this.HistoBins = 1; - // this.AverageValue = Value; - - - //FirstValue = HistoValues[0]; - // LastValue = HistoValues[HistoValues.Count - 1]; - } - - - #endregion - - // private double AverageValue; - - // private double FirstValue = -1; - // private double LastValue = -1; - - private double[] OriginalValues = null; - - public double[] GetOriginalValues() - { - if ((CurrentScreening.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.MEMORY) && (this.OriginalValues != null)) - { - return this.OriginalValues; - } - else if (CurrentScreening.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.HD) - { - AssociatedWell.AssociatedPlate.DBConnection = new cDBConnection(AssociatedWell.AssociatedPlate, AssociatedWell.SQLTableName); - cExtendedList ToReturn = AssociatedWell.AssociatedPlate.DBConnection.GetWellValues(AssociatedWell.SQLTableName, this.GetAssociatedType()); - AssociatedWell.AssociatedPlate.DBConnection.DB_CloseConnection(); - return ToReturn.ToArray(); - } - return null; - } - - //private double getAverageValue(float[] Data) - //{ - // double Res = 0; - // for (int i = 0; i < Data.Length; i++) - // Res += Data[i]; - - // return Res / (double)(Data.Length); - //} - - //private cExtendedList CreateHistogram(double[] data, double start, double end, double step) - //{ - // int HistoSize = (int)((end - start) / step) + 1; - - // double[] histogram = new double[HistoSize]; - // double RealPos = start; - - // int PosHisto; - // foreach (double f in data) - // { - // PosHisto = (int)((f - start) / step); - // if ((PosHisto >= 0) && (PosHisto < HistoSize)) - // histogram[PosHisto]++; - // } - - // return histogram; - //} - - //private cExtendedList CreateHistogram(float[] data, double start, double end, double step) - //{ - // int HistoSize = (int)((end - start) / step) + 1; - - - // double[] histogram = new double[HistoSize]; - // double RealPos = start; - - // int PosHisto; - // foreach (float f in data) - // { - // PosHisto = (int)((f - start) / step); - // if ((PosHisto >= 0) && (PosHisto < HistoSize)) - // histogram[PosHisto]++; - // } - - // return histogram; - //} - - //private double getAverageValue(double[] Data) - //{ - // double Res = 0; - // for (int i = 0; i < Data.Length; i++) - // Res += Data[i]; - - // return Res / (double)(Data.Length); - //} - - - - - /// - /// Create a descriptor based on a list of value (typically an histogram) - /// - /// Array of values - /// Descriptor name - //public cDescriptor(double[] ListOriginalValues, cDescriptorsType Type) - //{ - - - // this.OriginalValues = new double[ListOriginalValues.Length]; - // Array.Copy(ListOriginalValues, this.OriginalValues, OriginalValues.Length); - - // this.Type = Type; - - // double Max = ListOriginalValues[0]; - // for (int i = 1; i < ListOriginalValues.Length; i++) - // { - // if (ListOriginalValues[i] > Max) Max = ListOriginalValues[i]; - // } - - // this.FirstValue = 0; - // this.LastValue = Max; - - // HistoValues = this.CreateHistogram(ListOriginalValues, 0, Max, Type.GetBinNumber()); - - // AverageValue = getAverageValue(ListOriginalValues); - // // if (HistoValues.Length == 1) IsSingle = true; - // // else IsSingle = false; - //} - - /// - /// Create a descritpor based on a single value - /// - /// Descritpor value - /// Descritpor name - public cDescriptor(double Value, cDescriptorsType Type, cScreening CurrentScreening) - { - this.CurrentScreening = CurrentScreening; - this.Type = Type; - this.Histogram = new cHisto(Value); - this.HistoBins = 1; - this.AverageValue = Value; - - this.CellNumber = 0; - //this.FirstValue = this.LastValue = this.AverageValue = this.HistoValues[0] = Value; - - if (CurrentScreening.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.MEMORY) - { - this.OriginalValues = new double[1]; - this.OriginalValues[0] = Value; - } - } - - - - public int CellNumber { get; private set; } - - public cDescriptor(cExtendedList Values, int Bin, cDescriptorsType Type, cScreening CurrentScreening) - { - this.CurrentScreening = CurrentScreening; - this.Type = Type; - this.HistoBins = Bin; - this.Histogram = new cHisto(Values, HistoBins); - - this.HistoBins = this.Histogram.GetXvalues().Count; - this.AverageValue = Values.Mean(); - this.CellNumber = Values.Count; - - if (CurrentScreening.GlobalInfo.CellByCellDataAccessMode == eCellByCellDataAccess.MEMORY) - { - this.OriginalValues = new double[Values.Count]; - Array.Copy(Values.ToArray(), this.OriginalValues, this.OriginalValues.Length); - } - - //this.FirstValue = FirstValue; - // this.LastValue = LastValue; - - //this.HistoValues = new cExtendedList(); - - //this.HistoValues.AddRange(HistoGram); - - //if (HistoGram.Length < Type.GetBinNumber()) - //{ - // for (int i = 0; i < Type.GetBinNumber() - HistoGram.Length; i++) - // this.HistoValues.Add(0); - //} - - - // new double[HistoGram.Length]; - //Array.Copy(HistoGram, this.HistoValues, HistoGram.Length); - //this.Name = Name; - //AverageValue = getAverageValue(HistoGram); - // if (HistoGram.Length == 1) IsSingle = true; - // else IsSingle = false; - } - - } -} diff --git a/Classes/cReference.cs b/Classes/cReference.cs index d832a29..80c0725 100644 --- a/Classes/cReference.cs +++ b/Classes/cReference.cs @@ -5,47 +5,69 @@ using LibPlateAnalysis; using System.Windows.Forms.DataVisualization.Charting; using System.Drawing; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer.Classes { - public class cReference : List + public class cReference //: List { + List ListWellsForReference; + public List GetReferenceWells() + { + return this.ListWellsForReference; + } public cReference(List WellsForReference) { - int IdxDesc = 0; - // main loop over the descriptors - foreach (cDescriptor Desc in WellsForReference[0].ListDescriptors) - { - - cExtendedList NewList = new cExtendedList(); + + this.ListWellsForReference = WellsForReference; + //int IdxDesc = 0; + //// main loop over the descriptors + //foreach (cDescriptor Desc in WellsForReference[0].ListDescriptors) + //{ + // cExtendedList NewList = new cExtendedList(); - for (int i = 0; i < Desc.GetAssociatedType().GetBinNumber(); i++) - { - double CurrentVal = 0; - foreach (cWell CurrentWell in WellsForReference) - { - CurrentVal += CurrentWell.ListDescriptors[IdxDesc].GetHistovalues()[i];// Desc.Getvalue(i); - } - CurrentVal /= (double)WellsForReference.Count; - NewList.Add(CurrentVal); - } - this.Add(NewList); - IdxDesc++; + // for (int i = 0; i < Desc.GetAssociatedType().GetBinNumber(); i++) + // { + // double CurrentVal = 0; + // foreach (cWell CurrentWell in WellsForReference) + // { + // CurrentVal += CurrentWell.ListDescriptors[IdxDesc].GetHistovalues()[i];// Desc.Getvalue(i); + // } + // CurrentVal /= (double)WellsForReference.Count; + // NewList.Add(CurrentVal); + // } + // this.Add(NewList); + // IdxDesc++; + //} + } + + + public cExtendedList GetValues(int DescriptorIdx) + { + cExtendedList ListValue = new cExtendedList(); + foreach (cWell TmpWell in ListWellsForReference) + { + ListValue.AddRange(TmpWell.ListDescriptors[DescriptorIdx].GetOriginalValues()); } + return ListValue; } public Chart GetChart(int DescriptorIdx) { //if (ListDescriptors[CurrentDescriptorToDisplay].GetAssociatedType().GetBinNumber() == 1) return null; + + List CurrentHisto = GetValues(DescriptorIdx).CreateHistogram(100); + + Series CurrentSeries = new Series(); //CurrentSeries.ShadowOffset = 2; - for (int IdxValue = 0; IdxValue < this[DescriptorIdx].Count ; IdxValue++) - CurrentSeries.Points.AddXY(IdxValue,this[DescriptorIdx][IdxValue]); + for (int IdxValue = 0; IdxValue < CurrentHisto[0].Length; IdxValue++) + CurrentSeries.Points.AddXY(CurrentHisto[0][IdxValue], CurrentHisto[1][IdxValue]); ChartArea CurrentChartArea = new ChartArea("ChartArea" + DescriptorIdx); CurrentChartArea.BorderColor = Color.White; diff --git a/Controls/ClassDiagram1.cd b/Controls/ClassDiagram1.cd deleted file mode 100644 index 28956b9..0000000 --- a/Controls/ClassDiagram1.cd +++ /dev/null @@ -1,598 +0,0 @@ - - - - - - AAAAAAAQIAAAACAAAIIAEAAAAAAAAIBAAQAgABAgBAA= - Classes\cDescriptor.cs - - - - - - AAAIAAAAIAAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAA= - Classes\cExportDatabase.cs - - - - - - EIAIACMAAAioQAABMEAAEAQA1BCUQUAAgAhAAACAAAk= - Classes\cPlate.cs - - - - - - - - Classes\cScreen.cs - - - - - Classes\cScreen.cs - - - - - EIAQIAqACAEYQFBCMEAQABQIAQAAASgApEAJTQiIABE= - Classes\cScreening.cs - - - - - - qAAAAAAAAAQCcQACAAgiwYQCCIAABKCADwQACEAAYAA= - Classes\cWell.cs - - - - - - /tv8//1f7+/evz579/2fftP/f+rv26+93a5/3/ndsvs= - Classif.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Controls\PlateChart.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Controls\PlateTabPage.cs - - - - - - AAIAAAAAACAAABAAAASAAAACAAAAgAAAAAAAAAAgAAA= - Forms\FormClassification.cs - - - - - - AAAAAAAAACAAgEAIAACAAAACAAAAAAAAAQAAAAAEAAA= - Forms\FormConsole.cs - - - - - - AAAAAAAAACAAAAAEAACAAAACAAAAAAAAAAAAAAAAAAA= - Forms\FormForKegg.cs - - - - - - AAAAAAAAACQAAAAAAACAAAACACBAAAAAAAAAAAAAAAA= - Forms\FormForNormalization.cs - - - - - - AQAAAAAAQCCAABAIAAiAAACGAAAAAAACAQAAAAAAgAA= - Forms\FormPlatesList.cs - - - - - - AAAAAAAAACAAAAAAAACAAAACAAAAAQAAAAAAAAAAAAA= - Forms\FormsForGraphsDisplay\FormForPie.cs - - - - - - /weEQIQICKUEVBIaEgCiJcIiRQOIkyBOATAKSaGFIHo= - Forms\FormsForOptions\FormForOptionsWindow.cs - - - - - - AAAIQAAAACAAEBAIAACAEAACAAAAACAAQSwAAAAAAAA= - Forms\IO\FormForImportExcel.cs - - - - - - ADABAAIEhAAABIggACJIwAAAQBBAE4UEA1AEiBQKpgA= - Classes\3D\c3DWorld.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAgAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAIAAAAQAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAABAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAAIAAAgAAAAAAAAAAAAAAAAAAEAAAAAAAAgAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAAAAAAAAgAAAAAAAAAAAAAABAAAAAAAAAAABgAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAACAAAEAAAAAAAAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA= - Classes\3D\cGeometricalObjects.cs - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAAAABAAAAAAAAACEAAAQAQQIIAiIAEQCAAAAAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAAAAAAABAAAAAAAAAAAAEAAAAAAADAgAAAAAAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AIAAEBAAADAAAAAAAAAAAAAAAAAIAAAAAAgAAEAJgAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAAIEBAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAEAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAAAEBAAAAAAAAAQAAAAAAAIAIAAAAAAAAAAAAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAAAAAAAAAAAAAAAAAAAEAAAAAAAAEAAAAAAAAAAAAA= - Classes\3D\cInteractiveObjects.cs - - - - - - AAIAgAAAAAAAiEAE6GNDAAAIAQAABLAAiAQ0AAggAjA= - Classes\3D\cMatrix.cs - - - - - - - AAgAAABAAAAAAAAAAABAAAAIIAIAQCAgAAAAAAAAAAA= - Classes\3D\cMatrix.cs - - - - - - AEAAAAAAAAAAAAAEAAAAAAAIMAIQAAAAAAAAAAAAAAA= - Classes\3D\cMatrix.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAA= - Classes\3D\cMetaBiologicalObject.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAA= - Classes\3D\cMetaBiologicalObject.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAQMAAAAAAEAIAAAIAAAAAA= - Classes\3D\cMetaBiologicalObject.cs - - - - - - RAAAEABAUABAAAFAYAAAABwCBAAAEABAAAAAQAgAQAA= - Classes\3D\cMetaBiologicalObject.cs - - - - - - AAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAE= - Classes\3D\cObject3D.cs - - - - - - AEAAAAAAAAAAAAAlABAQEBAAGAEBAICAEIgQABABABA= - Classes\3D\cObject3D.cs - - - - - - AAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAAAABQ= - Classes\cB-Score.cs - - - - - - AAQAAAACAAAAAAAAAAAAAAAgAAAAAAAIAAAAAAACABI= - Classes\cDendoGram.cs - - - - - - AAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAIAAAAAOAA= - Classes\cDRCanalysis.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA= - Classes\cDRCanalysis.cs - - - - - - AQAAAAIABAAAAAEAQAAAEQAAAAgAAIAAAAAACBAAAAQ= - Classes\cDRCanalysis.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\cDRCanalysis.cs - - - - - - AAAAQAAAAIAAAAAABAAAAAAAAAAAAAAAgAAAAIAAAAA= - Classes\cDRCanalysis.cs - - - - - - AACCAGAAAAAAAAAAAAAUAAAAAAAIQAAAQAAAIIAAAGE= - Classes\cDRCanalysis.cs - - - - - - AAAECAAAAAIAAAAAQAAACAAAAAAABAABAACAAAIhICA= - Classes\cEdgeEffect.cs - - - - - - FAUAAAGRADAQKEgAiAgAIAAYCAIQgLKIAAAQRQAAAWA= - Classes\cGlobalInfo.cs - - - - - - AAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\cReference.cs - - - - - - AAAEAAAABAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAA= - Classes\MiscClasses.cs - - - - - - AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABAAAAAAgAAA= - Classes\MiscClasses.cs - - - - - - AAAAAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\MiscClasses.cs - - - - - - AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABAAAAAAAAAA= - Classes\MiscClasses.cs - - - - - - AAAAAAAAABAAAAAAEAIAAAAAIAAIAAAEAAAAAAAAQAA= - Classes\MiscClasses.cs - - - - - - QIAAAgAAAAAAAAAAEAAAAIQAAAAAIgAAAAAAAEAADAA= - Classes\cDescriptor.cs - - - - - - AAAAAAAAAEACQAAABASAAAAQAAAAAAQQAAABAAAARAA= - Classes\cDescriptor.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAA= - Classes\cPlate.cs - - - - - - AAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAA= - Classes\cScreening.cs - - - - - - AAAAAAAAAAAAAAEAAAAAAAAAAAAEAAQAAAQAAQAAAAA= - Classes\cScreening.cs - - - - - - AAAAAAAAICAAABAAAACAgAACAAAAIAAAAUAAAAAAAAA= - Forms\FormForDescriptorInfo.cs - - - - - - AQAABQACISQACEACKAKAAAACAAAAAIAAAAAAAAQBABA= - Forms\FormsForGraphsDisplay\SimpleForm.cs - - - - - - AQAAAQAAISQBCEACJACAAyACAAAAAIAAAAACDACRABA= - Forms\FormsForGraphsDisplay\SimpleFormForXY.cs - - - - - - ABAAABAAACAAAEAAIACAAAACAAACAAAIAACAAAAAABA= - Forms\FormDendogram.cs - - - - - - ATAAAAAAACIAAAACBACAB2BCAACAAAAAgAAADACAQAA= - Forms\3D\FormFor3DDataDisplay.cs - - - - - - AAAAAAAAACAAAAAAAACAAAACAAAAAQAAAAAAAAAAAJA= - Forms\FormForClassificationTree.cs - - - - - - AAAAAAAAACAAAAAEAACAAAACAAAAAQAAAAAQAAAAAAA= - Forms\FormForKeggGene.cs - - - - - - AAAIAAAAECQAABAEQACAAEACAAAAAAAAACQBAAAAABE= - Forms\IO\FormForMultivariateScreen.cs - - - - - - AAAAAAAAACAAAAAAAACAAAACAAAIAAgAAAAAAAAAAAA= - Forms\FormForNameRequest.cs - - - - - - AAAAAAAAACAAAAAAAACAAAACAAAAAAAAIAAAAAAAAAA= - Forms\FormForPathway.cs - - - - - - AAAIAAAAACAAABAAAACAAAACAAAAAAAAAQQAAAAAAAA= - Forms\FormForPlateDimensions.cs - - - - - - AAAAAAAAgCAAABAAAACCIAACAIAAAAAAgAAAAAAAABA= - Forms\FormForSwapClasses.cs - - - - - - AQAAASAAIyQACFICAACAIAACAAAAAIAAAAAAAARBADA= - Forms\FormForWellInformation.cs - - - - - - IgkAAAQACKACARQIIACIFgJCAABEkEAKMCIACIQBDAQ= - Forms\FormsForDRCAnalysis\FormForDRCDesign.cs - - - - - - ewCKAhAAAiSKCBAAYACggMgCAIpIAEAACy2AQkj5AHA= - Forms\IO\FormForGenerateScreening.cs - - - - - - AAAAAAAAACAAAEAAAACAAAACAAAAAAAAAQAAAAAAAAA= - Forms\IO\FormSaveScreening.cs - - - - - - AAAAAAAAACAAABAEAACAAAACAAAgAAAAAAAAAAAAIAA= - Forms\FormsForDRCAnalysis\FormForDRCSelection.cs - - - - - - ARAACAAgACAAAkAAAACAAAACAACAAAAAAAwAAAAAAAA= - Forms\FormsForDRCAnalysis\FormToDisplayDRC.cs - - - - - - AAEAAAAAACAAABAAAACAAAACAAAAAAAIAAAACAEABAA= - Forms\FormsForGraphsDisplay\FormForMaxMinRequest.cs - - - - - - gAAAABAAACAABABAAUCAAAICAAAAgAAAAAARAAAABAA= - Forms\FormsForGraphsDisplay\FormToDisplayArray.cs - - - - \ No newline at end of file diff --git a/Dlls/BioFormats/bio-formats.dll b/Dlls/BioFormats/bio-formats.dll new file mode 100644 index 0000000..e65a68b Binary files /dev/null and b/Dlls/BioFormats/bio-formats.dll differ diff --git a/Dlls/BioFormats/loci_tools.dll b/Dlls/BioFormats/loci_tools.dll new file mode 100644 index 0000000..ed3785a Binary files /dev/null and b/Dlls/BioFormats/loci_tools.dll differ diff --git a/Dlls/ICSharpCode.SharpZipLib.dll b/Dlls/ICSharpCode.SharpZipLib.dll index 8a9043c..77bafe8 100644 Binary files a/Dlls/ICSharpCode.SharpZipLib.dll and b/Dlls/ICSharpCode.SharpZipLib.dll differ diff --git a/Dlls/IKVM.AWT.WinForms.dll b/Dlls/IKVM.AWT.WinForms.dll index f0ca763..154bc2e 100644 Binary files a/Dlls/IKVM.AWT.WinForms.dll and b/Dlls/IKVM.AWT.WinForms.dll differ diff --git a/Dlls/IKVM.OpenJDK.Beans.dll b/Dlls/IKVM.OpenJDK.Beans.dll index eccfb5c..c2402c4 100644 Binary files a/Dlls/IKVM.OpenJDK.Beans.dll and b/Dlls/IKVM.OpenJDK.Beans.dll differ diff --git a/Dlls/IKVM.OpenJDK.Charsets.dll b/Dlls/IKVM.OpenJDK.Charsets.dll index 34f89f4..1bcff82 100644 Binary files a/Dlls/IKVM.OpenJDK.Charsets.dll and b/Dlls/IKVM.OpenJDK.Charsets.dll differ diff --git a/Dlls/IKVM.OpenJDK.Corba.dll b/Dlls/IKVM.OpenJDK.Corba.dll index 5b27eec..22c6f5a 100644 Binary files a/Dlls/IKVM.OpenJDK.Corba.dll and b/Dlls/IKVM.OpenJDK.Corba.dll differ diff --git a/Dlls/IKVM.OpenJDK.Core.dll b/Dlls/IKVM.OpenJDK.Core.dll index 328ab6d..dce0118 100644 Binary files a/Dlls/IKVM.OpenJDK.Core.dll and b/Dlls/IKVM.OpenJDK.Core.dll differ diff --git a/Dlls/IKVM.OpenJDK.Jdbc.dll b/Dlls/IKVM.OpenJDK.Jdbc.dll index 2deab98..49c54d2 100644 Binary files a/Dlls/IKVM.OpenJDK.Jdbc.dll and b/Dlls/IKVM.OpenJDK.Jdbc.dll differ diff --git a/Dlls/IKVM.OpenJDK.Management.dll b/Dlls/IKVM.OpenJDK.Management.dll index 87494b7..8d566ab 100644 Binary files a/Dlls/IKVM.OpenJDK.Management.dll and b/Dlls/IKVM.OpenJDK.Management.dll differ diff --git a/Dlls/IKVM.OpenJDK.Media.dll b/Dlls/IKVM.OpenJDK.Media.dll index 13f6c79..1ed612e 100644 Binary files a/Dlls/IKVM.OpenJDK.Media.dll and b/Dlls/IKVM.OpenJDK.Media.dll differ diff --git a/Dlls/IKVM.OpenJDK.Misc.dll b/Dlls/IKVM.OpenJDK.Misc.dll index 0d6ac33..a4a51e4 100644 Binary files a/Dlls/IKVM.OpenJDK.Misc.dll and b/Dlls/IKVM.OpenJDK.Misc.dll differ diff --git a/Dlls/IKVM.OpenJDK.Naming.dll b/Dlls/IKVM.OpenJDK.Naming.dll index 2b3b5d2..a148b04 100644 Binary files a/Dlls/IKVM.OpenJDK.Naming.dll and b/Dlls/IKVM.OpenJDK.Naming.dll differ diff --git a/Dlls/IKVM.OpenJDK.Remoting.dll b/Dlls/IKVM.OpenJDK.Remoting.dll index 104944a..a897d5c 100644 Binary files a/Dlls/IKVM.OpenJDK.Remoting.dll and b/Dlls/IKVM.OpenJDK.Remoting.dll differ diff --git a/Dlls/IKVM.OpenJDK.Security.dll b/Dlls/IKVM.OpenJDK.Security.dll index 0e87f2d..659682f 100644 Binary files a/Dlls/IKVM.OpenJDK.Security.dll and b/Dlls/IKVM.OpenJDK.Security.dll differ diff --git a/Dlls/IKVM.OpenJDK.SwingAWT.dll b/Dlls/IKVM.OpenJDK.SwingAWT.dll index 2a9c2cd..53dce66 100644 Binary files a/Dlls/IKVM.OpenJDK.SwingAWT.dll and b/Dlls/IKVM.OpenJDK.SwingAWT.dll differ diff --git a/Dlls/IKVM.OpenJDK.Text.dll b/Dlls/IKVM.OpenJDK.Text.dll index 5484e23..6fc4f19 100644 Binary files a/Dlls/IKVM.OpenJDK.Text.dll and b/Dlls/IKVM.OpenJDK.Text.dll differ diff --git a/Dlls/IKVM.OpenJDK.Tools.dll b/Dlls/IKVM.OpenJDK.Tools.dll index 26d8ecd..baec57c 100644 Binary files a/Dlls/IKVM.OpenJDK.Tools.dll and b/Dlls/IKVM.OpenJDK.Tools.dll differ diff --git a/Dlls/IKVM.OpenJDK.Util.dll b/Dlls/IKVM.OpenJDK.Util.dll index 8113cc3..2244658 100644 Binary files a/Dlls/IKVM.OpenJDK.Util.dll and b/Dlls/IKVM.OpenJDK.Util.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.API.dll b/Dlls/IKVM.OpenJDK.XML.API.dll index 40b0d9a..d183463 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.API.dll and b/Dlls/IKVM.OpenJDK.XML.API.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.Bind.dll b/Dlls/IKVM.OpenJDK.XML.Bind.dll index c4c002f..9a646eb 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.Bind.dll and b/Dlls/IKVM.OpenJDK.XML.Bind.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.Crypto.dll b/Dlls/IKVM.OpenJDK.XML.Crypto.dll index 50471b9..6952e6f 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.Crypto.dll and b/Dlls/IKVM.OpenJDK.XML.Crypto.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.Parse.dll b/Dlls/IKVM.OpenJDK.XML.Parse.dll index 917b75c..8c565b1 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.Parse.dll and b/Dlls/IKVM.OpenJDK.XML.Parse.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.Transform.dll b/Dlls/IKVM.OpenJDK.XML.Transform.dll index 6e502f8..6ca0f6e 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.Transform.dll and b/Dlls/IKVM.OpenJDK.XML.Transform.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.WebServices.dll b/Dlls/IKVM.OpenJDK.XML.WebServices.dll index 40ff3cb..20f2bfa 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.WebServices.dll and b/Dlls/IKVM.OpenJDK.XML.WebServices.dll differ diff --git a/Dlls/IKVM.OpenJDK.XML.XPath.dll b/Dlls/IKVM.OpenJDK.XML.XPath.dll index 23c2e9b..b382b2f 100644 Binary files a/Dlls/IKVM.OpenJDK.XML.XPath.dll and b/Dlls/IKVM.OpenJDK.XML.XPath.dll differ diff --git a/Dlls/IKVM.Reflection.dll b/Dlls/IKVM.Reflection.dll index 5dfa23a..c2b777c 100644 Binary files a/Dlls/IKVM.Reflection.dll and b/Dlls/IKVM.Reflection.dll differ diff --git a/Dlls/IKVM.Runtime.JNI.dll b/Dlls/IKVM.Runtime.JNI.dll index 1b69733..14e7224 100644 Binary files a/Dlls/IKVM.Runtime.JNI.dll and b/Dlls/IKVM.Runtime.JNI.dll differ diff --git a/Dlls/IKVM.Runtime.dll b/Dlls/IKVM.Runtime.dll index d69e3f5..aa9799e 100644 Binary files a/Dlls/IKVM.Runtime.dll and b/Dlls/IKVM.Runtime.dll differ diff --git a/Dlls/IKVM7.2/ICSharpCode.SharpZipLib.dll b/Dlls/IKVM7.2/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000..77bafe8 Binary files /dev/null and b/Dlls/IKVM7.2/ICSharpCode.SharpZipLib.dll differ diff --git a/Dlls/IKVM7.2/IKVM.AWT.WinForms.dll b/Dlls/IKVM7.2/IKVM.AWT.WinForms.dll new file mode 100644 index 0000000..154bc2e Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.AWT.WinForms.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Beans.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Beans.dll new file mode 100644 index 0000000..c2402c4 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Beans.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Charsets.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Charsets.dll new file mode 100644 index 0000000..1bcff82 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Charsets.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Corba.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Corba.dll new file mode 100644 index 0000000..22c6f5a Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Corba.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Core.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Core.dll new file mode 100644 index 0000000..dce0118 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Core.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Jdbc.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Jdbc.dll new file mode 100644 index 0000000..49c54d2 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Jdbc.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Management.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Management.dll new file mode 100644 index 0000000..8d566ab Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Management.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Media.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Media.dll new file mode 100644 index 0000000..1ed612e Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Media.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Misc.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Misc.dll new file mode 100644 index 0000000..a4a51e4 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Misc.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Naming.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Naming.dll new file mode 100644 index 0000000..a148b04 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Naming.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Remoting.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Remoting.dll new file mode 100644 index 0000000..a897d5c Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Remoting.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Security.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Security.dll new file mode 100644 index 0000000..659682f Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Security.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.SwingAWT.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.SwingAWT.dll new file mode 100644 index 0000000..53dce66 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.SwingAWT.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Text.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Text.dll new file mode 100644 index 0000000..6fc4f19 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Text.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Tools.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Tools.dll new file mode 100644 index 0000000..baec57c Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Tools.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.Util.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.Util.dll new file mode 100644 index 0000000..2244658 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.Util.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.API.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.API.dll new file mode 100644 index 0000000..d183463 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.API.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Bind.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Bind.dll new file mode 100644 index 0000000..9a646eb Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Bind.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Crypto.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Crypto.dll new file mode 100644 index 0000000..6952e6f Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Crypto.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Parse.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Parse.dll new file mode 100644 index 0000000..8c565b1 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Parse.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Transform.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Transform.dll new file mode 100644 index 0000000..6ca0f6e Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.Transform.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.WebServices.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.WebServices.dll new file mode 100644 index 0000000..20f2bfa Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.WebServices.dll differ diff --git a/Dlls/IKVM7.2/IKVM.OpenJDK.XML.XPath.dll b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.XPath.dll new file mode 100644 index 0000000..b382b2f Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.OpenJDK.XML.XPath.dll differ diff --git a/Dlls/IKVM7.2/IKVM.Reflection.dll b/Dlls/IKVM7.2/IKVM.Reflection.dll new file mode 100644 index 0000000..c2b777c Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.Reflection.dll differ diff --git a/Dlls/IKVM7.2/IKVM.Runtime.JNI.dll b/Dlls/IKVM7.2/IKVM.Runtime.JNI.dll new file mode 100644 index 0000000..14e7224 Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.Runtime.JNI.dll differ diff --git a/Dlls/IKVM7.2/IKVM.Runtime.dll b/Dlls/IKVM7.2/IKVM.Runtime.dll new file mode 100644 index 0000000..aa9799e Binary files /dev/null and b/Dlls/IKVM7.2/IKVM.Runtime.dll differ diff --git a/Dlls/IKVM7.2/ikvm-native-win32-x64.dll b/Dlls/IKVM7.2/ikvm-native-win32-x64.dll new file mode 100644 index 0000000..acb84d0 Binary files /dev/null and b/Dlls/IKVM7.2/ikvm-native-win32-x64.dll differ diff --git a/Dlls/IKVM7.2/ikvm-native-win32-x86.dll b/Dlls/IKVM7.2/ikvm-native-win32-x86.dll new file mode 100644 index 0000000..8c810b7 Binary files /dev/null and b/Dlls/IKVM7.2/ikvm-native-win32-x86.dll differ diff --git a/Dlls/MIConvexHullPlugin.dll b/Dlls/MIConvexHullPlugin.dll new file mode 100644 index 0000000..f04ae0b Binary files /dev/null and b/Dlls/MIConvexHullPlugin.dll differ diff --git a/Dlls/MINE.dll b/Dlls/MINE.dll new file mode 100644 index 0000000..81ce60d Binary files /dev/null and b/Dlls/MINE.dll differ diff --git a/Dlls/OLDIKVM/IKVM.AWT.WinForms.dll b/Dlls/OLDIKVM/IKVM.AWT.WinForms.dll new file mode 100644 index 0000000..f0ca763 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.AWT.WinForms.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Beans.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Beans.dll new file mode 100644 index 0000000..eccfb5c Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Beans.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Charsets.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Charsets.dll new file mode 100644 index 0000000..34f89f4 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Charsets.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Corba.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Corba.dll new file mode 100644 index 0000000..5b27eec Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Corba.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Core.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Core.dll new file mode 100644 index 0000000..328ab6d Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Core.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Jdbc.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Jdbc.dll new file mode 100644 index 0000000..2deab98 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Jdbc.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Management.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Management.dll new file mode 100644 index 0000000..87494b7 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Management.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Media.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Media.dll new file mode 100644 index 0000000..13f6c79 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Media.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Misc.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Misc.dll new file mode 100644 index 0000000..0d6ac33 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Misc.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Naming.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Naming.dll new file mode 100644 index 0000000..2b3b5d2 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Naming.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Remoting.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Remoting.dll new file mode 100644 index 0000000..104944a Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Remoting.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Security.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Security.dll new file mode 100644 index 0000000..0e87f2d Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Security.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.SwingAWT.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.SwingAWT.dll new file mode 100644 index 0000000..2a9c2cd Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.SwingAWT.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Text.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Text.dll new file mode 100644 index 0000000..5484e23 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Text.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Tools.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Tools.dll new file mode 100644 index 0000000..26d8ecd Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Tools.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.Util.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.Util.dll new file mode 100644 index 0000000..8113cc3 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.Util.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.API.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.API.dll new file mode 100644 index 0000000..40b0d9a Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.API.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Bind.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Bind.dll new file mode 100644 index 0000000..c4c002f Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Bind.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Crypto.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Crypto.dll new file mode 100644 index 0000000..50471b9 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Crypto.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Parse.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Parse.dll new file mode 100644 index 0000000..917b75c Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Parse.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Transform.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Transform.dll new file mode 100644 index 0000000..6e502f8 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.Transform.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.WebServices.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.WebServices.dll new file mode 100644 index 0000000..40ff3cb Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.WebServices.dll differ diff --git a/Dlls/OLDIKVM/IKVM.OpenJDK.XML.XPath.dll b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.XPath.dll new file mode 100644 index 0000000..23c2e9b Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.OpenJDK.XML.XPath.dll differ diff --git a/Dlls/OLDIKVM/IKVM.Reflection.dll b/Dlls/OLDIKVM/IKVM.Reflection.dll new file mode 100644 index 0000000..5dfa23a Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.Reflection.dll differ diff --git a/Dlls/OLDIKVM/IKVM.Runtime.JNI.dll b/Dlls/OLDIKVM/IKVM.Runtime.JNI.dll new file mode 100644 index 0000000..1b69733 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.Runtime.JNI.dll differ diff --git a/Dlls/OLDIKVM/IKVM.Runtime.dll b/Dlls/OLDIKVM/IKVM.Runtime.dll new file mode 100644 index 0000000..d69e3f5 Binary files /dev/null and b/Dlls/OLDIKVM/IKVM.Runtime.dll differ diff --git a/Dlls/R-Stats/R.NET.dll b/Dlls/R-Stats/R.NET.dll new file mode 100644 index 0000000..74fb85c Binary files /dev/null and b/Dlls/R-Stats/R.NET.dll differ diff --git a/Dlls/ikvm-native-win32-x64.dll b/Dlls/ikvm-native-win32-x64.dll new file mode 100644 index 0000000..acb84d0 Binary files /dev/null and b/Dlls/ikvm-native-win32-x64.dll differ diff --git a/Dlls/ikvm-native-win32-x86.dll b/Dlls/ikvm-native-win32-x86.dll new file mode 100644 index 0000000..8c810b7 Binary files /dev/null and b/Dlls/ikvm-native-win32-x86.dll differ diff --git a/Dlls/weka.dll b/Dlls/weka.dll index ac5e5a1..116519f 100644 Binary files a/Dlls/weka.dll and b/Dlls/weka.dll differ diff --git a/Forms/3D/FormFor3DDataDisplay.Designer.cs b/Forms/3D/FormFor3DDataDisplay.Designer.cs deleted file mode 100644 index 1e49c54..0000000 --- a/Forms/3D/FormFor3DDataDisplay.Designer.cs +++ /dev/null @@ -1,202 +0,0 @@ -namespace HCSAnalyzer.Forms -{ - partial class FormFor3DDataDisplay - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFor3DDataDisplay)); - this.renderWindowControl1 = new Kitware.VTK.RenderWindowControl(); - this.comboBoxDescriptorX = new System.Windows.Forms.ComboBox(); - this.comboBoxDescriptorY = new System.Windows.Forms.ComboBox(); - this.comboBoxDescriptorZ = new System.Windows.Forms.ComboBox(); - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.axisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.menuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // renderWindowControl1 - // - this.renderWindowControl1.AddTestActors = false; - this.renderWindowControl1.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.renderWindowControl1.Location = new System.Drawing.Point(180, 69); - this.renderWindowControl1.Name = "renderWindowControl1"; - this.renderWindowControl1.Size = new System.Drawing.Size(797, 574); - this.renderWindowControl1.TabIndex = 0; - this.renderWindowControl1.TestText = null; - this.renderWindowControl1.Load += new System.EventHandler(this.renderWindowControl1_Load); - // - // comboBoxDescriptorX - // - this.comboBoxDescriptorX.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.comboBoxDescriptorX.FormattingEnabled = true; - this.comboBoxDescriptorX.Location = new System.Drawing.Point(482, 652); - this.comboBoxDescriptorX.Name = "comboBoxDescriptorX"; - this.comboBoxDescriptorX.Size = new System.Drawing.Size(195, 21); - this.comboBoxDescriptorX.TabIndex = 14; - this.comboBoxDescriptorX.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorX_SelectedIndexChanged); - // - // comboBoxDescriptorY - // - this.comboBoxDescriptorY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.comboBoxDescriptorY.FormattingEnabled = true; - this.comboBoxDescriptorY.Location = new System.Drawing.Point(12, 279); - this.comboBoxDescriptorY.Name = "comboBoxDescriptorY"; - this.comboBoxDescriptorY.Size = new System.Drawing.Size(162, 21); - this.comboBoxDescriptorY.TabIndex = 15; - this.comboBoxDescriptorY.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorY_SelectedIndexChanged); - // - // comboBoxDescriptorZ - // - this.comboBoxDescriptorZ.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.comboBoxDescriptorZ.FormattingEnabled = true; - this.comboBoxDescriptorZ.Location = new System.Drawing.Point(482, 37); - this.comboBoxDescriptorZ.Name = "comboBoxDescriptorZ"; - this.comboBoxDescriptorZ.Size = new System.Drawing.Size(195, 21); - this.comboBoxDescriptorZ.TabIndex = 16; - this.comboBoxDescriptorZ.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorZ_SelectedIndexChanged); - // - // menuStrip1 - // - this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.displayToolStripMenuItem}); - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(989, 24); - this.menuStrip1.TabIndex = 17; - this.menuStrip1.Text = "menuStrip1"; - // - // displayToolStripMenuItem - // - this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem1, - this.refreshToolStripMenuItem, - this.axisToolStripMenuItem}); - this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; - this.displayToolStripMenuItem.Size = new System.Drawing.Size(57, 20); - this.displayToolStripMenuItem.Text = "Display"; - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem1.Text = "Options"; - this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // - // refreshToolStripMenuItem - // - this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; - this.refreshToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; - this.refreshToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.refreshToolStripMenuItem.Text = "Refresh"; - this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); - // - // axisToolStripMenuItem - // - this.axisToolStripMenuItem.CheckOnClick = true; - this.axisToolStripMenuItem.Name = "axisToolStripMenuItem"; - this.axisToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.axisToolStripMenuItem.Text = "Axis"; - this.axisToolStripMenuItem.Click += new System.EventHandler(this.axisToolStripMenuItem_Click); - // - // label1 - // - this.label1.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(449, 655); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(14, 13); - this.label1.TabIndex = 18; - this.label1.Text = "X"; - // - // label2 - // - this.label2.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(449, 40); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(14, 13); - this.label2.TabIndex = 18; - this.label2.Text = "Z"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(86, 254); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(14, 13); - this.label3.TabIndex = 18; - this.label3.Text = "Y"; - // - // FormFor3DDataDisplay - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(989, 682); - this.Controls.Add(this.label2); - this.Controls.Add(this.label3); - this.Controls.Add(this.label1); - this.Controls.Add(this.comboBoxDescriptorZ); - this.Controls.Add(this.comboBoxDescriptorY); - this.Controls.Add(this.comboBoxDescriptorX); - this.Controls.Add(this.renderWindowControl1); - this.Controls.Add(this.menuStrip1); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MainMenuStrip = this.menuStrip1; - this.Name = "FormFor3DDataDisplay"; - this.Text = "3D Data Visualization"; - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private Kitware.VTK.RenderWindowControl renderWindowControl1; - public System.Windows.Forms.ComboBox comboBoxDescriptorX; - public System.Windows.Forms.ComboBox comboBoxDescriptorY; - public System.Windows.Forms.ComboBox comboBoxDescriptorZ; - private System.Windows.Forms.MenuStrip menuStrip1; - private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.ToolStripMenuItem axisToolStripMenuItem; - } -} \ No newline at end of file diff --git a/Forms/3D/FormFor3DVizuOptions.Designer.cs b/Forms/3D/FormFor3DVizuOptions.Designer.cs deleted file mode 100644 index 97ab257..0000000 --- a/Forms/3D/FormFor3DVizuOptions.Designer.cs +++ /dev/null @@ -1,134 +0,0 @@ -namespace HCSAnalyzer.Forms._3D -{ - partial class FormFor3DVizuOptions - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFor3DVizuOptions)); - this.numericUpDownRadiusSphere = new System.Windows.Forms.NumericUpDown(); - this.buttonOK = new System.Windows.Forms.Button(); - this.label3 = new System.Windows.Forms.Label(); - this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); - this.label4 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRadiusSphere)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); - this.SuspendLayout(); - // - // numericUpDownRadiusSphere - // - this.numericUpDownRadiusSphere.DecimalPlaces = 3; - this.numericUpDownRadiusSphere.Location = new System.Drawing.Point(121, 49); - this.numericUpDownRadiusSphere.Maximum = new decimal(new int[] { - 100000000, - 0, - 0, - 0}); - this.numericUpDownRadiusSphere.Name = "numericUpDownRadiusSphere"; - this.numericUpDownRadiusSphere.Size = new System.Drawing.Size(99, 20); - this.numericUpDownRadiusSphere.TabIndex = 5; - this.numericUpDownRadiusSphere.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - // - // buttonOK - // - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(51, 96); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(146, 31); - this.buttonOK.TabIndex = 4; - this.buttonOK.Text = "Ok"; - this.buttonOK.UseVisualStyleBackColor = true; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(29, 51); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(77, 13); - this.label3.TabIndex = 3; - this.label3.Text = "Sphere Radius"; - // - // numericUpDownFontSize - // - this.numericUpDownFontSize.DecimalPlaces = 3; - this.numericUpDownFontSize.Location = new System.Drawing.Point(121, 23); - this.numericUpDownFontSize.Maximum = new decimal(new int[] { - 100000000, - 0, - 0, - 0}); - this.numericUpDownFontSize.Name = "numericUpDownFontSize"; - this.numericUpDownFontSize.Size = new System.Drawing.Size(99, 20); - this.numericUpDownFontSize.TabIndex = 20; - this.numericUpDownFontSize.Value = new decimal(new int[] { - 5, - 0, - 0, - 0}); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(29, 25); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(51, 13); - this.label4.TabIndex = 19; - this.label4.Text = "Font Size"; - // - // FormFor3DVizuOptions - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(249, 137); - this.Controls.Add(this.numericUpDownFontSize); - this.Controls.Add(this.label4); - this.Controls.Add(this.numericUpDownRadiusSphere); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.label3); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormFor3DVizuOptions"; - this.Text = "Options Visualization 3D"; - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRadiusSphere)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - public System.Windows.Forms.NumericUpDown numericUpDownRadiusSphere; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Label label3; - public System.Windows.Forms.NumericUpDown numericUpDownFontSize; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/Forms/FormForCellbyCellClassif.Designer.cs b/Forms/FormForCellbyCellClassif.Designer.cs deleted file mode 100644 index 2142e8d..0000000 --- a/Forms/FormForCellbyCellClassif.Designer.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace HCSAnalyzer.Forms -{ - partial class FormForCellbyCellClassif - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForCellbyCellClassif)); - this.buttonClassify = new System.Windows.Forms.Button(); - this.checkBoxKeepOriginalDesc = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // buttonClassify - // - this.buttonClassify.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonClassify.Location = new System.Drawing.Point(196, 22); - this.buttonClassify.Name = "buttonClassify"; - this.buttonClassify.Size = new System.Drawing.Size(104, 30); - this.buttonClassify.TabIndex = 0; - this.buttonClassify.Text = "Classify"; - this.buttonClassify.UseVisualStyleBackColor = true; - // - // checkBoxKeepOriginalDesc - // - this.checkBoxKeepOriginalDesc.AutoSize = true; - this.checkBoxKeepOriginalDesc.Checked = true; - this.checkBoxKeepOriginalDesc.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxKeepOriginalDesc.Location = new System.Drawing.Point(27, 29); - this.checkBoxKeepOriginalDesc.Name = "checkBoxKeepOriginalDesc"; - this.checkBoxKeepOriginalDesc.Size = new System.Drawing.Size(145, 17); - this.checkBoxKeepOriginalDesc.TabIndex = 1; - this.checkBoxKeepOriginalDesc.Text = "Keep Original Descriptors"; - this.checkBoxKeepOriginalDesc.UseVisualStyleBackColor = true; - // - // FormForCellbyCellClassif - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(334, 77); - this.Controls.Add(this.checkBoxKeepOriginalDesc); - this.Controls.Add(this.buttonClassify); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormForCellbyCellClassif"; - this.Text = "Cell by cell classification"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonClassify; - public System.Windows.Forms.CheckBox checkBoxKeepOriginalDesc; - } -} \ No newline at end of file diff --git a/Forms/FormForDescriptorInfo.Designer.cs b/Forms/FormForDescriptorInfo.Designer.cs index fff73d6..48882b1 100644 --- a/Forms/FormForDescriptorInfo.Designer.cs +++ b/Forms/FormForDescriptorInfo.Designer.cs @@ -37,12 +37,14 @@ private void InitializeComponent() this.labelDataBaseConnection = new System.Windows.Forms.Label(); this.panelForColor = new System.Windows.Forms.Panel(); this.numericUpDownBinValue = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.richTextBoxDescription = new System.Windows.Forms.RichTextBox(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBinValue)).BeginInit(); this.SuspendLayout(); // // buttonOk // - this.buttonOk.Location = new System.Drawing.Point(78, 134); + this.buttonOk.Location = new System.Drawing.Point(145, 412); this.buttonOk.Name = "buttonOk"; this.buttonOk.Size = new System.Drawing.Size(142, 30); this.buttonOk.TabIndex = 0; @@ -53,7 +55,7 @@ private void InitializeComponent() // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(31, 18); + this.label1.Location = new System.Drawing.Point(12, 18); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(35, 13); this.label1.TabIndex = 1; @@ -61,15 +63,15 @@ private void InitializeComponent() // // textBoxNameDescriptor // - this.textBoxNameDescriptor.Location = new System.Drawing.Point(88, 15); + this.textBoxNameDescriptor.Location = new System.Drawing.Point(67, 16); this.textBoxNameDescriptor.Name = "textBoxNameDescriptor"; - this.textBoxNameDescriptor.Size = new System.Drawing.Size(186, 20); + this.textBoxNameDescriptor.Size = new System.Drawing.Size(220, 20); this.textBoxNameDescriptor.TabIndex = 2; // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 60); + this.label2.Location = new System.Drawing.Point(12, 327); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(57, 13); this.label2.TabIndex = 3; @@ -79,7 +81,7 @@ private void InitializeComponent() // this.labelDataType.AutoSize = true; this.labelDataType.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelDataType.Location = new System.Drawing.Point(96, 62); + this.labelDataType.Location = new System.Drawing.Point(109, 329); this.labelDataType.Name = "labelDataType"; this.labelDataType.Size = new System.Drawing.Size(31, 13); this.labelDataType.TabIndex = 3; @@ -90,7 +92,7 @@ private void InitializeComponent() // this.labelDataBaseConnection.AutoSize = true; this.labelDataBaseConnection.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelDataBaseConnection.Location = new System.Drawing.Point(51, 100); + this.labelDataBaseConnection.Location = new System.Drawing.Point(64, 367); this.labelDataBaseConnection.Name = "labelDataBaseConnection"; this.labelDataBaseConnection.Size = new System.Drawing.Size(134, 13); this.labelDataBaseConnection.TabIndex = 5; @@ -99,14 +101,14 @@ private void InitializeComponent() // // panelForColor // - this.panelForColor.Location = new System.Drawing.Point(205, 98); + this.panelForColor.Location = new System.Drawing.Point(218, 365); this.panelForColor.Name = "panelForColor"; this.panelForColor.Size = new System.Drawing.Size(22, 18); this.panelForColor.TabIndex = 6; // // numericUpDownBinValue // - this.numericUpDownBinValue.Location = new System.Drawing.Point(183, 58); + this.numericUpDownBinValue.Location = new System.Drawing.Point(183, 325); this.numericUpDownBinValue.Maximum = new decimal(new int[] { 1000000, 0, @@ -118,7 +120,7 @@ private void InitializeComponent() 0, 0}); this.numericUpDownBinValue.Name = "numericUpDownBinValue"; - this.numericUpDownBinValue.Size = new System.Drawing.Size(91, 20); + this.numericUpDownBinValue.Size = new System.Drawing.Size(104, 20); this.numericUpDownBinValue.TabIndex = 7; this.numericUpDownBinValue.Value = new decimal(new int[] { 1, @@ -126,11 +128,30 @@ private void InitializeComponent() 0, 0}); // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(9, 53); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(60, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Description"; + // + // richTextBoxDescription + // + this.richTextBoxDescription.Location = new System.Drawing.Point(12, 71); + this.richTextBoxDescription.Name = "richTextBoxDescription"; + this.richTextBoxDescription.Size = new System.Drawing.Size(275, 235); + this.richTextBoxDescription.TabIndex = 9; + this.richTextBoxDescription.Text = ""; + // // FormForDescriptorInfo // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(299, 176); + this.ClientSize = new System.Drawing.Size(299, 454); + this.Controls.Add(this.richTextBoxDescription); + this.Controls.Add(this.label3); this.Controls.Add(this.numericUpDownBinValue); this.Controls.Add(this.panelForColor); this.Controls.Add(this.labelDataBaseConnection); @@ -159,5 +180,7 @@ private void InitializeComponent() private System.Windows.Forms.Label labelDataBaseConnection; public System.Windows.Forms.Panel panelForColor; public System.Windows.Forms.NumericUpDown numericUpDownBinValue; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.RichTextBox richTextBoxDescription; } } \ No newline at end of file diff --git a/Forms/FormForDescriptorInfo.cs b/Forms/FormForDescriptorInfo.cs index 6180745..0d6c301 100644 --- a/Forms/FormForDescriptorInfo.cs +++ b/Forms/FormForDescriptorInfo.cs @@ -23,16 +23,10 @@ public FormForDescriptorInfo(cDescriptorsType CurrentDesc) this.CurrentDesc = CurrentDesc; InitializeComponent(); this.textBoxNameDescriptor.Text = CurrentDesc.GetName(); - - if (CurrentDesc.DataType == eDataType.SINGLE) - { + this.richTextBoxDescription.Text = CurrentDesc.description; + this.labelDataType.Text = CurrentDesc.GetDataType(); + if (CurrentDesc.GetDataType() == "Single") this.numericUpDownBinValue.Visible = false; - this.labelDataType.Text = "Single"; - } - else - { - this.labelDataType.Text = "Histogram"; - } this.numericUpDownBinValue.Value = CurrentDesc.GetBinNumber(); this.OriginalBinNumber = CurrentDesc.GetBinNumber(); @@ -56,12 +50,10 @@ private void button1_Click(object sender, EventArgs e) if(CurrentDesc.GetName()!=this.textBoxNameDescriptor.Text) this.CurrentDesc.ChangeName(this.textBoxNameDescriptor.Text); - - if (this.numericUpDownBinValue.Value != OriginalBinNumber) this.CurrentDesc.ChangeBinNumber((int)this.numericUpDownBinValue.Value); - + this.CurrentDesc.description = this.richTextBoxDescription.Text; //this.CurrentDesc.RefreshHisto(this.numericUpDownBinValue.Value); diff --git a/Forms/FormForPCAAxisGeneration.Designer.cs b/Forms/FormForPCAAxisGeneration.Designer.cs index ee087a2..b161e14 100644 --- a/Forms/FormForPCAAxisGeneration.Designer.cs +++ b/Forms/FormForPCAAxisGeneration.Designer.cs @@ -1,6 +1,6 @@ namespace HCSAnalyzer.Forms { - partial class FormForPCAAxisGeneration + partial class FormForProjections { /// /// Required designer variable. @@ -28,7 +28,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForPCAAxisGeneration)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForProjections)); this.comboBoxForNeutralClass = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.buttonClassification = new System.Windows.Forms.Button(); @@ -37,6 +37,7 @@ private void InitializeComponent() this.radioButtonFromCurrentPlate = new System.Windows.Forms.RadioButton(); this.numericUpDownNumberOfAxis = new System.Windows.Forms.NumericUpDown(); this.labelAxeNumber = new System.Windows.Forms.Label(); + this.panelForClasses = new System.Windows.Forms.Panel(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumberOfAxis)).BeginInit(); this.SuspendLayout(); @@ -46,8 +47,8 @@ private void InitializeComponent() this.comboBoxForNeutralClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxForNeutralClass.FormattingEnabled = true; this.comboBoxForNeutralClass.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -56,27 +57,27 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxForNeutralClass.Location = new System.Drawing.Point(128, 21); + this.comboBoxForNeutralClass.Location = new System.Drawing.Point(107, 200); this.comboBoxForNeutralClass.Name = "comboBoxForNeutralClass"; - this.comboBoxForNeutralClass.Size = new System.Drawing.Size(112, 21); + this.comboBoxForNeutralClass.Size = new System.Drawing.Size(117, 21); this.comboBoxForNeutralClass.TabIndex = 30; this.comboBoxForNeutralClass.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxForNeutralClass_DrawItem); // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(43, 24); + this.label1.Location = new System.Drawing.Point(7, 11); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(69, 13); + this.label1.Size = new System.Drawing.Size(93, 13); this.label1.TabIndex = 29; - this.label1.Text = "Neutral Class"; + this.label1.Text = "Classes of Interest"; // // buttonClassification // this.buttonClassification.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonClassification.Location = new System.Drawing.Point(46, 202); + this.buttonClassification.Location = new System.Drawing.Point(106, 250); this.buttonClassification.Name = "buttonClassification"; - this.buttonClassification.Size = new System.Drawing.Size(193, 29); + this.buttonClassification.Size = new System.Drawing.Size(118, 24); this.buttonClassification.TabIndex = 28; this.buttonClassification.Text = "Ok"; this.buttonClassification.UseVisualStyleBackColor = true; @@ -86,17 +87,17 @@ private void InitializeComponent() // this.groupBox1.Controls.Add(this.radioButtonFromFullScreening); this.groupBox1.Controls.Add(this.radioButtonFromCurrentPlate); - this.groupBox1.Location = new System.Drawing.Point(12, 65); + this.groupBox1.Location = new System.Drawing.Point(106, 11); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(260, 59); + this.groupBox1.Size = new System.Drawing.Size(118, 73); this.groupBox1.TabIndex = 31; this.groupBox1.TabStop = false; - this.groupBox1.Text = "From"; + this.groupBox1.Text = "Data"; // // radioButtonFromFullScreening // this.radioButtonFromFullScreening.AutoSize = true; - this.radioButtonFromFullScreening.Location = new System.Drawing.Point(142, 25); + this.radioButtonFromFullScreening.Location = new System.Drawing.Point(17, 44); this.radioButtonFromFullScreening.Name = "radioButtonFromFullScreening"; this.radioButtonFromFullScreening.Size = new System.Drawing.Size(78, 17); this.radioButtonFromFullScreening.TabIndex = 1; @@ -107,7 +108,7 @@ private void InitializeComponent() // this.radioButtonFromCurrentPlate.AutoSize = true; this.radioButtonFromCurrentPlate.Checked = true; - this.radioButtonFromCurrentPlate.Location = new System.Drawing.Point(32, 25); + this.radioButtonFromCurrentPlate.Location = new System.Drawing.Point(17, 19); this.radioButtonFromCurrentPlate.Name = "radioButtonFromCurrentPlate"; this.radioButtonFromCurrentPlate.Size = new System.Drawing.Size(86, 17); this.radioButtonFromCurrentPlate.TabIndex = 0; @@ -117,14 +118,14 @@ private void InitializeComponent() // // numericUpDownNumberOfAxis // - this.numericUpDownNumberOfAxis.Location = new System.Drawing.Point(128, 154); + this.numericUpDownNumberOfAxis.Location = new System.Drawing.Point(129, 123); this.numericUpDownNumberOfAxis.Minimum = new decimal(new int[] { 1, 0, 0, 0}); this.numericUpDownNumberOfAxis.Name = "numericUpDownNumberOfAxis"; - this.numericUpDownNumberOfAxis.Size = new System.Drawing.Size(111, 20); + this.numericUpDownNumberOfAxis.Size = new System.Drawing.Size(75, 20); this.numericUpDownNumberOfAxis.TabIndex = 32; this.numericUpDownNumberOfAxis.Value = new decimal(new int[] { 1, @@ -135,17 +136,25 @@ private void InitializeComponent() // labelAxeNumber // this.labelAxeNumber.AutoSize = true; - this.labelAxeNumber.Location = new System.Drawing.Point(34, 156); + this.labelAxeNumber.Location = new System.Drawing.Point(127, 102); this.labelAxeNumber.Name = "labelAxeNumber"; this.labelAxeNumber.Size = new System.Drawing.Size(78, 13); this.labelAxeNumber.TabIndex = 33; this.labelAxeNumber.Text = "Number of Axis"; // - // FormForPCAAxisGeneration + // panelForClasses + // + this.panelForClasses.Location = new System.Drawing.Point(7, 32); + this.panelForClasses.Name = "panelForClasses"; + this.panelForClasses.Size = new System.Drawing.Size(92, 242); + this.panelForClasses.TabIndex = 34; + // + // FormForProjections // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(285, 243); + this.ClientSize = new System.Drawing.Size(230, 277); + this.Controls.Add(this.panelForClasses); this.Controls.Add(this.labelAxeNumber); this.Controls.Add(this.numericUpDownNumberOfAxis); this.Controls.Add(this.groupBox1); @@ -155,8 +164,8 @@ private void InitializeComponent() this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; - this.Name = "FormForPCAAxisGeneration"; - this.Text = "FormForPCAAxisGeneration"; + this.Name = "FormForProjections"; + this.Text = "FormForProjections"; this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNumberOfAxis)).EndInit(); @@ -175,5 +184,6 @@ private void InitializeComponent() public System.Windows.Forms.RadioButton radioButtonFromCurrentPlate; public System.Windows.Forms.NumericUpDown numericUpDownNumberOfAxis; public System.Windows.Forms.Label labelAxeNumber; + public System.Windows.Forms.Panel panelForClasses; } } \ No newline at end of file diff --git a/Forms/FormForPCAAxisGeneration.cs b/Forms/FormForPCAAxisGeneration.cs index b6e52e3..ac2cbae 100644 --- a/Forms/FormForPCAAxisGeneration.cs +++ b/Forms/FormForPCAAxisGeneration.cs @@ -10,14 +10,13 @@ namespace HCSAnalyzer.Forms { - public partial class FormForPCAAxisGeneration : Form + public partial class FormForProjections : Form { - cScreening CurrentScreening; public cExtendPlateList PlatesToProcess; public bool IsPCA; - public FormForPCAAxisGeneration(cScreening CurrentScreening) + public FormForProjections(cScreening CurrentScreening) { InitializeComponent(); this.CurrentScreening = CurrentScreening; @@ -27,7 +26,7 @@ private void comboBoxForNeutralClass_DrawItem(object sender, DrawItemEventArgs e { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(CurrentScreening.GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(CurrentScreening.GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxForNeutralClass.Items[e.Index].ToString(), comboBoxForNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -48,5 +47,27 @@ private void buttonClassification_Click(object sender, EventArgs e) } + //weka.filters.unsupervised.attribute.RandomProjection RP = new weka.filters.unsupervised.attribute.RandomProjection(); + //Instances Linstances = CompleteScreening.ListPlatesActive[CompleteScreening.CurrentDisplayPlateIdx].CreateInstancesWithoutClass(); + //RP.setInputFormat(Linstances); + //RP.setNumberOfAttributes(2); + //RP.setPercent(0); + //for (int i = 0; i < Linstances.numInstances(); i++) + //{ + // RP.input(Linstances.instance(i)); + //} + + //RP.batchFinished(); + //int NumAtt = RP.getNumberOfAttributes(); + //bool outF = RP.isOutputFormatDefined(); + //Instances newData = RP.getOutputFormat(); + + //Instance processed; + //while ((processed = RP.output()) != null) + //{ + // newData.add(processed); + //} + + } } diff --git a/Forms/FormForSwapClasses.Designer.cs b/Forms/FormForSwapClasses.Designer.cs index 908df4d..3bdf215 100644 --- a/Forms/FormForSwapClasses.Designer.cs +++ b/Forms/FormForSwapClasses.Designer.cs @@ -29,62 +29,32 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForSwapClasses)); - this.comboBoxOriginalClass = new System.Windows.Forms.ComboBox(); this.buttonSwapClass = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); this.comboBoxDestinationClass = new System.Windows.Forms.ComboBox(); this.label2 = new System.Windows.Forms.Label(); + this.panelToBeSwapped = new System.Windows.Forms.Panel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // - // comboBoxOriginalClass - // - this.comboBoxOriginalClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; - this.comboBoxOriginalClass.FormattingEnabled = true; - this.comboBoxOriginalClass.Items.AddRange(new object[] { - "Unselected (-1)", - "Positive (0)", - "Negative (1)", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxOriginalClass.Location = new System.Drawing.Point(122, 30); - this.comboBoxOriginalClass.Name = "comboBoxOriginalClass"; - this.comboBoxOriginalClass.Size = new System.Drawing.Size(139, 21); - this.comboBoxOriginalClass.TabIndex = 2; - this.comboBoxOriginalClass.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxOriginalClass_DrawItem); - // // buttonSwapClass // this.buttonSwapClass.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonSwapClass.Location = new System.Drawing.Point(46, 151); + this.buttonSwapClass.Location = new System.Drawing.Point(39, 276); this.buttonSwapClass.Name = "buttonSwapClass"; - this.buttonSwapClass.Size = new System.Drawing.Size(193, 29); + this.buttonSwapClass.Size = new System.Drawing.Size(168, 25); this.buttonSwapClass.TabIndex = 3; this.buttonSwapClass.Text = "Swap Classes"; this.buttonSwapClass.UseVisualStyleBackColor = true; // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(27, 33); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(70, 13); - this.label1.TabIndex = 4; - this.label1.Text = "Original Class"; - // // comboBoxDestinationClass // this.comboBoxDestinationClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxDestinationClass.FormattingEnabled = true; this.comboBoxDestinationClass.Items.AddRange(new object[] { "Unselected (-1)", - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -93,35 +63,52 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxDestinationClass.Location = new System.Drawing.Point(122, 95); + this.comboBoxDestinationClass.Location = new System.Drawing.Point(133, 124); this.comboBoxDestinationClass.Name = "comboBoxDestinationClass"; - this.comboBoxDestinationClass.Size = new System.Drawing.Size(139, 21); + this.comboBoxDestinationClass.Size = new System.Drawing.Size(103, 21); this.comboBoxDestinationClass.TabIndex = 5; this.comboBoxDestinationClass.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxDestinationClass_DrawItem); // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(27, 98); + this.label2.Location = new System.Drawing.Point(140, 106); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(88, 13); this.label2.TabIndex = 6; this.label2.Text = "Destination Class"; // + // panelToBeSwapped + // + this.panelToBeSwapped.Location = new System.Drawing.Point(8, 19); + this.panelToBeSwapped.Name = "panelToBeSwapped"; + this.panelToBeSwapped.Size = new System.Drawing.Size(100, 239); + this.panelToBeSwapped.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.panelToBeSwapped); + this.groupBox1.Location = new System.Drawing.Point(6, 6); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(117, 264); + this.groupBox1.TabIndex = 7; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "To be Swapped"; + // // FormForSwapClasses // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(284, 204); + this.ClientSize = new System.Drawing.Size(246, 305); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.label2); this.Controls.Add(this.comboBoxDestinationClass); - this.Controls.Add(this.label1); this.Controls.Add(this.buttonSwapClass); - this.Controls.Add(this.comboBoxOriginalClass); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormForSwapClasses"; this.Text = "Swap Classes"; + this.groupBox1.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -130,9 +117,9 @@ private void InitializeComponent() #endregion public System.Windows.Forms.Button buttonSwapClass; - private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; - public System.Windows.Forms.ComboBox comboBoxOriginalClass; public System.Windows.Forms.ComboBox comboBoxDestinationClass; + public System.Windows.Forms.Panel panelToBeSwapped; + private System.Windows.Forms.GroupBox groupBox1; } } \ No newline at end of file diff --git a/Forms/FormForSwapClasses.cs b/Forms/FormForSwapClasses.cs index ba139ea..592fb81 100644 --- a/Forms/FormForSwapClasses.cs +++ b/Forms/FormForSwapClasses.cs @@ -20,7 +20,7 @@ public FormForSwapClasses(cGlobalInfo GlobalInfo) { InitializeComponent(); comboBoxDestinationClass.SelectedIndex = 0; - comboBoxOriginalClass.SelectedIndex = 0; + // comboBoxOriginalClass.SelectedIndex = 0; this.GlobalInfo = GlobalInfo; } @@ -30,24 +30,10 @@ private void comboBoxDestinationClass_DrawItem(object sender, DrawItemEventArgs if (e.Index > 0) { - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index - 1)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index - 1].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); } - e.Graphics.DrawString(comboBoxOriginalClass.Items[e.Index].ToString(), comboBoxOriginalClass.Font, - System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - e.DrawFocusRectangle(); - } - - private void comboBoxOriginalClass_DrawItem(object sender, DrawItemEventArgs e) - { - e.DrawBackground(); - - if (e.Index > 0) - { - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index - 1)); - e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); - } - e.Graphics.DrawString(comboBoxOriginalClass.Items[e.Index].ToString(), comboBoxOriginalClass.Font, + e.Graphics.DrawString(comboBoxDestinationClass.Items[e.Index].ToString(), comboBoxDestinationClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); e.DrawFocusRectangle(); } diff --git a/Forms/FormForWellInformation.cs b/Forms/FormForWellInformation.cs index b0a6369..2f9593e 100644 --- a/Forms/FormForWellInformation.cs +++ b/Forms/FormForWellInformation.cs @@ -147,7 +147,7 @@ private void buttonUpdateAndClose_Click(object sender, EventArgs e) if (double.TryParse(this.textBoxConcentration.Text, out Concen)) CurrentWell.Concentration = Concen; - CurrentWell.AssociatedPlate.ParentScreening.GetCurrentDisplayPlate().DisplayDistribution(CurrentWell.AssociatedPlate.ParentScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CurrentWell.AssociatedPlate.ParentScreening.GetCurrentDisplayPlate().DisplayDistribution(CurrentWell.AssociatedPlate.ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } diff --git a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.Designer.cs b/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.Designer.cs deleted file mode 100644 index 8396c4d..0000000 --- a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.Designer.cs +++ /dev/null @@ -1,195 +0,0 @@ -namespace HCSAnalyzer.Forms.FormsForGraphsDisplay -{ - partial class FormForSingleCellsDisplay - { - /// - /// 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(); - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForSingleCellsDisplay)); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.chartForPoints = new System.Windows.Forms.DataVisualization.Charting.Chart(); - this.contextMenuStripForSingleCell = new System.Windows.Forms.ContextMenuStrip(this.components); - this.mINEAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.comboBoxAxeY = new System.Windows.Forms.ComboBox(); - this.comboBoxAxeX = new System.Windows.Forms.ComboBox(); - this.buttonStartCluster = new System.Windows.Forms.Button(); - this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.pointSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).BeginInit(); - this.contextMenuStripForSingleCell.SuspendLayout(); - this.SuspendLayout(); - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(532, 594); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(36, 13); - this.label2.TabIndex = 8; - this.label2.Text = "Axis Y"; - // - // label1 - // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(532, 567); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(36, 13); - this.label1.TabIndex = 9; - this.label1.Text = "Axis X"; - // - // chartForPoints - // - this.chartForPoints.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))); - chartArea1.AxisX.MajorGrid.Enabled = false; - chartArea1.AxisY.MajorGrid.Enabled = false; - chartArea1.Name = "ChartArea1"; - this.chartForPoints.ChartAreas.Add(chartArea1); - this.chartForPoints.ContextMenuStrip = this.contextMenuStripForSingleCell; - this.chartForPoints.Location = new System.Drawing.Point(12, 3); - this.chartForPoints.Name = "chartForPoints"; - series1.ChartArea = "ChartArea1"; - series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; - series1.MarkerBorderColor = System.Drawing.Color.Black; - series1.MarkerColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0))))); - series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; - series1.Name = "SeriesPts"; - this.chartForPoints.Series.Add(series1); - this.chartForPoints.Size = new System.Drawing.Size(696, 555); - this.chartForPoints.TabIndex = 5; - this.chartForPoints.Text = "chart1"; - // - // contextMenuStripForSingleCell - // - this.contextMenuStripForSingleCell.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.displayToolStripMenuItem, - this.toolStripSeparator1, - this.mINEAnalysisToolStripMenuItem}); - this.contextMenuStripForSingleCell.Name = "contextMenuStripForSingleCell"; - this.contextMenuStripForSingleCell.Size = new System.Drawing.Size(153, 76); - // - // mINEAnalysisToolStripMenuItem - // - this.mINEAnalysisToolStripMenuItem.Name = "mINEAnalysisToolStripMenuItem"; - this.mINEAnalysisToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.mINEAnalysisToolStripMenuItem.Text = "MINE analysis"; - this.mINEAnalysisToolStripMenuItem.Click += new System.EventHandler(this.mINEAnalysisToolStripMenuItem_Click); - // - // comboBoxAxeY - // - this.comboBoxAxeY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxAxeY.FormattingEnabled = true; - this.comboBoxAxeY.Location = new System.Drawing.Point(587, 591); - this.comboBoxAxeY.Name = "comboBoxAxeY"; - this.comboBoxAxeY.Size = new System.Drawing.Size(121, 21); - this.comboBoxAxeY.TabIndex = 7; - this.comboBoxAxeY.SelectedIndexChanged += new System.EventHandler(this.comboBoxAxeY_SelectedIndexChanged); - // - // comboBoxAxeX - // - this.comboBoxAxeX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxAxeX.FormattingEnabled = true; - this.comboBoxAxeX.Location = new System.Drawing.Point(587, 564); - this.comboBoxAxeX.Name = "comboBoxAxeX"; - this.comboBoxAxeX.Size = new System.Drawing.Size(121, 21); - this.comboBoxAxeX.TabIndex = 6; - this.comboBoxAxeX.SelectedIndexChanged += new System.EventHandler(this.comboBoxAxeX_SelectedIndexChanged); - // - // buttonStartCluster - // - this.buttonStartCluster.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonStartCluster.Location = new System.Drawing.Point(12, 570); - this.buttonStartCluster.Name = "buttonStartCluster"; - this.buttonStartCluster.Size = new System.Drawing.Size(79, 39); - this.buttonStartCluster.TabIndex = 10; - this.buttonStartCluster.Text = "Cluster"; - this.buttonStartCluster.UseVisualStyleBackColor = true; - this.buttonStartCluster.Click += new System.EventHandler(this.buttonStartCluster_Click); - // - // displayToolStripMenuItem - // - this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.pointSizeToolStripMenuItem}); - this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; - this.displayToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.displayToolStripMenuItem.Text = "Display"; - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); - // - // pointSizeToolStripMenuItem - // - this.pointSizeToolStripMenuItem.Name = "pointSizeToolStripMenuItem"; - this.pointSizeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.pointSizeToolStripMenuItem.Text = "Point Size"; - this.pointSizeToolStripMenuItem.Click += new System.EventHandler(this.pointSizeToolStripMenuItem_Click); - // - // FormForSingleCellsDisplay - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(720, 618); - this.Controls.Add(this.buttonStartCluster); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.chartForPoints); - this.Controls.Add(this.comboBoxAxeY); - this.Controls.Add(this.comboBoxAxeX); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormForSingleCellsDisplay"; - this.Text = "FormForSingleCellsDisplay"; - ((System.ComponentModel.ISupportInitialize)(this.chartForPoints)).EndInit(); - this.contextMenuStripForSingleCell.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.DataVisualization.Charting.Chart chartForPoints; - public System.Windows.Forms.ComboBox comboBoxAxeY; - public System.Windows.Forms.ComboBox comboBoxAxeX; - private System.Windows.Forms.Button buttonStartCluster; - private System.Windows.Forms.ContextMenuStrip contextMenuStripForSingleCell; - private System.Windows.Forms.ToolStripMenuItem mINEAnalysisToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem pointSizeToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - } -} \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.cs b/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.cs deleted file mode 100644 index e9d61f2..0000000 --- a/Forms/FormsForGraphsDisplay/FormForSingleCellsDisplay.cs +++ /dev/null @@ -1,422 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; -using weka.core; -using weka.clusterers; -using weka.classifiers; -using LibPlateAnalysis; -using HCSAnalyzer.Forms.IO; -using System.Threading.Tasks; - -namespace HCSAnalyzer.Forms.FormsForGraphsDisplay -{ - public partial class FormForSingleCellsDisplay : Form - { - private DataTable dt; - private cGlobalInfo GlobalInfo; - - public FormForSingleCellsDisplay(DataTable dt, cGlobalInfo GlobalInfo) - { - InitializeComponent(); - this.dt = dt; - this.GlobalInfo = GlobalInfo; - // this.dataGridViewForTable.DataSource = dt; - } - - public FormForSingleCellsDisplay() - { - InitializeComponent(); - } - - private void ReDraw() - { - cExtendedList ListX = new cExtendedList(); - cExtendedList ListY = new cExtendedList(); - - - if (this.comboBoxAxeY.SelectedIndex == -1) return; - - for (int j = 0; j < dt.Rows.Count; j++) - { - - ListX.Add(double.Parse(dt.Rows[j][this.comboBoxAxeX.SelectedIndex].ToString())); - ListY.Add(double.Parse(dt.Rows[j][this.comboBoxAxeY.SelectedIndex].ToString())); - } - - this.chartForPoints.ChartAreas[0].AxisX.Title = this.comboBoxAxeX.SelectedItem.ToString(); - this.chartForPoints.ChartAreas[0].AxisY.Title = this.comboBoxAxeY.SelectedItem.ToString(); - - - this.chartForPoints.Series[0].Points.DataBindXY(ListX, ListY); - byte[][] LUT = GlobalInfo.LUT; - if (Classes != null) - for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) - { - int ConvertedValue = (int)(((Classes[j] - 0) * (LUT[0].Length - 1)) / (NumClusters - 0)); - this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); - this.chartForPoints.Series[0].Points[j].MarkerSize = WindowPtSize.trackBarPointSize.Value; - } - else - for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) - { - //int ConvertedValue = (int)(((Classes[j] - 0) * (LUT[0].Length - 1)) / (eval.getNumClusters() - 0)); - - int WellClass = int.Parse(dt.Rows[j][dt.Columns.Count-1].ToString()); - - this.chartForPoints.Series[0].Points[j].MarkerColor = GlobalInfo.GetColor(WellClass); - this.chartForPoints.Series[0].Points[j].MarkerSize = WindowPtSize.trackBarPointSize.Value; - } - } - - - private void comboBoxAxeX_SelectedIndexChanged(object sender, EventArgs e) - { - ReDraw(); - } - - private void comboBoxAxeY_SelectedIndexChanged(object sender, EventArgs e) - { - ReDraw(); - } - - cExtendedList Classes = null; - int NumClusters=0; - - private void buttonStartCluster_Click(object sender, EventArgs e) - { - - FormSingleCellClusteringInfo WindowClusteringInfo = new FormSingleCellClusteringInfo(GlobalInfo); - if (WindowClusteringInfo.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - - - - Instances ListInstances = GlobalInfo.CurrentScreen.CellBasedClassification.CreateInstancesWithoutClass(dt); - if ((WindowClusteringInfo.radioButtonAutomated.Checked) && (WindowClusteringInfo.radioButtonEM.Checked)) - { - ClusterEvaluation eval; - Classes = new cExtendedList(); - weka.clusterers.EM EMCluster = new EM(); - if(WindowClusteringInfo.checkBoxEMAutomated.Checked) - EMCluster.setNumClusters(-1); - else - EMCluster.setNumClusters((int)WindowClusteringInfo.numericUpDownClassNumber.Value); - EMCluster.buildClusterer(ListInstances); - EMCluster.getClusterModelsNumericAtts(); - - eval = new ClusterEvaluation(); - eval.setClusterer(EMCluster); - - eval.evaluateClusterer(ListInstances); - - Classes.AddRange(eval.getClusterAssignments()); - NumClusters= eval.getNumClusters(); - ReDraw(); - FormForCellByCellClusteringResults WindowFormForCellByCellClusteringResults = new FormForCellByCellClusteringResults(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.Clear(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.AppendText(eval.clusterResultsToString()); - if (WindowFormForCellByCellClusteringResults.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - - - } - else if (WindowClusteringInfo.radioButtonDescriptorBased.Checked) - { - Classes = new cExtendedList(); - DataTable FinalDataTable = new DataTable(); - int IdxDescForClassSelect = WindowClusteringInfo.comboBoxDescriptorForClass.SelectedIndex; - for (int IdxWell = 0; IdxWell < GlobalInfo.ListSelectedWell.Count; IdxWell++) - { - cWell TmpWell = GlobalInfo.ListSelectedWell[IdxWell]; - - // if (IdxWell == 0) - if (TmpWell.ListDescriptors[IdxDescForClassSelect].GetAssociatedType().DataType == eDataType.HISTOGRAM) - { - Classes.AddRange(TmpWell.ListDescriptors[IdxDescForClassSelect].GetOriginalValues()); - } - else - { - double ClasseValue = TmpWell.ListDescriptors[IdxDescForClassSelect].GetValue(); - - for (int IdxCell = 0; IdxCell < TmpWell.CellNumber; IdxCell++) - Classes.Add(ClasseValue); - //TmpWell.AddDescriptors - } - } - - - List ListClassValues = new List(); - foreach (var item in Classes.Distinct()) - { - ListClassValues.Add(item); - } - - //(List)Classes.Distinct(); - NumClusters = ListClassValues.Count(); - //Classes = new cExtendedList(); - for (int IdxClust = 0; IdxClust < Classes.Count; IdxClust++) - { - for (int IdxCl = 0; IdxCl < ListClassValues.Count; IdxCl++) - { - if (ListClassValues[IdxCl] == Classes[IdxClust]) - { - Classes[IdxClust] = IdxCl; - break; - } - } - //Classes[IdxClust] = ListClassValues.Find(Classes[IdxClust]); - } - //int NumClusters = - ReDraw(); - - } - - // ReDraw(); - - - - - //if (MessageBox.Show("Do you want perform a j48 training process ?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != System.Windows.Forms.DialogResult.Yes) return; - - weka.core.FastVector attVals = new FastVector(); - for (int i = 0; i < NumClusters; i++) - attVals.addElement("Class__" + (i).ToString()); - - ListInstances.insertAttributeAt(new weka.core.Attribute("Class__", attVals), ListInstances.numAttributes()); - - for (int i = 0; i < Classes.Count; i++) - { - ListInstances.get(i).setValue(ListInstances.numAttributes() - 1, Classes[i]); - } - ListInstances.setClassIndex(ListInstances.numAttributes() - 1); - - - GlobalInfo.CurrentScreen.CellBasedClassification.ClassificationModel_CellBased = new weka.classifiers.trees.J48(); - GlobalInfo.CurrentScreen.CellBasedClassification.SetJ48Tree((weka.classifiers.trees.J48)GlobalInfo.CurrentScreen.CellBasedClassification.ClassificationModel_CellBased,Classes.Count); - GlobalInfo.CurrentScreen.CellBasedClassification.J48Model.setMinNumObj((int)GlobalInfo.OptionsWindow.numericUpDownJ48MinNumObjects.Value); - - - weka.core.Instances train = new weka.core.Instances(ListInstances, 0, ListInstances.numInstances()); - - GlobalInfo.CurrentScreen.CellBasedClassification.ClassificationModel_CellBased.buildClassifier(train); - GlobalInfo.ConsoleWriteLine(GlobalInfo.CurrentScreen.CellBasedClassification.ClassificationModel_CellBased.ToString()); - - GlobalInfo.CurrentScreen.CellBasedClassification.evaluation = new weka.classifiers.Evaluation(ListInstances); - GlobalInfo.CurrentScreen.CellBasedClassification.evaluation.crossValidateModel(GlobalInfo.CurrentScreen.CellBasedClassification.ClassificationModel_CellBased, ListInstances, 2, new java.util.Random(1)); - - GlobalInfo.CurrentScreen.CellBasedClassification.DisplayTree(GlobalInfo).Show(); - - FormForCellbyCellClassif WindowFormForCellbyCellClassif = new FormForCellbyCellClassif(); - if (WindowFormForCellbyCellClassif.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - - - int DescrCount = GlobalInfo.CurrentScreen.ListDescriptors.Count; - - // first we update the descriptor - for (int i = 0; i < ListInstances.numClasses(); i++) - GlobalInfo.CurrentScreen.ListDescriptors.AddNew(new cDescriptorsType("Ratio_Class " + i, true, 1, GlobalInfo)); - - - - FormForProgress ProgressWindow = new FormForProgress(); - ProgressWindow.Show(); - - int IdxProgress = 0; - int MaxProgress = 0; - - foreach (cPlate CurrentPlateToProcess in GlobalInfo.CurrentScreen.ListPlatesAvailable) - MaxProgress += CurrentPlateToProcess.ParentScreening.Columns * CurrentPlateToProcess.ParentScreening.Rows; - ProgressWindow.progressBar.Maximum = MaxProgress; - - - attVals = new FastVector(); - for (int i = 0; i < NumClusters; i++) - attVals.addElement(i.ToString()); - - - //ParallelOptions options = new ParallelOptions(); - //options.MaxDegreeOfParallelism = -1; // -1 is for unlimited. 1 is for sequential. - //Stopwatch stopwatch = new Stopwatch(); - //stopwatch.Start(); - //////for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - //int NumberOfPlates = CompleteScreening.ListPlatesAvailable.Count; - //Parallel.For(0, NumberOfPlates, options, (PlateIdx) => - //{ - // cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate((string)Parent.GlobalInfo.PlateListWindow.listBoxPlateNameToProcess.Items[PlateIdx]); - - // for (int row = 0; row < Parent.Rows; row++) - // for (int col = 0; col < Parent.Columns; col++) - // { - // TempWell = CurrentPlateToProcess.GetWell(col, row, false); - // if (TempWell == null) continue; - // else - // { - // if (TempWell.GetClass() == this.ClassForClassif) - // Pos.Add(TempWell.ListDescriptors[Parent.ListDescriptors.CurrentSelectedDescriptor].GetValue()); - // } - // } - //} - //); - - - - - foreach (cPlate CurrentPlateToProcess in GlobalInfo.CurrentScreen.ListPlatesAvailable) - //Parallel.ForEach(GlobalInfo.CurrentScreen.ListPlatesActive, options, CurrentPlateToProcess => - { - //Parallel.ForEach(CurrentPlateToProcess.ListActiveWells, options, TmpWell => - for(int j=0;j Histo = ListClasses.CreateHistogram(0, ListInstances.numClasses() - 1, ListInstances.numClasses() - 1); - List LDesc = new List(); - - for (int IdxHisto = 0; IdxHisto < Histo[1].Length; IdxHisto++) - { - double Value = (100.0 * Histo[1][IdxHisto]) / (double)ListInstancesTOClassify.numInstances(); - - cDescriptor NewDesc = new cDescriptor(Value, GlobalInfo.CurrentScreen.ListDescriptors[IdxHisto + DescrCount], GlobalInfo.CurrentScreen); - LDesc.Add(NewDesc); - } - - - - TmpWell.AddDescriptors(LDesc); - //TmpWell.AssociatedPlate.DBConnection.DB_CloseConnection(); - - }//); - } - ProgressWindow.Close(); - - if (WindowFormForCellbyCellClassif.checkBoxKeepOriginalDesc.Checked == false) - { - - // int DescNumToRemove = GlobalInfo.CurrentScreen.ListDescriptors.Count - - for (int IdxDesc = 0; IdxDesc < DescrCount; IdxDesc++) - GlobalInfo.CurrentScreen.ListDescriptors.RemoveDesc(GlobalInfo.CurrentScreen.ListDescriptors[0], GlobalInfo.CurrentScreen); - - } - - - - GlobalInfo.CurrentScreen.ListDescriptors.UpDateDisplay(); - GlobalInfo.CurrentScreen.UpDatePlateListWithFullAvailablePlate(); - - for (int idxP = 0; idxP < GlobalInfo.CurrentScreen.ListPlatesActive.Count; idxP++) - GlobalInfo.CurrentScreen.ListPlatesActive[idxP].UpDataMinMax(); - - if (WindowFormForCellbyCellClassif.checkBoxKeepOriginalDesc.Checked == false) - GlobalInfo.CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(0, false); - - //WindowFormForCellbyCellClassif.Close(); - //WindowClusteringInfo.Close(); - - } - - private void mINEAnalysisToolStripMenuItem_Click(object sender, EventArgs e) - { - GlobalInfo.WindowHCSAnalyzer.DisplayMINE(ExtractCellsValuesList(true)); - } - - private List[] ExtractCellsValuesList(bool SelectedDescriptorsOnly) - { - int NumDesc = dt.Columns.Count; - - - if (SelectedDescriptorsOnly) - { - // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - List[] ListValueDesc = new List[GlobalInfo.CurrentScreen.ListDescriptors.GetListNameActives().Count]; - - for (int i = 0; i < ListValueDesc.Length; i++) ListValueDesc[i] = new List(); - - // loop on all the plate - for (int RowIdx = 0; RowIdx < dt.Rows.Count; RowIdx++) - { - int Idx = 0; - for (int ColIdx = 0; ColIdx < dt.Columns.Count; ColIdx++) - if (GlobalInfo.CurrentScreen.ListDescriptors[ColIdx].IsActive()) - { - ListValueDesc[Idx++].Add((double)dt.Rows[RowIdx][ColIdx]); - } - } - return ListValueDesc; - } - - else - { - // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - List[] ListValueDesc = new List[NumDesc]; - - for (int i = 0; i < NumDesc; i++) ListValueDesc[i] = new List(); - - // loop on all the plate - for (int RowIdx = 0; RowIdx < dt.Rows.Count; RowIdx++) - { - for (int ColIdx = 0; ColIdx < dt.Columns.Count; ColIdx++) - ListValueDesc[ColIdx].Add((double)dt.Rows[RowIdx][ColIdx]); - } - return ListValueDesc; - } - } - - - FormForPointSize WindowPtSize = new FormForPointSize(); - - private void pointSizeToolStripMenuItem_Click(object sender, EventArgs e) - { - - - int CurrentMarkerSize = this.chartForPoints.Series[0].Points[0].MarkerSize; - WindowPtSize.trackBarPointSize.Value = CurrentMarkerSize; - - if (WindowPtSize.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - foreach (var item in this.chartForPoints.Series[0].Points) - item.MarkerSize = WindowPtSize.trackBarPointSize.Value; - } - - WindowPtSize.Visible = false; - - - } - - - - - - - - - - - } -} diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayTable.cs b/Forms/FormsForGraphsDisplay/FormToDisplayTable.cs deleted file mode 100644 index a0a4ffe..0000000 --- a/Forms/FormsForGraphsDisplay/FormToDisplayTable.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; -using weka.core; - -namespace HCSAnalyzer.Forms.FormsForGraphsDisplay -{ - public partial class FormToDisplayTable : Form - { - private DataTable dt; - cGlobalInfo GlobalInfo; - - public FormToDisplayTable(DataTable dt, cGlobalInfo GlobalInfo) - { - InitializeComponent(); - this.dt = dt; - this.dataGridViewForTable.DataSource = dt; - this.GlobalInfo = GlobalInfo; - } - - //public FormToDisplayTable() - //{ - // InitializeComponent(); - - //} - - private void ReDraw() - { - cExtendedList ListX = new cExtendedList(); - cExtendedList ListY = new cExtendedList(); - - - if (this.comboBoxAxeY.SelectedIndex == -1) return; - if (this.comboBoxVolume.SelectedIndex == -1) return; - - cExtendedList ListVolumes = new cExtendedList(); - - for (int j = 0; j < dt.Rows.Count; j++) - { - - ListX.Add(double.Parse(dt.Rows[j][this.comboBoxAxeX.SelectedIndex].ToString())); - ListY.Add(double.Parse(dt.Rows[j][this.comboBoxAxeY.SelectedIndex].ToString())); - ListVolumes.Add(double.Parse(dt.Rows[j][this.comboBoxVolume.SelectedIndex].ToString())); - - } - - this.chartForPoints.ChartAreas[0].AxisX.Title = this.comboBoxAxeX.SelectedItem.ToString(); - this.chartForPoints.ChartAreas[0].AxisY.Title = this.comboBoxAxeY.SelectedItem.ToString(); - - - this.chartForPoints.Series[0].Points.DataBindXY(ListX, ListY); - - if (!checkBoxIsVolumeConstant.Checked) - { - double MaxVolume = ListVolumes.Max(); - double MinVolume = ListVolumes.Min(); - - for (int j = 0; j < dt.Rows.Count; j++) - { - - int MarkerArea = (int)((50 * (ListVolumes[j] - MinVolume)) / (MaxVolume - MinVolume)); - this.chartForPoints.Series[0].Points[j].MarkerSize = MarkerArea; - - } - } - - } - - private void comboBoxAxeX_SelectedIndexChanged(object sender, EventArgs e) - { - ReDraw(); - } - - private void comboBoxAxeY_SelectedIndexChanged(object sender, EventArgs e) - { - ReDraw(); - } - - private void comboBoxVolume_SelectedIndexChanged(object sender, EventArgs e) - { - ReDraw(); - } - - private void showClassificationTreeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (GlobalInfo.CurrentScreen.CellBasedClassification.J48Model == null) return; - GlobalInfo.CurrentScreen.CellBasedClassification.DisplayTree(GlobalInfo).Show(); - } - - private void applyClassificationModelToolStripMenuItem_Click(object sender, EventArgs e) - { - return; - - Instances ListInstancesTOClassify = GlobalInfo.CurrentScreen.CellBasedClassification.CreateInstancesWithoutClass(dt); - - - FastVector attVals = new FastVector(); - for (int i = 0; i < GlobalInfo.CurrentScreen.CellBasedClassification.NumClasses; i++) - attVals.addElement(i.ToString()); - - - - ListInstancesTOClassify.insertAttributeAt(new weka.core.Attribute("Class", attVals), ListInstancesTOClassify.numAttributes()); - ListInstancesTOClassify.setClassIndex(ListInstancesTOClassify.numAttributes() - 1); - - List ListIdx = new List(); - int Max = int.MinValue; - int Min = int.MaxValue; - - for (int i = 0; i < ListInstancesTOClassify.numInstances(); i++) - { - Instance InstToProcess = ListInstancesTOClassify.instance(i); - int Value =(int)GlobalInfo.CurrentScreen.CellBasedClassification.J48Model.classifyInstance(InstToProcess); - if (Value > Max) Max = Value; - if (Value < Min) Min = Value; - - ListIdx.Add(Value); - } - - byte[][] LUT = GlobalInfo.LUT; - - for (int j = 0; j < this.chartForPoints.Series[0].Points.Count; j++) - { - int ConvertedValue = (int)(((ListIdx[j] - Min) * (LUT[0].Length - 1)) / (Max - Min)); - this.chartForPoints.Series[0].Points[j].MarkerColor = Color.FromArgb(LUT[0][ConvertedValue], LUT[1][ConvertedValue], LUT[2][ConvertedValue]); - } - - - - } - - - - private void checkBoxIsVolumeConstant_CheckedChanged(object sender, EventArgs e) - { - comboBoxVolume.Enabled = !checkBoxIsVolumeConstant.Checked; - ReDraw(); - } - - - } -} diff --git a/Forms/FormsForImages/FormForImageDisplay.Designer.cs b/Forms/FormsForImages/FormForImageDisplay.Designer.cs index c2e2a32..fb62831 100644 --- a/Forms/FormsForImages/FormForImageDisplay.Designer.cs +++ b/Forms/FormsForImages/FormForImageDisplay.Designer.cs @@ -28,41 +28,142 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForImageDisplay)); + this.statusStripForImageViewer = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabelForZoom = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabelForPosition = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabelStartView = new System.Windows.Forms.ToolStripStatusLabel(); + this.contextMenuStripFor2DImageDisplay = new System.Windows.Forms.ContextMenuStrip(this.components); + this.displayScaleBarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToClipboardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.lUTManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.panelForImage = new System.Windows.Forms.Panel(); + this.statusStripForImageViewer.SuspendLayout(); + this.contextMenuStripFor2DImageDisplay.SuspendLayout(); this.SuspendLayout(); // + // statusStripForImageViewer + // + this.statusStripForImageViewer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabelForZoom, + this.toolStripStatusLabelForPosition, + this.toolStripStatusLabelStartView}); + this.statusStripForImageViewer.Location = new System.Drawing.Point(0, 504); + this.statusStripForImageViewer.Name = "statusStripForImageViewer"; + this.statusStripForImageViewer.ShowItemToolTips = true; + this.statusStripForImageViewer.Size = new System.Drawing.Size(629, 22); + this.statusStripForImageViewer.TabIndex = 5; + this.statusStripForImageViewer.Text = "statusStrip1"; + // + // toolStripStatusLabelForZoom + // + this.toolStripStatusLabelForZoom.Name = "toolStripStatusLabelForZoom"; + this.toolStripStatusLabelForZoom.Size = new System.Drawing.Size(73, 17); + this.toolStripStatusLabelForZoom.Text = "Zoom: 100%"; + // + // toolStripStatusLabelForPosition + // + this.toolStripStatusLabelForPosition.Name = "toolStripStatusLabelForPosition"; + this.toolStripStatusLabelForPosition.Size = new System.Drawing.Size(30, 17); + this.toolStripStatusLabelForPosition.Text = "(0,0)"; + // + // toolStripStatusLabelStartView + // + this.toolStripStatusLabelStartView.Name = "toolStripStatusLabelStartView"; + this.toolStripStatusLabelStartView.Size = new System.Drawing.Size(62, 17); + this.toolStripStatusLabelStartView.Text = "Start View:"; + // + // contextMenuStripFor2DImageDisplay + // + this.contextMenuStripFor2DImageDisplay.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayScaleBarToolStripMenuItem, + this.copyToClipboardToolStripMenuItem, + this.toolStripSeparator1, + this.lUTManagerToolStripMenuItem}); + this.contextMenuStripFor2DImageDisplay.Name = "contextMenuStripFor2DImageDisplay"; + this.contextMenuStripFor2DImageDisplay.Size = new System.Drawing.Size(175, 98); + // + // displayScaleBarToolStripMenuItem + // + this.displayScaleBarToolStripMenuItem.Name = "displayScaleBarToolStripMenuItem"; + this.displayScaleBarToolStripMenuItem.Size = new System.Drawing.Size(174, 22); + this.displayScaleBarToolStripMenuItem.Text = "Display Scale Bar"; + this.displayScaleBarToolStripMenuItem.Click += new System.EventHandler(this.displayScaleBarToolStripMenuItem_Click); + // + // copyToClipboardToolStripMenuItem + // + this.copyToClipboardToolStripMenuItem.Name = "copyToClipboardToolStripMenuItem"; + this.copyToClipboardToolStripMenuItem.Size = new System.Drawing.Size(174, 22); + this.copyToClipboardToolStripMenuItem.Text = "Copy To Clipboard"; + this.copyToClipboardToolStripMenuItem.Click += new System.EventHandler(this.copyToClipboardToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(171, 6); + // + // lUTManagerToolStripMenuItem + // + this.lUTManagerToolStripMenuItem.Name = "lUTManagerToolStripMenuItem"; + this.lUTManagerToolStripMenuItem.Size = new System.Drawing.Size(174, 22); + this.lUTManagerToolStripMenuItem.Text = "LUT manager"; + this.lUTManagerToolStripMenuItem.Click += new System.EventHandler(this.lUTManagerToolStripMenuItem_Click); + // // panelForImage // - this.panelForImage.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.panelForImage.AutoScroll = true; + this.panelForImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelForImage.ContextMenuStrip = this.contextMenuStripFor2DImageDisplay; this.panelForImage.Location = new System.Drawing.Point(12, 12); this.panelForImage.Name = "panelForImage"; - this.panelForImage.Size = new System.Drawing.Size(580, 342); + this.panelForImage.Size = new System.Drawing.Size(605, 476); this.panelForImage.TabIndex = 0; + this.panelForImage.Paint += new System.Windows.Forms.PaintEventHandler(this.panelForImage_Paint); + this.panelForImage.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panelForImage_MouseMove); // // FormForImageDisplay // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; - this.ClientSize = new System.Drawing.Size(604, 366); + this.ClientSize = new System.Drawing.Size(629, 526); + this.Controls.Add(this.statusStripForImageViewer); this.Controls.Add(this.panelForImage); this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormForImageDisplay"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormForImageDisplay_FormClosed); + this.Scroll += new System.Windows.Forms.ScrollEventHandler(this.FormForImageDisplay_Scroll); + this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panelForImage_MouseWheel); + this.Resize += new System.EventHandler(this.FormForImageDisplay_Resize); + this.statusStripForImageViewer.ResumeLayout(false); + this.statusStripForImageViewer.PerformLayout(); + this.contextMenuStripFor2DImageDisplay.ResumeLayout(false); this.ResumeLayout(false); + this.PerformLayout(); } #endregion + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelForZoom; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelForPosition; + private System.Windows.Forms.ContextMenuStrip contextMenuStripFor2DImageDisplay; + private System.Windows.Forms.ToolStripMenuItem displayScaleBarToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToClipboardToolStripMenuItem; protected System.Windows.Forms.Panel panelForImage; + protected System.Windows.Forms.StatusStrip statusStripForImageViewer; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelStartView; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem lUTManagerToolStripMenuItem; + //private System.Windows.Forms.MouseEventHandler panelForImage_MouseWheel; + + } } \ No newline at end of file diff --git a/Forms/FormsForImages/FormForImageDisplay.cs b/Forms/FormsForImages/FormForImageDisplay.cs index 57a7a4b..ab208b1 100644 --- a/Forms/FormsForImages/FormForImageDisplay.cs +++ b/Forms/FormsForImages/FormForImageDisplay.cs @@ -6,18 +6,275 @@ using System.Linq; using System.Text; using System.Windows.Forms; +using ImageAnalysis; +using System.IO; +using HCSAnalyzer.ObjectForNotations; +using HCSAnalyzer.Classes; namespace HCSAnalyzer.Forms.FormsForImages { public partial class FormForImageDisplay : Form { + protected FormForLUTManager LUTManager = null; + + protected cImage AssociatedImage; + int Zoom = 100; + protected int ViewDimX; + protected int ViewDimY; + int StartViewX = 0; + int StartViewY = 0; + + protected Graphics ThisGraph; + protected Bitmap BT = null; + public cGlobalInfo GlobalInfo; + protected FormForImageDisplay() { - + + InitializeComponent(); - + } + + private void panelForImage_MouseWheel(object sender, MouseEventArgs e) + { + Zoom += e.Delta * SystemInformation.MouseWheelScrollLines / 120; + if (Zoom < 5) Zoom = 5; + toolStripStatusLabelForZoom.Text = "Zoom: " + Zoom.ToString() + " %"; + this.StartViewX = this.HorizontalScroll.Value; + this.StartViewY = this.VerticalScroll.Value; + DrawPic(); + } + + private void panelForImage_MouseMove(object sender, MouseEventArgs e) + { + float ZoomFactor = Zoom / 100.0f; + + int PosX = e.X; + int PosY = e.Y; + + if ((PosX >= 0) && (PosX < AssociatedImage.Width) && (PosY >= 0) && (PosY < AssociatedImage.Height)) + { + + + toolStripStatusLabelForPosition.Text = "(" + (int)(PosX / ZoomFactor) + "," + (int)(PosY / ZoomFactor) + ")"; + float Value = AssociatedImage.Data[0].Data[PosX + PosY * AssociatedImage.Width]; + } + //else + //{ + // toolStripStatusLabelForPosition.Text = "(#,#)"; + //} + } + + private void displayScaleBarToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + + private void copyToClipboardToolStripMenuItem_Click(object sender, EventArgs e) + { + if (BT == null) return; + MemoryStream ms = new MemoryStream(); + Clipboard.SetImage(BT); + } + + //private void toolTip1_Popup(object sender, PopupEventArgs e) + //{ + // Point locationOnForm = panelForImage.FindForm().PointToClient(Control.MousePosition); + // string TextForToolTip = locationOnForm.X + "x" + locationOnForm.Y; + // toolTip1.SetToolTip(panelForImage, TextForToolTip); + // // float Value = AssociatedImage.Data[0].Data[PosX + PosY * AssociatedImage.Width]; + // return; + //} + + public void DrawPic() + { + if (this.LUTManager == null) return; + + ThisGraph = panelForImage.CreateGraphics(); + + float ZoomFactor = Zoom / 100.0f; + int NewWidth = (int)(AssociatedImage.Width * ZoomFactor); + int NewHeight = (int)(AssociatedImage.Height * ZoomFactor); + panelForImage.Width = NewWidth; + panelForImage.Height = NewHeight; + + int PosViewX = (this.Width - NewWidth) / 2; + int PosViewY = (this.Height - NewHeight) / 2; + // panelForImage.Location = new Point(PosViewX,PosViewY); + + BT = new Bitmap(NewWidth, NewHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb); + + // Lock the bitmap's bits. + Rectangle rect = new Rectangle(0, 0, NewWidth, NewHeight); + System.Drawing.Imaging.BitmapData bmpData = BT.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, BT.PixelFormat); + + // Get the address of the first line. + IntPtr ptr = bmpData.Scan0; + + int scanline = Math.Abs(bmpData.Stride); + + // Declare an array to hold the bytes of the bitmap. + int bytes = scanline * NewHeight; + byte[] rgbValues = new byte[bytes]; + + // Copy the RGB values into the array. + System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); + + byte CurrentRed; + byte CurrentGreen; + byte CurrentBlue; + + int RealX; + int RealY; + + int NewStartX = (int)(this.StartViewX / ZoomFactor); + int NewStartY = (int)(this.StartViewY / ZoomFactor); + + List Min = new List(); + List Max = new List(); + for (int IdxChannel = 0; IdxChannel < this.AssociatedImage.NumChannels; IdxChannel++) + { + if (this.LUTManager != null) + { + UserControlSingleLUT SingleLUT = (UserControlSingleLUT)this.LUTManager.panelForLUTS.Controls[IdxChannel]; + Min.Add((float)SingleLUT.numericUpDownMinValue.Value); + Max.Add((float)SingleLUT.numericUpDownMaxValue.Value); + } + } + + for (int IdxChannel = 0; IdxChannel < this.AssociatedImage.NumChannels; IdxChannel++) + { + UserControlSingleLUT SingleLUT = (UserControlSingleLUT)this.LUTManager.panelForLUTS.Controls[IdxChannel]; + if (SingleLUT.checkBoxIsActive.Checked == false) continue; + for (int FullY = 0; FullY < NewHeight; FullY++) + { + RealY = (int)(FullY / ZoomFactor) + NewStartY; + if (RealY >= AssociatedImage.Height) RealY = AssociatedImage.Height - 1; + for (int FullX = 0; FullX < NewWidth; FullX++) + { + RealX = (int)(FullX / ZoomFactor) + NewStartX; + if (RealX >= AssociatedImage.Width) RealX = AssociatedImage.Width - 1; + + float Value = AssociatedImage.Data[IdxChannel].Data[RealX + RealY * AssociatedImage.Width]; + + int ConvertedValue = (int)((((SingleLUT.SelectedLUT[0].Length - 1) * (Value - Min[IdxChannel])) / (Max[IdxChannel] - Min[IdxChannel]))); + + if (ConvertedValue < 0) ConvertedValue = 0; + if (ConvertedValue >= SingleLUT.SelectedLUT[0].Length) ConvertedValue = SingleLUT.SelectedLUT[0].Length - 1; + + CurrentRed = (byte)SingleLUT.SelectedLUT[0][ConvertedValue]; + CurrentGreen = (byte)SingleLUT.SelectedLUT[1][ConvertedValue]; + CurrentBlue = (byte)SingleLUT.SelectedLUT[2][ConvertedValue]; + + + double NewValue = rgbValues[3 * FullX + FullY * scanline] + CurrentBlue; + if(NewValue>255) + rgbValues[3 * FullX + FullY * scanline] = 255; + else + rgbValues[3 * FullX + FullY * scanline] += CurrentBlue; + + NewValue = rgbValues[3 * FullX + 1 + FullY * scanline] + CurrentGreen; + if (NewValue > 255) + rgbValues[3 * FullX + 1 + FullY * scanline] = 255; + else + rgbValues[3 * FullX + 1 + FullY * scanline] += CurrentGreen; + + NewValue = rgbValues[3 * FullX + 2 + FullY * scanline] + CurrentRed; + if(NewValue>255) + rgbValues[3 * FullX + 2 + FullY * scanline] = 255; + else + rgbValues[3 * FullX + 2 + FullY * scanline] += CurrentRed; + + } + } + } + + + // Copy the RGB values back to the bitmap + System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes); + + // Unlock the bits. + BT.UnlockBits(bmpData); + + // Draw the modified image. + ThisGraph.DrawImage(BT, this.StartViewX, this.StartViewY); + + //Bitmap BT = new Bitmap(this.Width,this.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); + //Image ImageToDraw = (Image)BT; + + //ThisGraph.DrawImage(/*AssociatedImage.CurrentMSImage*/ ImageToDraw, new Point(0, 0)); + + // ThisGraph.Clear(Color.White); + //NewWindow.pictureBoxForImage.Image = (Image)images[(int)NewWindow.numericUpDownIdxImage.Value]; + //Graphics bmG = Graphics.FromImage((Image)images[(int)NewWindow.numericUpDownIdxImage.Value]); + //ThisGraph.DrawImage((Image)images[(int)NewWindow.numericUpDownIdxImage.Value], new Point(0, 0)); + + foreach (cObjectForAnnotation TmpObj in ListObjectForNotations) + { + if (TmpObj.GetType() == typeof(cString)) + ThisGraph.DrawString(((cString)TmpObj).Text, new Font(FontFamily.GenericSansSerif, ((cString)TmpObj).Size* ZoomFactor) , new SolidBrush(((cString)TmpObj).ObjectColor), ((cString)TmpObj).PosX, ((cString)TmpObj).PosY); + + if (TmpObj.GetType() == typeof(cDisk)) + ThisGraph.FillEllipse(new SolidBrush(((cDisk)TmpObj).ObjectColor), ((cDisk)TmpObj).PosX, ((cDisk)TmpObj).PosY, (((cDisk)TmpObj).Size* ZoomFactor) / 2, (((cDisk)TmpObj).Size*ZoomFactor) / 2); + } + DrawLayers(); } + protected List ListObjectForNotations = new List(); + + void DrawLayers() + { + // ThisGraph = panelForImage.CreateGraphics(); + foreach (cObjectForAnnotation TmpObj in ListObjectForNotations) + { + if (TmpObj.GetType() == typeof(cString)) + ThisGraph.DrawString(((cString)TmpObj).Text, new Font(FontFamily.GenericSansSerif, ((cString)TmpObj).Size), new SolidBrush(((cString)TmpObj).ObjectColor), ((cString)TmpObj).PosX, ((cString)TmpObj).PosY); + + if (TmpObj.GetType() == typeof(cDisk)) + ThisGraph.FillEllipse(new SolidBrush(((cDisk)TmpObj).ObjectColor), ((cDisk)TmpObj).PosX, ((cDisk)TmpObj).PosY, ((cDisk)TmpObj).Size / 2, ((cDisk)TmpObj).Size / 2); + } + } + + private void FormForImageDisplay_Scroll(object sender, ScrollEventArgs e) + { + this.StartViewX = this.HorizontalScroll.Value; + this.StartViewY = this.VerticalScroll.Value; + DrawPic(); + //toolStripStatusLabelStartView.Text = "Start View: " + this.HorizontalScroll.Value + ":" + this.VerticalScroll.Value; + } + + private void FormForImageDisplay_Resize(object sender, EventArgs e) + { + ViewDimX = this.Width - 46; + ViewDimY = this.Height - 68; + this.StartViewX = this.HorizontalScroll.Value; + this.StartViewY = this.VerticalScroll.Value; + DrawPic(); + } + + private void panelForImage_Paint(object sender, PaintEventArgs e) + { + DrawPic(); + } + + private void lUTManagerToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.LUTManager == null) + { + LUTManager.Show(); + } + else + this.LUTManager.Visible = true; + + } + + private void FormForImageDisplay_FormClosed(object sender, FormClosedEventArgs e) + { + this.LUTManager.Close(); + //CurrentFormForImageDisplay + } + + } } diff --git a/Forms/FormsForImages/FormForImageDisplay.resx b/Forms/FormsForImages/FormForImageDisplay.resx index 4a53d92..926d0b2 100644 --- a/Forms/FormsForImages/FormForImageDisplay.resx +++ b/Forms/FormsForImages/FormForImageDisplay.resx @@ -117,6 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 214, 17 + diff --git a/Forms/FormsForImages/FormForLUTManager.Designer.cs b/Forms/FormsForImages/FormForLUTManager.Designer.cs new file mode 100644 index 0000000..d5bad07 --- /dev/null +++ b/Forms/FormsForImages/FormForLUTManager.Designer.cs @@ -0,0 +1,81 @@ +namespace HCSAnalyzer.Forms.FormsForImages +{ + partial class FormForLUTManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForLUTManager)); + this.panelForLUTS = new System.Windows.Forms.Panel(); + this.buttonClose = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // panelForLUTS + // + this.panelForLUTS.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.panelForLUTS.AutoScroll = true; + this.panelForLUTS.Location = new System.Drawing.Point(3, 6); + this.panelForLUTS.Name = "panelForLUTS"; + this.panelForLUTS.Size = new System.Drawing.Size(259, 265); + this.panelForLUTS.TabIndex = 0; + // + // buttonClose + // + this.buttonClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonClose.Location = new System.Drawing.Point(169, 277); + this.buttonClose.Name = "buttonClose"; + this.buttonClose.Size = new System.Drawing.Size(91, 30); + this.buttonClose.TabIndex = 1; + this.buttonClose.Text = "Close"; + this.buttonClose.UseVisualStyleBackColor = true; + this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click); + // + // FormForLUTManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(265, 311); + this.ControlBox = false; + this.Controls.Add(this.buttonClose); + this.Controls.Add(this.panelForLUTS); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormForLUTManager"; + this.Text = "LUT Manager"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonClose; + public System.Windows.Forms.Panel panelForLUTS; + } +} \ No newline at end of file diff --git a/Forms/FormsForImages/FormForLUTManager.cs b/Forms/FormsForImages/FormForLUTManager.cs new file mode 100644 index 0000000..f2dc68c --- /dev/null +++ b/Forms/FormsForImages/FormForLUTManager.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms.FormsForImages +{ + public partial class FormForLUTManager : Form + { + public FormForImageDisplay CurrentFormForImageDisplay = null; + + + public FormForLUTManager(FormForImageDisplay CurrentFormForImageDisplay) + { + this.CurrentFormForImageDisplay = CurrentFormForImageDisplay; + InitializeComponent(); + } + + private void buttonClose_Click(object sender, EventArgs e) + { + this.Visible = false; + } + } +} diff --git a/Forms/IO/FormSingleCellClusteringInfo.resx b/Forms/FormsForImages/FormForLUTManager.resx similarity index 100% rename from Forms/IO/FormSingleCellClusteringInfo.resx rename to Forms/FormsForImages/FormForLUTManager.resx diff --git a/Forms/FormsForImages/UserControlSingleLUT.Designer.cs b/Forms/FormsForImages/UserControlSingleLUT.Designer.cs new file mode 100644 index 0000000..2c9f00d --- /dev/null +++ b/Forms/FormsForImages/UserControlSingleLUT.Designer.cs @@ -0,0 +1,160 @@ +namespace HCSAnalyzer.Forms.FormsForImages +{ + partial class UserControlSingleLUT + { + /// + /// 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.checkBoxIsActive = new System.Windows.Forms.CheckBox(); + this.numericUpDownMaxValue = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownMinValue = new System.Windows.Forms.NumericUpDown(); + this.comboBoxForLUT = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxValue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinValue)).BeginInit(); + this.SuspendLayout(); + // + // checkBoxIsActive + // + this.checkBoxIsActive.AutoSize = true; + this.checkBoxIsActive.Checked = true; + this.checkBoxIsActive.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxIsActive.Location = new System.Drawing.Point(9, 9); + this.checkBoxIsActive.Name = "checkBoxIsActive"; + this.checkBoxIsActive.Size = new System.Drawing.Size(56, 17); + this.checkBoxIsActive.TabIndex = 0; + this.checkBoxIsActive.Text = "Active"; + this.checkBoxIsActive.UseVisualStyleBackColor = true; + this.checkBoxIsActive.CheckedChanged += new System.EventHandler(this.checkBoxIsActive_CheckedChanged); + // + // numericUpDownMaxValue + // + this.numericUpDownMaxValue.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.numericUpDownMaxValue.DecimalPlaces = 1; + this.numericUpDownMaxValue.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.numericUpDownMaxValue.Location = new System.Drawing.Point(163, 32); + this.numericUpDownMaxValue.Maximum = new decimal(new int[] { + -727379968, + 232, + 0, + 0}); + this.numericUpDownMaxValue.Minimum = new decimal(new int[] { + 1316134912, + 2328, + 0, + -2147483648}); + this.numericUpDownMaxValue.Name = "numericUpDownMaxValue"; + this.numericUpDownMaxValue.Size = new System.Drawing.Size(62, 14); + this.numericUpDownMaxValue.TabIndex = 6; + this.numericUpDownMaxValue.Value = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDownMaxValue.ValueChanged += new System.EventHandler(this.numericUpDownMaxValue_ValueChanged); + // + // numericUpDownMinValue + // + this.numericUpDownMinValue.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.numericUpDownMinValue.DecimalPlaces = 1; + this.numericUpDownMinValue.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.numericUpDownMinValue.Location = new System.Drawing.Point(9, 32); + this.numericUpDownMinValue.Maximum = new decimal(new int[] { + -727379968, + 232, + 0, + 0}); + this.numericUpDownMinValue.Minimum = new decimal(new int[] { + 1316134912, + 2328, + 0, + -2147483648}); + this.numericUpDownMinValue.Name = "numericUpDownMinValue"; + this.numericUpDownMinValue.Size = new System.Drawing.Size(62, 14); + this.numericUpDownMinValue.TabIndex = 7; + this.numericUpDownMinValue.ValueChanged += new System.EventHandler(this.numericUpDownMinValue_ValueChanged); + // + // comboBoxForLUT + // + this.comboBoxForLUT.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.comboBoxForLUT.FormattingEnabled = true; + this.comboBoxForLUT.Items.AddRange(new object[] { + "Linear", + "HSV", + "Fire", + "Green to Red", + "Jet", + "Hot", + "Cool", + "Spring", + "Summer", + "Automn", + "Winter", + "Bone", + "Copper"}); + this.comboBoxForLUT.Location = new System.Drawing.Point(119, 56); + this.comboBoxForLUT.Name = "comboBoxForLUT"; + this.comboBoxForLUT.Size = new System.Drawing.Size(106, 20); + this.comboBoxForLUT.TabIndex = 8; + this.comboBoxForLUT.SelectedIndexChanged += new System.EventHandler(this.comboBoxForLUT_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(80, 59); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(28, 13); + this.label1.TabIndex = 9; + this.label1.Text = "LUT"; + // + // UserControlSingleLUT + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Controls.Add(this.label1); + this.Controls.Add(this.comboBoxForLUT); + this.Controls.Add(this.numericUpDownMinValue); + this.Controls.Add(this.numericUpDownMaxValue); + this.Controls.Add(this.checkBoxIsActive); + this.Name = "UserControlSingleLUT"; + this.Size = new System.Drawing.Size(236, 86); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxValue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinValue)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + public System.Windows.Forms.CheckBox checkBoxIsActive; + public System.Windows.Forms.NumericUpDown numericUpDownMaxValue; + public System.Windows.Forms.NumericUpDown numericUpDownMinValue; + private System.Windows.Forms.ComboBox comboBoxForLUT; + private System.Windows.Forms.Label label1; + } +} diff --git a/Forms/FormsForImages/UserControlSingleLUT.cs b/Forms/FormsForImages/UserControlSingleLUT.cs new file mode 100644 index 0000000..c7db984 --- /dev/null +++ b/Forms/FormsForImages/UserControlSingleLUT.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Classes; + +namespace HCSAnalyzer.Forms.FormsForImages +{ + public partial class UserControlSingleLUT : UserControl + { + FormForImageDisplay CurrentFormForImageDisplay = null; + + public byte[][] SelectedLUT { get; private set; } + + cGlobalInfo GlobalInfo; + + public UserControlSingleLUT(FormForImageDisplay CurrentFormForImageDisplay) + { + this.CurrentFormForImageDisplay = CurrentFormForImageDisplay; + this.GlobalInfo = CurrentFormForImageDisplay.GlobalInfo; + this.SelectedLUT = new cLUT().LUT_GREEN_TO_RED; + InitializeComponent(); + } + + private void numericUpDownMinValue_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownMinValue.Value > numericUpDownMaxValue.Value) numericUpDownMinValue.Value = numericUpDownMaxValue.Value; + CurrentFormForImageDisplay.DrawPic(); + } + + private void numericUpDownMaxValue_ValueChanged(object sender, EventArgs e) + { + if (numericUpDownMaxValue.Value < numericUpDownMinValue.Value) numericUpDownMaxValue.Value = numericUpDownMinValue.Value; + CurrentFormForImageDisplay.DrawPic(); + } + + private void comboBoxForLUT_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxForLUT.SelectedIndex) + { + case 0: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_LINEAR; + break; + case 1: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_HSV; + break; + case 2: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_FIRE; + break; + case 3: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_GREEN_TO_RED; + break; + case 4: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_JET; + break; + case 5: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_HOT; + break; + case 6: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_COOL; + break; + case 7: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_SPRING; + break; + case 8: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_SUMMER; + break; + case 9: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_AUTOMN; + break; + case 10: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_WINTER; + break; + case 11: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_BONE; + break; + case 12: + this.SelectedLUT = CurrentFormForImageDisplay.GlobalInfo.LUTs.LUT_COPPER; + break; + + } + + CurrentFormForImageDisplay.DrawPic(); + } + + private void checkBoxIsActive_CheckedChanged(object sender, EventArgs e) + { + CurrentFormForImageDisplay.DrawPic(); + } + } +} diff --git a/Forms/FormsForImages/UserControlSingleLUT.resx b/Forms/FormsForImages/UserControlSingleLUT.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Forms/FormsForImages/UserControlSingleLUT.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/Forms/FormsForOptions/FormForGlobalInfoOptions.Designer.cs b/Forms/FormsForOptions/FormForGlobalInfoOptions.Designer.cs new file mode 100644 index 0000000..b6bdeae --- /dev/null +++ b/Forms/FormsForOptions/FormForGlobalInfoOptions.Designer.cs @@ -0,0 +1,192 @@ +namespace HCSAnalyzer.Forms.FormsForOptions +{ + partial class FormForGlobalInfoOptions + { + /// + /// 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(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Plates and Wells"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Cellular Phenotypes"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Well Classes"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Colors", new System.Windows.Forms.TreeNode[] { + treeNode2, + treeNode3}); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Display", new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode4}); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("3D View"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("3D", new System.Windows.Forms.TreeNode[] { + treeNode6}); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForGlobalInfoOptions)); + this.buttonApply = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.treeViewForOptions = new System.Windows.Forms.TreeView(); + this.contextMenuStripForOptions = new System.Windows.Forms.ContextMenuStrip(this.components); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panelForDisplay = new System.Windows.Forms.Panel(); + this.colorDialog = new System.Windows.Forms.ColorDialog(); + this.contextMenuStripForOptions.SuspendLayout(); + this.SuspendLayout(); + // + // buttonApply + // + this.buttonApply.Location = new System.Drawing.Point(7, 351); + this.buttonApply.Name = "buttonApply"; + this.buttonApply.Size = new System.Drawing.Size(75, 23); + this.buttonApply.TabIndex = 0; + this.buttonApply.Text = "Apply"; + this.buttonApply.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Location = new System.Drawing.Point(426, 351); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 1; + this.buttonOK.Text = "Ok"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // treeViewForOptions + // + this.treeViewForOptions.ContextMenuStrip = this.contextMenuStripForOptions; + this.treeViewForOptions.Location = new System.Drawing.Point(7, 7); + this.treeViewForOptions.Name = "treeViewForOptions"; + treeNode1.Name = "Node0"; + treeNode1.Tag = "Plates and Wells"; + treeNode1.Text = "Plates and Wells"; + treeNode2.Name = "Node1"; + treeNode2.Tag = "Cellular Phenotypes"; + treeNode2.Text = "Cellular Phenotypes"; + treeNode3.Name = "Node2"; + treeNode3.Tag = "Well Classes"; + treeNode3.Text = "Well Classes"; + treeNode4.Name = "Node0"; + treeNode4.Text = "Colors"; + treeNode5.Name = "Node0"; + treeNode5.Text = "Display"; + treeNode6.Name = "NodeFor3DView"; + treeNode6.Tag = "3D"; + treeNode6.Text = "3D View"; + treeNode7.Name = "Node3D"; + treeNode7.Text = "3D"; + this.treeViewForOptions.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode5, + treeNode7}); + this.treeViewForOptions.Size = new System.Drawing.Size(202, 338); + this.treeViewForOptions.TabIndex = 2; + this.treeViewForOptions.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewForOptions_AfterSelect); + // + // contextMenuStripForOptions + // + this.contextMenuStripForOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveToolStripMenuItem, + this.loadToolStripMenuItem, + this.toolStripSeparator1, + this.collapseAllToolStripMenuItem, + this.expandAllToolStripMenuItem}); + this.contextMenuStripForOptions.Name = "contextMenuStripForOptions"; + this.contextMenuStripForOptions.Size = new System.Drawing.Size(137, 98); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(136, 22); + this.saveToolStripMenuItem.Text = "Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // loadToolStripMenuItem + // + this.loadToolStripMenuItem.Name = "loadToolStripMenuItem"; + this.loadToolStripMenuItem.Size = new System.Drawing.Size(136, 22); + this.loadToolStripMenuItem.Text = "Load"; + this.loadToolStripMenuItem.Click += new System.EventHandler(this.loadToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(133, 6); + // + // collapseAllToolStripMenuItem + // + this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem"; + this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22); + this.collapseAllToolStripMenuItem.Text = "Collapse All"; + this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); + // + // expandAllToolStripMenuItem + // + this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem"; + this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22); + this.expandAllToolStripMenuItem.Text = "Expand All"; + this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + // + // panelForDisplay + // + this.panelForDisplay.AutoScroll = true; + this.panelForDisplay.Location = new System.Drawing.Point(215, 7); + this.panelForDisplay.Name = "panelForDisplay"; + this.panelForDisplay.Size = new System.Drawing.Size(286, 338); + this.panelForDisplay.TabIndex = 3; + // + // FormForGlobalInfoOptions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(504, 377); + this.Controls.Add(this.panelForDisplay); + this.Controls.Add(this.treeViewForOptions); + this.Controls.Add(this.buttonOK); + this.Controls.Add(this.buttonApply); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForGlobalInfoOptions"; + this.Text = "Options"; + this.contextMenuStripForOptions.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonApply; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Panel panelForDisplay; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForOptions; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem loadToolStripMenuItem; + private System.Windows.Forms.ColorDialog colorDialog; + private System.Windows.Forms.TreeView treeViewForOptions; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Forms/FormsForOptions/FormForGlobalInfoOptions.cs b/Forms/FormsForOptions/FormForGlobalInfoOptions.cs new file mode 100644 index 0000000..d831b41 --- /dev/null +++ b/Forms/FormsForOptions/FormForGlobalInfoOptions.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using HCSAnalyzer.Forms.FormsForOptions.PanelForOptions; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.IO; + + +namespace HCSAnalyzer.Forms.FormsForOptions +{ + public partial class FormForGlobalInfoOptions : Form + { + cListOptions ListOptions; + + public FormForGlobalInfoOptions(cListOptions ListOptions) + { + InitializeComponent(); + + + + + + this.ListOptions = ListOptions; + } + + TreeNode ToReturn = null; + + + private void LoopRecursive(TreeNode treeNode, string TagName) + { + foreach (TreeNode tn in treeNode.Nodes) + { + if ((tn.Tag != null) && (tn.Tag == TagName)) + { + ToReturn = tn; + return; + } + LoopRecursive(tn, TagName); + } + return; + } + + public void SelectOption(string TagName) + { + foreach (TreeNode item in treeViewForOptions.Nodes) + { + LoopRecursive(item, TagName); + } + + if (ToReturn != null) treeViewForOptions.SelectedNode = ToReturn; + } + + private void treeViewForOptions_AfterSelect(object sender, TreeViewEventArgs e) + { + this.panelForDisplay.Controls.Clear(); + Panel PanelToDisp = ListOptions.GetPanel((string)e.Node.Tag); + if (PanelToDisp == null) return; + this.panelForDisplay.Controls.Add(PanelToDisp); + } + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveFileDialog CurrSavefileDialog = new SaveFileDialog(); + CurrSavefileDialog.Filter = "opt files (*.opt)|*.opt"; + DialogResult Res = CurrSavefileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrSavefileDialog.FileName == "") return; + + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(CurrSavefileDialog.FileName, + FileMode.Create, + FileAccess.Write, FileShare.None); + formatter.Serialize(stream, ListOptions); + stream.Close(); + } + + private void loadToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + + CurrOpenFileDialog.Filter = "opt files (*.opt)|*.opt"; + DialogResult Res = CurrOpenFileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + + if (CurrOpenFileDialog.FileName == "") return; + + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(CurrOpenFileDialog.FileName, + FileMode.Open, + FileAccess.Read, + FileShare.Read); + + // MyObject obj = (MyObject)formatter.Deserialize(fromStream); + stream.Close(); + + + + } + + private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.CollapseAll(); + } + + private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) + { + this.treeViewForOptions.ExpandAll(); + } + } +} diff --git a/Forms/FormsForOptions/FormForGlobalInfoOptions.resx b/Forms/FormsForOptions/FormForGlobalInfoOptions.resx new file mode 100644 index 0000000..d115ea3 --- /dev/null +++ b/Forms/FormsForOptions/FormForGlobalInfoOptions.resx @@ -0,0 +1,1793 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 246, 22 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/FormsForOptions/FormForHistogramMode.Designer.cs b/Forms/FormsForOptions/FormForHistogramMode.Designer.cs deleted file mode 100644 index 38188f7..0000000 --- a/Forms/FormsForOptions/FormForHistogramMode.Designer.cs +++ /dev/null @@ -1,161 +0,0 @@ -namespace HCSAnalyzer.Forms -{ - partial class FormForHistogramMode - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); - System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForHistogramMode)); - this.buttonOk = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.comboBoxOriginalClass = new System.Windows.Forms.ComboBox(); - this.buttonMetric = new System.Windows.Forms.Button(); - this.chartForReference = new System.Windows.Forms.DataVisualization.Charting.Chart(); - this.numericUpDownBinNumber = new System.Windows.Forms.NumericUpDown(); - this.label2 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.chartForReference)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBinNumber)).BeginInit(); - this.SuspendLayout(); - // - // buttonOk - // - this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOk.Location = new System.Drawing.Point(39, 580); - this.buttonOk.Name = "buttonOk"; - this.buttonOk.Size = new System.Drawing.Size(163, 32); - this.buttonOk.TabIndex = 0; - this.buttonOk.Text = "Ok"; - this.buttonOk.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(15, 33); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(82, 13); - this.label1.TabIndex = 6; - this.label1.Text = "Class of Interest"; - // - // comboBoxOriginalClass - // - this.comboBoxOriginalClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; - this.comboBoxOriginalClass.FormattingEnabled = true; - this.comboBoxOriginalClass.Items.AddRange(new object[] { - "Unselected (-1)", - "Positive (0)", - "Negative (1)", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxOriginalClass.Location = new System.Drawing.Point(110, 30); - this.comboBoxOriginalClass.Name = "comboBoxOriginalClass"; - this.comboBoxOriginalClass.Size = new System.Drawing.Size(139, 21); - this.comboBoxOriginalClass.TabIndex = 5; - this.comboBoxOriginalClass.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxOriginalClass_DrawItem); - // - // buttonMetric - // - this.buttonMetric.Location = new System.Drawing.Point(39, 78); - this.buttonMetric.Name = "buttonMetric"; - this.buttonMetric.Size = new System.Drawing.Size(177, 32); - this.buttonMetric.TabIndex = 7; - this.buttonMetric.Text = "Metric"; - this.buttonMetric.UseVisualStyleBackColor = true; - this.buttonMetric.Click += new System.EventHandler(this.buttonMetric_Click); - // - // chartForReference - // - chartArea1.Name = "ChartArea1"; - this.chartForReference.ChartAreas.Add(chartArea1); - legend1.Name = "Legend1"; - this.chartForReference.Legends.Add(legend1); - this.chartForReference.Location = new System.Drawing.Point(284, 12); - this.chartForReference.Name = "chartForReference"; - series1.ChartArea = "ChartArea1"; - series1.Legend = "Legend1"; - series1.Name = "Series1"; - this.chartForReference.Series.Add(series1); - this.chartForReference.Size = new System.Drawing.Size(531, 328); - this.chartForReference.TabIndex = 8; - // - // numericUpDownBinNumber - // - this.numericUpDownBinNumber.Location = new System.Drawing.Point(110, 143); - this.numericUpDownBinNumber.Name = "numericUpDownBinNumber"; - this.numericUpDownBinNumber.Size = new System.Drawing.Size(139, 20); - this.numericUpDownBinNumber.TabIndex = 9; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(15, 145); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(62, 13); - this.label2.TabIndex = 6; - this.label2.Text = "Bin Number"; - // - // FormForHistogramMode - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(827, 624); - this.Controls.Add(this.numericUpDownBinNumber); - this.Controls.Add(this.chartForReference); - this.Controls.Add(this.buttonMetric); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.comboBoxOriginalClass); - this.Controls.Add(this.buttonOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormForHistogramMode"; - this.Text = "Histogram Mode"; - ((System.ComponentModel.ISupportInitialize)(this.chartForReference)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBinNumber)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOk; - private System.Windows.Forms.Label label1; - public System.Windows.Forms.ComboBox comboBoxOriginalClass; - private System.Windows.Forms.Button buttonMetric; - public System.Windows.Forms.DataVisualization.Charting.Chart chartForReference; - public System.Windows.Forms.NumericUpDown numericUpDownBinNumber; - private System.Windows.Forms.Label label2; - } -} \ No newline at end of file diff --git a/Forms/FormsForOptions/FormForHistogramMode.cs b/Forms/FormsForOptions/FormForHistogramMode.cs deleted file mode 100644 index 422d6d9..0000000 --- a/Forms/FormsForOptions/FormForHistogramMode.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; - -namespace HCSAnalyzer.Forms -{ - public partial class FormForHistogramMode : Form - { - - cGlobalInfo GlobalInfo; - - public FormForHistogramMode(cGlobalInfo GlobalInfo) - { - InitializeComponent(); - this.GlobalInfo = GlobalInfo; - } - - private void comboBoxOriginalClass_DrawItem(object sender, DrawItemEventArgs e) - { - e.DrawBackground(); - - if (e.Index > 0) - { - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index - 1)); - e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); - } - e.Graphics.DrawString(comboBoxOriginalClass.Items[e.Index].ToString(), comboBoxOriginalClass.Font, - System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - e.DrawFocusRectangle(); - } - - private void buttonMetric_Click(object sender, EventArgs e) - { - this.GlobalInfo.OptionsWindow.tabControlWindowOption.SelectedTab = this.GlobalInfo.OptionsWindow.tabPageHisto; - GlobalInfo.OptionsWindow.Visible = true; - } - } -} diff --git a/Forms/FormsForOptions/FormForOptionsWindow.Designer.cs b/Forms/FormsForOptions/FormForOptionsWindow.Designer.cs index ae08094..667b8d8 100644 --- a/Forms/FormsForOptions/FormForOptionsWindow.Designer.cs +++ b/Forms/FormsForOptions/FormForOptionsWindow.Designer.cs @@ -146,7 +146,10 @@ private void InitializeComponent() this.label27 = new System.Windows.Forms.Label(); this.numericUpDownWellOpacity = new System.Windows.Forms.NumericUpDown(); this.label25 = new System.Windows.Forms.Label(); - this.tabPageHisto = new System.Windows.Forms.TabPage(); + this.tabPage8 = new System.Windows.Forms.TabPage(); + this.groupBox27 = new System.Windows.Forms.GroupBox(); + this.radioButtonBackColorAverageValue = new System.Windows.Forms.RadioButton(); + this.radioButtonBackColorDefault = new System.Windows.Forms.RadioButton(); this.label31 = new System.Windows.Forms.Label(); this.groupBox26 = new System.Windows.Forms.GroupBox(); this.radioButtonHistoDisplayAdjusted = new System.Windows.Forms.RadioButton(); @@ -166,6 +169,11 @@ private void InitializeComponent() this.radioButtonDistributionMetricCosine = new System.Windows.Forms.RadioButton(); this.radioButtonDistributionMetricManhattan = new System.Windows.Forms.RadioButton(); this.radioButtonDistributionMetricEuclidean = new System.Windows.Forms.RadioButton(); + this.tabPageClasses = new System.Windows.Forms.TabPage(); + this.groupBox29 = new System.Windows.Forms.GroupBox(); + this.panelForCellularPhenotypes = new System.Windows.Forms.Panel(); + this.groupBox28 = new System.Windows.Forms.GroupBox(); + this.panelForWellClasses = new System.Windows.Forms.Panel(); this.buttonOk = new System.Windows.Forms.Button(); this.colorDialog = new System.Windows.Forms.ColorDialog(); this.buttonApply = new System.Windows.Forms.Button(); @@ -227,13 +235,17 @@ private void InitializeComponent() this.groupBox21.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellSize)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellOpacity)).BeginInit(); - this.tabPageHisto.SuspendLayout(); + this.tabPage8.SuspendLayout(); + this.groupBox27.SuspendLayout(); this.groupBox26.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualMax)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualMin)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutomatedMax)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutomatedMin)).BeginInit(); this.groupBox24.SuspendLayout(); + this.tabPageClasses.SuspendLayout(); + this.groupBox29.SuspendLayout(); + this.groupBox28.SuspendLayout(); this.SuspendLayout(); // // tabControlWindowOption @@ -248,7 +260,8 @@ private void InitializeComponent() this.tabControlWindowOption.Controls.Add(this.tabPage5); this.tabControlWindowOption.Controls.Add(this.tabPage6); this.tabControlWindowOption.Controls.Add(this.tabPage3D); - this.tabControlWindowOption.Controls.Add(this.tabPageHisto); + this.tabControlWindowOption.Controls.Add(this.tabPage8); + this.tabControlWindowOption.Controls.Add(this.tabPageClasses); this.tabControlWindowOption.Location = new System.Drawing.Point(12, 12); this.tabControlWindowOption.Multiline = true; this.tabControlWindowOption.Name = "tabControlWindowOption"; @@ -1770,24 +1783,58 @@ private void InitializeComponent() this.label25.TabIndex = 0; this.label25.Text = "Well opacity"; // - // tabPageHisto - // - this.tabPageHisto.Controls.Add(this.label31); - this.tabPageHisto.Controls.Add(this.groupBox26); - this.tabPageHisto.Controls.Add(this.groupBox24); - this.tabPageHisto.Location = new System.Drawing.Point(4, 58); - this.tabPageHisto.Name = "tabPageHisto"; - this.tabPageHisto.Padding = new System.Windows.Forms.Padding(3); - this.tabPageHisto.Size = new System.Drawing.Size(396, 384); - this.tabPageHisto.TabIndex = 11; - this.tabPageHisto.Text = "Histogram Analysis && Display"; - this.tabPageHisto.UseVisualStyleBackColor = true; + // tabPage8 + // + this.tabPage8.Controls.Add(this.groupBox27); + this.tabPage8.Controls.Add(this.label31); + this.tabPage8.Controls.Add(this.groupBox26); + this.tabPage8.Controls.Add(this.groupBox24); + this.tabPage8.Location = new System.Drawing.Point(4, 58); + this.tabPage8.Name = "tabPage8"; + this.tabPage8.Padding = new System.Windows.Forms.Padding(3); + this.tabPage8.Size = new System.Drawing.Size(396, 384); + this.tabPage8.TabIndex = 11; + this.tabPage8.Text = "Histogram Analysis && Display"; + this.tabPage8.UseVisualStyleBackColor = true; + // + // groupBox27 + // + this.groupBox27.Controls.Add(this.radioButtonBackColorAverageValue); + this.groupBox27.Controls.Add(this.radioButtonBackColorDefault); + this.groupBox27.Location = new System.Drawing.Point(9, 316); + this.groupBox27.Name = "groupBox27"; + this.groupBox27.Size = new System.Drawing.Size(376, 62); + this.groupBox27.TabIndex = 5; + this.groupBox27.TabStop = false; + this.groupBox27.Text = "Back Color"; + // + // radioButtonBackColorAverageValue + // + this.radioButtonBackColorAverageValue.AutoSize = true; + this.radioButtonBackColorAverageValue.Location = new System.Drawing.Point(214, 28); + this.radioButtonBackColorAverageValue.Name = "radioButtonBackColorAverageValue"; + this.radioButtonBackColorAverageValue.Size = new System.Drawing.Size(95, 17); + this.radioButtonBackColorAverageValue.TabIndex = 1; + this.radioButtonBackColorAverageValue.Text = "Average Value"; + this.radioButtonBackColorAverageValue.UseVisualStyleBackColor = true; + // + // radioButtonBackColorDefault + // + this.radioButtonBackColorDefault.AutoSize = true; + this.radioButtonBackColorDefault.Checked = true; + this.radioButtonBackColorDefault.Location = new System.Drawing.Point(90, 28); + this.radioButtonBackColorDefault.Name = "radioButtonBackColorDefault"; + this.radioButtonBackColorDefault.Size = new System.Drawing.Size(59, 17); + this.radioButtonBackColorDefault.TabIndex = 0; + this.radioButtonBackColorDefault.TabStop = true; + this.radioButtonBackColorDefault.Text = "Default"; + this.radioButtonBackColorDefault.UseVisualStyleBackColor = true; // // label31 // this.label31.AutoSize = true; this.label31.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label31.Location = new System.Drawing.Point(6, 194); + this.label31.Location = new System.Drawing.Point(6, 162); this.label31.Name = "label31"; this.label31.Size = new System.Drawing.Size(108, 13); this.label31.TabIndex = 4; @@ -1804,9 +1851,9 @@ private void InitializeComponent() this.groupBox26.Controls.Add(this.numericUpDownAutomatedMin); this.groupBox26.Controls.Add(this.radioButtonHistoDisplayManualMinMax); this.groupBox26.Controls.Add(this.radioButtonHistoDisplayAutomatedMinMax); - this.groupBox26.Location = new System.Drawing.Point(9, 216); + this.groupBox26.Location = new System.Drawing.Point(9, 178); this.groupBox26.Name = "groupBox26"; - this.groupBox26.Size = new System.Drawing.Size(376, 150); + this.groupBox26.Size = new System.Drawing.Size(376, 131); this.groupBox26.TabIndex = 1; this.groupBox26.TabStop = false; this.groupBox26.Text = "Scale"; @@ -1814,7 +1861,7 @@ private void InitializeComponent() // radioButtonHistoDisplayAdjusted // this.radioButtonHistoDisplayAdjusted.AutoSize = true; - this.radioButtonHistoDisplayAdjusted.Location = new System.Drawing.Point(25, 108); + this.radioButtonHistoDisplayAdjusted.Location = new System.Drawing.Point(25, 101); this.radioButtonHistoDisplayAdjusted.Name = "radioButtonHistoDisplayAdjusted"; this.radioButtonHistoDisplayAdjusted.Size = new System.Drawing.Size(124, 17); this.radioButtonHistoDisplayAdjusted.TabIndex = 7; @@ -1824,7 +1871,7 @@ private void InitializeComponent() // numericUpDownManualMax // this.numericUpDownManualMax.DecimalPlaces = 3; - this.numericUpDownManualMax.Location = new System.Drawing.Point(281, 74); + this.numericUpDownManualMax.Location = new System.Drawing.Point(281, 70); this.numericUpDownManualMax.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -1848,7 +1895,7 @@ private void InitializeComponent() // numericUpDownManualMin // this.numericUpDownManualMin.DecimalPlaces = 3; - this.numericUpDownManualMin.Location = new System.Drawing.Point(171, 74); + this.numericUpDownManualMin.Location = new System.Drawing.Point(171, 70); this.numericUpDownManualMin.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -1876,7 +1923,7 @@ private void InitializeComponent() // numericUpDownAutomatedMax // this.numericUpDownAutomatedMax.DecimalPlaces = 3; - this.numericUpDownAutomatedMax.Location = new System.Drawing.Point(281, 41); + this.numericUpDownAutomatedMax.Location = new System.Drawing.Point(281, 37); this.numericUpDownAutomatedMax.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -1904,7 +1951,7 @@ private void InitializeComponent() // numericUpDownAutomatedMin // this.numericUpDownAutomatedMin.DecimalPlaces = 3; - this.numericUpDownAutomatedMin.Location = new System.Drawing.Point(171, 41); + this.numericUpDownAutomatedMin.Location = new System.Drawing.Point(171, 37); this.numericUpDownAutomatedMin.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -1923,7 +1970,7 @@ private void InitializeComponent() // radioButtonHistoDisplayManualMinMax // this.radioButtonHistoDisplayManualMinMax.AutoSize = true; - this.radioButtonHistoDisplayManualMinMax.Location = new System.Drawing.Point(25, 74); + this.radioButtonHistoDisplayManualMinMax.Location = new System.Drawing.Point(25, 70); this.radioButtonHistoDisplayManualMinMax.Name = "radioButtonHistoDisplayManualMinMax"; this.radioButtonHistoDisplayManualMinMax.Size = new System.Drawing.Size(60, 17); this.radioButtonHistoDisplayManualMinMax.TabIndex = 0; @@ -1934,7 +1981,7 @@ private void InitializeComponent() // this.radioButtonHistoDisplayAutomatedMinMax.AutoSize = true; this.radioButtonHistoDisplayAutomatedMinMax.Checked = true; - this.radioButtonHistoDisplayAutomatedMinMax.Location = new System.Drawing.Point(25, 41); + this.radioButtonHistoDisplayAutomatedMinMax.Location = new System.Drawing.Point(25, 37); this.radioButtonHistoDisplayAutomatedMinMax.Name = "radioButtonHistoDisplayAutomatedMinMax"; this.radioButtonHistoDisplayAutomatedMinMax.Size = new System.Drawing.Size(76, 17); this.radioButtonHistoDisplayAutomatedMinMax.TabIndex = 0; @@ -1953,7 +2000,7 @@ private void InitializeComponent() this.groupBox24.Controls.Add(this.radioButtonDistributionMetricEuclidean); this.groupBox24.Location = new System.Drawing.Point(9, 6); this.groupBox24.Name = "groupBox24"; - this.groupBox24.Size = new System.Drawing.Size(376, 168); + this.groupBox24.Size = new System.Drawing.Size(376, 152); this.groupBox24.TabIndex = 0; this.groupBox24.TabStop = false; this.groupBox24.Text = "Metric"; @@ -1961,7 +2008,7 @@ private void InitializeComponent() // radioButtonDistributionMetricEMD // this.radioButtonDistributionMetricEMD.AutoSize = true; - this.radioButtonDistributionMetricEMD.Location = new System.Drawing.Point(130, 129); + this.radioButtonDistributionMetricEMD.Location = new System.Drawing.Point(151, 116); this.radioButtonDistributionMetricEMD.Name = "radioButtonDistributionMetricEMD"; this.radioButtonDistributionMetricEMD.Size = new System.Drawing.Size(128, 17); this.radioButtonDistributionMetricEMD.TabIndex = 6; @@ -1971,7 +2018,7 @@ private void InitializeComponent() // radioButtonDistributionMetricBhattacharyya // this.radioButtonDistributionMetricBhattacharyya.AutoSize = true; - this.radioButtonDistributionMetricBhattacharyya.Location = new System.Drawing.Point(130, 97); + this.radioButtonDistributionMetricBhattacharyya.Location = new System.Drawing.Point(151, 84); this.radioButtonDistributionMetricBhattacharyya.Name = "radioButtonDistributionMetricBhattacharyya"; this.radioButtonDistributionMetricBhattacharyya.Size = new System.Drawing.Size(146, 17); this.radioButtonDistributionMetricBhattacharyya.TabIndex = 5; @@ -1982,7 +2029,7 @@ private void InitializeComponent() // this.label30.AutoSize = true; this.label30.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label30.Location = new System.Drawing.Point(22, 132); + this.label30.Location = new System.Drawing.Point(43, 119); this.label30.Name = "label30"; this.label30.Size = new System.Drawing.Size(59, 13); this.label30.TabIndex = 4; @@ -1992,7 +2039,7 @@ private void InitializeComponent() // this.label29.AutoSize = true; this.label29.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label29.Location = new System.Drawing.Point(22, 29); + this.label29.Location = new System.Drawing.Point(43, 16); this.label29.Name = "label29"; this.label29.Size = new System.Drawing.Size(61, 13); this.label29.TabIndex = 3; @@ -2001,7 +2048,7 @@ private void InitializeComponent() // radioButtonDistributionMetricCosine // this.radioButtonDistributionMetricCosine.AutoSize = true; - this.radioButtonDistributionMetricCosine.Location = new System.Drawing.Point(130, 74); + this.radioButtonDistributionMetricCosine.Location = new System.Drawing.Point(151, 61); this.radioButtonDistributionMetricCosine.Name = "radioButtonDistributionMetricCosine"; this.radioButtonDistributionMetricCosine.Size = new System.Drawing.Size(121, 17); this.radioButtonDistributionMetricCosine.TabIndex = 2; @@ -2011,7 +2058,7 @@ private void InitializeComponent() // radioButtonDistributionMetricManhattan // this.radioButtonDistributionMetricManhattan.AutoSize = true; - this.radioButtonDistributionMetricManhattan.Location = new System.Drawing.Point(130, 51); + this.radioButtonDistributionMetricManhattan.Location = new System.Drawing.Point(151, 38); this.radioButtonDistributionMetricManhattan.Name = "radioButtonDistributionMetricManhattan"; this.radioButtonDistributionMetricManhattan.Size = new System.Drawing.Size(76, 17); this.radioButtonDistributionMetricManhattan.TabIndex = 1; @@ -2022,7 +2069,7 @@ private void InitializeComponent() // this.radioButtonDistributionMetricEuclidean.AutoSize = true; this.radioButtonDistributionMetricEuclidean.Checked = true; - this.radioButtonDistributionMetricEuclidean.Location = new System.Drawing.Point(130, 28); + this.radioButtonDistributionMetricEuclidean.Location = new System.Drawing.Point(151, 15); this.radioButtonDistributionMetricEuclidean.Name = "radioButtonDistributionMetricEuclidean"; this.radioButtonDistributionMetricEuclidean.Size = new System.Drawing.Size(72, 17); this.radioButtonDistributionMetricEuclidean.TabIndex = 0; @@ -2030,6 +2077,52 @@ private void InitializeComponent() this.radioButtonDistributionMetricEuclidean.Text = "Euclidean"; this.radioButtonDistributionMetricEuclidean.UseVisualStyleBackColor = true; // + // tabPageClasses + // + this.tabPageClasses.Controls.Add(this.groupBox29); + this.tabPageClasses.Controls.Add(this.groupBox28); + this.tabPageClasses.Location = new System.Drawing.Point(4, 58); + this.tabPageClasses.Name = "tabPageClasses"; + this.tabPageClasses.Padding = new System.Windows.Forms.Padding(3); + this.tabPageClasses.Size = new System.Drawing.Size(396, 384); + this.tabPageClasses.TabIndex = 12; + this.tabPageClasses.Text = "Classes"; + this.tabPageClasses.UseVisualStyleBackColor = true; + // + // groupBox29 + // + this.groupBox29.Controls.Add(this.panelForCellularPhenotypes); + this.groupBox29.Location = new System.Drawing.Point(201, 6); + this.groupBox29.Name = "groupBox29"; + this.groupBox29.Size = new System.Drawing.Size(190, 375); + this.groupBox29.TabIndex = 2; + this.groupBox29.TabStop = false; + this.groupBox29.Text = "Cellular Phenotypes"; + // + // panelForCellularPhenotypes + // + this.panelForCellularPhenotypes.Location = new System.Drawing.Point(6, 19); + this.panelForCellularPhenotypes.Name = "panelForCellularPhenotypes"; + this.panelForCellularPhenotypes.Size = new System.Drawing.Size(178, 350); + this.panelForCellularPhenotypes.TabIndex = 0; + // + // groupBox28 + // + this.groupBox28.Controls.Add(this.panelForWellClasses); + this.groupBox28.Location = new System.Drawing.Point(3, 6); + this.groupBox28.Name = "groupBox28"; + this.groupBox28.Size = new System.Drawing.Size(190, 375); + this.groupBox28.TabIndex = 1; + this.groupBox28.TabStop = false; + this.groupBox28.Text = "Well Classes"; + // + // panelForWellClasses + // + this.panelForWellClasses.Location = new System.Drawing.Point(6, 19); + this.panelForWellClasses.Name = "panelForWellClasses"; + this.panelForWellClasses.Size = new System.Drawing.Size(178, 350); + this.panelForWellClasses.TabIndex = 0; + // // buttonOk // this.buttonOk.Location = new System.Drawing.Point(271, 464); @@ -2146,8 +2239,10 @@ private void InitializeComponent() this.groupBox21.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellSize)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownWellOpacity)).EndInit(); - this.tabPageHisto.ResumeLayout(false); - this.tabPageHisto.PerformLayout(); + this.tabPage8.ResumeLayout(false); + this.tabPage8.PerformLayout(); + this.groupBox27.ResumeLayout(false); + this.groupBox27.PerformLayout(); this.groupBox26.ResumeLayout(false); this.groupBox26.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualMax)).EndInit(); @@ -2156,6 +2251,9 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDownAutomatedMin)).EndInit(); this.groupBox24.ResumeLayout(false); this.groupBox24.PerformLayout(); + this.tabPageClasses.ResumeLayout(false); + this.groupBox29.ResumeLayout(false); + this.groupBox28.ResumeLayout(false); this.ResumeLayout(false); } @@ -2272,6 +2370,7 @@ private void InitializeComponent() public System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.GroupBox groupBox23; public System.Windows.Forms.CheckBox checkBox3DPlateInformation; + private System.Windows.Forms.TabPage tabPage8; private System.Windows.Forms.GroupBox groupBox24; public System.Windows.Forms.RadioButton radioButtonDistributionMetricManhattan; public System.Windows.Forms.RadioButton radioButtonDistributionMetricEuclidean; @@ -2301,6 +2400,13 @@ private void InitializeComponent() public System.Windows.Forms.RadioButton radioButtonHistoDisplayManualMinMax; public System.Windows.Forms.RadioButton radioButtonHistoDisplayAdjusted; private System.Windows.Forms.Button buttonApply; - public System.Windows.Forms.TabPage tabPageHisto; + private System.Windows.Forms.GroupBox groupBox27; + private System.Windows.Forms.RadioButton radioButtonBackColorAverageValue; + public System.Windows.Forms.RadioButton radioButtonBackColorDefault; + private System.Windows.Forms.TabPage tabPageClasses; + public System.Windows.Forms.Panel panelForWellClasses; + private System.Windows.Forms.GroupBox groupBox29; + public System.Windows.Forms.Panel panelForCellularPhenotypes; + private System.Windows.Forms.GroupBox groupBox28; } } \ No newline at end of file diff --git a/Forms/FormsForOptions/FormForOptionsWindow.cs b/Forms/FormsForOptions/FormForOptionsWindow.cs index 435de3a..e635469 100644 --- a/Forms/FormsForOptions/FormForOptionsWindow.cs +++ b/Forms/FormsForOptions/FormForOptionsWindow.cs @@ -11,6 +11,7 @@ using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; namespace HCSAnalyzer { @@ -22,7 +23,7 @@ public partial class FormForOptionsWindow : Form public FormForOptionsWindow(cScreening CurrentScreen) { this.CurrentScreen = CurrentScreen; - + InitializeComponent(); buttonOk.Focus(); buttonOk.Select(); @@ -34,7 +35,7 @@ private void buttonOk_Click(object sender, EventArgs e) { this.Visible = false; if((CurrentScreen!=null)&&(CurrentScreen.ListPlatesActive!=null)) - CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); + CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, false); } private void panel1_DoubleClick(object sender, EventArgs e) @@ -113,10 +114,16 @@ private void buttonDRCPlateDesign_Click(object sender, EventArgs e) CurrentScreen.GlobalInfo.WindowForDRCDesign.ShowDialog(); } + + + private void buttonApply_Click(object sender, EventArgs e) { + + + if ((CurrentScreen != null) && (CurrentScreen.ListPlatesActive != null)) - CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptor, false); + CurrentScreen.GetCurrentDisplayPlate().DisplayDistribution(CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx, false); } private void numericUpDownManualMin_ValueChanged(object sender, EventArgs e) @@ -132,5 +139,7 @@ private void numericUpDownManualMax_ValueChanged(object sender, EventArgs e) + + } } diff --git a/Forms/IO/FormForCellByCellClusteringResults.Designer.cs b/Forms/IO/FormForCellByCellClusteringResults.Designer.cs deleted file mode 100644 index 353e18c..0000000 --- a/Forms/IO/FormForCellByCellClusteringResults.Designer.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace HCSAnalyzer.Forms.IO -{ - partial class FormForCellByCellClusteringResults - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForCellByCellClusteringResults)); - this.buttonPerformLearning = new System.Windows.Forms.Button(); - this.richTextBoxResults = new System.Windows.Forms.RichTextBox(); - this.SuspendLayout(); - // - // buttonPerformLearning - // - this.buttonPerformLearning.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonPerformLearning.Dock = System.Windows.Forms.DockStyle.Bottom; - this.buttonPerformLearning.Location = new System.Drawing.Point(0, 475); - this.buttonPerformLearning.Name = "buttonPerformLearning"; - this.buttonPerformLearning.Size = new System.Drawing.Size(365, 32); - this.buttonPerformLearning.TabIndex = 0; - this.buttonPerformLearning.Text = "Perform Learning !"; - this.buttonPerformLearning.UseVisualStyleBackColor = true; - // - // richTextBoxResults - // - this.richTextBoxResults.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.richTextBoxResults.Location = new System.Drawing.Point(12, 12); - this.richTextBoxResults.Name = "richTextBoxResults"; - this.richTextBoxResults.ReadOnly = true; - this.richTextBoxResults.Size = new System.Drawing.Size(341, 457); - this.richTextBoxResults.TabIndex = 1; - this.richTextBoxResults.Text = ""; - // - // FormForCellByCellClusteringResults - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(365, 507); - this.Controls.Add(this.richTextBoxResults); - this.Controls.Add(this.buttonPerformLearning); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormForCellByCellClusteringResults"; - this.Text = "Clustering Results"; - this.ResumeLayout(false); - - } - - #endregion - - public System.Windows.Forms.RichTextBox richTextBoxResults; - public System.Windows.Forms.Button buttonPerformLearning; - } -} \ No newline at end of file diff --git a/Forms/IO/FormForGenerateScreening.Designer.cs b/Forms/IO/FormForGenerateScreening.Designer.cs index 9a1a730..d8bfebe 100644 --- a/Forms/IO/FormForGenerateScreening.Designer.cs +++ b/Forms/IO/FormForGenerateScreening.Designer.cs @@ -28,6 +28,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForGenerateScreening)); this.buttonGenerate = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); @@ -86,6 +87,10 @@ private void InitializeComponent() this.checkBoxRowEffect = new System.Windows.Forms.CheckBox(); this.checkBoxAddAsDescriptor = new System.Windows.Forms.CheckBox(); this.groupBoxGeneralInfo = new System.Windows.Forms.GroupBox(); + this.contextMenuStripPlateDim = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem96 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem384 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1536 = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPlateNumber)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).BeginInit(); @@ -118,6 +123,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRowEffectIntensity)).BeginInit(); this.groupBoxGeneralInfo.SuspendLayout(); + this.contextMenuStripPlateDim.SuspendLayout(); this.SuspendLayout(); // // buttonGenerate @@ -902,6 +908,7 @@ private void InitializeComponent() // // groupBoxGeneralInfo // + this.groupBoxGeneralInfo.ContextMenuStrip = this.contextMenuStripPlateDim; this.groupBoxGeneralInfo.Controls.Add(this.numericUpDownPlateNumber); this.groupBoxGeneralInfo.Controls.Add(this.label1); this.groupBoxGeneralInfo.Controls.Add(this.label3); @@ -915,6 +922,36 @@ private void InitializeComponent() this.groupBoxGeneralInfo.TabStop = false; this.groupBoxGeneralInfo.Text = "General"; // + // contextMenuStripPlateDim + // + this.contextMenuStripPlateDim.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem96, + this.toolStripMenuItem384, + this.toolStripMenuItem1536}); + this.contextMenuStripPlateDim.Name = "contextMenuStripPlateDim"; + this.contextMenuStripPlateDim.Size = new System.Drawing.Size(99, 70); + // + // toolStripMenuItem96 + // + this.toolStripMenuItem96.Name = "toolStripMenuItem96"; + this.toolStripMenuItem96.Size = new System.Drawing.Size(98, 22); + this.toolStripMenuItem96.Text = "96"; + this.toolStripMenuItem96.Click += new System.EventHandler(this.toolStripMenuItem96_Click); + // + // toolStripMenuItem384 + // + this.toolStripMenuItem384.Name = "toolStripMenuItem384"; + this.toolStripMenuItem384.Size = new System.Drawing.Size(98, 22); + this.toolStripMenuItem384.Text = "384"; + this.toolStripMenuItem384.Click += new System.EventHandler(this.toolStripMenuItem384_Click); + // + // toolStripMenuItem1536 + // + this.toolStripMenuItem1536.Name = "toolStripMenuItem1536"; + this.toolStripMenuItem1536.Size = new System.Drawing.Size(98, 22); + this.toolStripMenuItem1536.Text = "1536"; + this.toolStripMenuItem1536.Click += new System.EventHandler(this.toolStripMenuItem1536_Click); + // // FormForGenerateScreening // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -968,6 +1005,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRowEffectIntensity)).EndInit(); this.groupBoxGeneralInfo.ResumeLayout(false); this.groupBoxGeneralInfo.PerformLayout(); + this.contextMenuStripPlateDim.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -1032,5 +1070,9 @@ private void InitializeComponent() public System.Windows.Forms.CheckBox checkBoxShiftRowEffect; private System.Windows.Forms.GroupBox groupBoxGeneralInfo; public System.Windows.Forms.CheckBox checkBoxAddAsDescriptor; + private System.Windows.Forms.ContextMenuStrip contextMenuStripPlateDim; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem96; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem384; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1536; } } \ No newline at end of file diff --git a/Forms/IO/FormForGenerateScreening.cs b/Forms/IO/FormForGenerateScreening.cs index 27b664f..9a1e16d 100644 --- a/Forms/IO/FormForGenerateScreening.cs +++ b/Forms/IO/FormForGenerateScreening.cs @@ -119,6 +119,25 @@ private void checkBoxAddAsDescriptor_CheckedChanged(object sender, EventArgs e) } } + private void toolStripMenuItem96_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 12; + this.numericUpDownRows.Value = 8; + } + + private void toolStripMenuItem384_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 24; + this.numericUpDownRows.Value = 16; + } + + private void toolStripMenuItem1536_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 48; + this.numericUpDownRows.Value = 32; + } + + } } diff --git a/Forms/IO/FormForGenerateScreening.resx b/Forms/IO/FormForGenerateScreening.resx index 4a53d92..4c4de84 100644 --- a/Forms/IO/FormForGenerateScreening.resx +++ b/Forms/IO/FormForGenerateScreening.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + diff --git a/Forms/IO/FormForHistogramScreen.Designer.cs b/Forms/IO/FormForHistogramScreen.Designer.cs deleted file mode 100644 index 3a3cca1..0000000 --- a/Forms/IO/FormForHistogramScreen.Designer.cs +++ /dev/null @@ -1,495 +0,0 @@ -namespace HCSAnalyzer.Forms.IO -{ - partial class FormForHistogramScreen - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForHistogramScreen)); - this.buttonGenerate = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.numericUpDownHistogramSize = new System.Windows.Forms.NumericUpDown(); - this.groupBoxGeneralInfo = new System.Windows.Forms.GroupBox(); - this.numericUpDownPlateNumber = new System.Windows.Forms.NumericUpDown(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.numericUpDownRows = new System.Windows.Forms.NumericUpDown(); - this.label4 = new System.Windows.Forms.Label(); - this.numericUpDownColumns = new System.Windows.Forms.NumericUpDown(); - this.checkBoxAddAsDescriptor = new System.Windows.Forms.CheckBox(); - this.numericUpDownPopulation1NumberOfEvents = new System.Windows.Forms.NumericUpDown(); - this.labelEventsPop1 = new System.Windows.Forms.Label(); - this.numericUpDownPopulation1Stdev = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownPopulation1Mean = new System.Windows.Forms.NumericUpDown(); - this.labelMeanPop1 = new System.Windows.Forms.Label(); - this.labelStdevPop1 = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.numericUpDownPopulation2Mean = new System.Windows.Forms.NumericUpDown(); - this.numericUpDownPopulation2NumberOfEvents = new System.Windows.Forms.NumericUpDown(); - this.labelEventsPop2 = new System.Windows.Forms.Label(); - this.labelStdevPop2 = new System.Windows.Forms.Label(); - this.labelMeanPop2 = new System.Windows.Forms.Label(); - this.numericUpDownPopulation2Stdev = new System.Windows.Forms.NumericUpDown(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownHistogramSize)).BeginInit(); - this.groupBoxGeneralInfo.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPlateNumber)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1NumberOfEvents)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1Stdev)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1Mean)).BeginInit(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2Mean)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2NumberOfEvents)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2Stdev)).BeginInit(); - this.SuspendLayout(); - // - // buttonGenerate - // - this.buttonGenerate.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonGenerate.Location = new System.Drawing.Point(36, 576); - this.buttonGenerate.Name = "buttonGenerate"; - this.buttonGenerate.Size = new System.Drawing.Size(185, 34); - this.buttonGenerate.TabIndex = 0; - this.buttonGenerate.Text = "Generate"; - this.buttonGenerate.UseVisualStyleBackColor = true; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(39, 186); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(77, 13); - this.label1.TabIndex = 1; - this.label1.Text = "Histogram Size"; - // - // numericUpDownHistogramSize - // - this.numericUpDownHistogramSize.Location = new System.Drawing.Point(136, 184); - this.numericUpDownHistogramSize.Maximum = new decimal(new int[] { - 1215752192, - 23, - 0, - 0}); - this.numericUpDownHistogramSize.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownHistogramSize.Name = "numericUpDownHistogramSize"; - this.numericUpDownHistogramSize.Size = new System.Drawing.Size(82, 20); - this.numericUpDownHistogramSize.TabIndex = 2; - this.numericUpDownHistogramSize.Value = new decimal(new int[] { - 256, - 0, - 0, - 0}); - // - // groupBoxGeneralInfo - // - this.groupBoxGeneralInfo.Controls.Add(this.numericUpDownPlateNumber); - this.groupBoxGeneralInfo.Controls.Add(this.label2); - this.groupBoxGeneralInfo.Controls.Add(this.label3); - this.groupBoxGeneralInfo.Controls.Add(this.numericUpDownRows); - this.groupBoxGeneralInfo.Controls.Add(this.label4); - this.groupBoxGeneralInfo.Controls.Add(this.numericUpDownColumns); - this.groupBoxGeneralInfo.Location = new System.Drawing.Point(7, 50); - this.groupBoxGeneralInfo.Name = "groupBoxGeneralInfo"; - this.groupBoxGeneralInfo.Size = new System.Drawing.Size(243, 119); - this.groupBoxGeneralInfo.TabIndex = 21; - this.groupBoxGeneralInfo.TabStop = false; - this.groupBoxGeneralInfo.Text = "General"; - // - // numericUpDownPlateNumber - // - this.numericUpDownPlateNumber.Location = new System.Drawing.Point(125, 27); - this.numericUpDownPlateNumber.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDownPlateNumber.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownPlateNumber.Name = "numericUpDownPlateNumber"; - this.numericUpDownPlateNumber.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPlateNumber.TabIndex = 2; - this.numericUpDownPlateNumber.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(17, 29); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(88, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Number of Plates"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(38, 60); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(47, 13); - this.label3.TabIndex = 4; - this.label3.Text = "Columns"; - // - // numericUpDownRows - // - this.numericUpDownRows.Location = new System.Drawing.Point(125, 84); - this.numericUpDownRows.Maximum = new decimal(new int[] { - 1215752192, - 23, - 0, - 0}); - this.numericUpDownRows.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownRows.Name = "numericUpDownRows"; - this.numericUpDownRows.Size = new System.Drawing.Size(82, 20); - this.numericUpDownRows.TabIndex = 6; - this.numericUpDownRows.Value = new decimal(new int[] { - 16, - 0, - 0, - 0}); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(44, 86); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(34, 13); - this.label4.TabIndex = 3; - this.label4.Text = "Rows"; - // - // numericUpDownColumns - // - this.numericUpDownColumns.Location = new System.Drawing.Point(125, 58); - this.numericUpDownColumns.Maximum = new decimal(new int[] { - 1000000000, - 0, - 0, - 0}); - this.numericUpDownColumns.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDownColumns.Name = "numericUpDownColumns"; - this.numericUpDownColumns.Size = new System.Drawing.Size(82, 20); - this.numericUpDownColumns.TabIndex = 5; - this.numericUpDownColumns.Value = new decimal(new int[] { - 24, - 0, - 0, - 0}); - // - // checkBoxAddAsDescriptor - // - this.checkBoxAddAsDescriptor.AutoSize = true; - this.checkBoxAddAsDescriptor.Location = new System.Drawing.Point(73, 24); - this.checkBoxAddAsDescriptor.Name = "checkBoxAddAsDescriptor"; - this.checkBoxAddAsDescriptor.Size = new System.Drawing.Size(110, 17); - this.checkBoxAddAsDescriptor.TabIndex = 20; - this.checkBoxAddAsDescriptor.Text = "As new descriptor"; - this.checkBoxAddAsDescriptor.UseVisualStyleBackColor = true; - this.checkBoxAddAsDescriptor.CheckedChanged += new System.EventHandler(this.checkBoxAddAsDescriptor_CheckedChanged); - // - // numericUpDownPopulation1NumberOfEvents - // - this.numericUpDownPopulation1NumberOfEvents.Location = new System.Drawing.Point(125, 109); - this.numericUpDownPopulation1NumberOfEvents.Maximum = new decimal(new int[] { - -1530494976, - 232830, - 0, - 0}); - this.numericUpDownPopulation1NumberOfEvents.Name = "numericUpDownPopulation1NumberOfEvents"; - this.numericUpDownPopulation1NumberOfEvents.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation1NumberOfEvents.TabIndex = 23; - this.numericUpDownPopulation1NumberOfEvents.ThousandsSeparator = true; - this.numericUpDownPopulation1NumberOfEvents.Value = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - // - // labelEventsPop1 - // - this.labelEventsPop1.AutoSize = true; - this.labelEventsPop1.Location = new System.Drawing.Point(16, 111); - this.labelEventsPop1.Name = "labelEventsPop1"; - this.labelEventsPop1.Size = new System.Drawing.Size(91, 13); - this.labelEventsPop1.TabIndex = 22; - this.labelEventsPop1.Text = "Number of events"; - this.labelEventsPop1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelEventsPop1_MouseClick); - // - // numericUpDownPopulation1Stdev - // - this.numericUpDownPopulation1Stdev.DecimalPlaces = 1; - this.numericUpDownPopulation1Stdev.Location = new System.Drawing.Point(125, 69); - this.numericUpDownPopulation1Stdev.Maximum = new decimal(new int[] { - 1215752192, - 23, - 0, - 0}); - this.numericUpDownPopulation1Stdev.Name = "numericUpDownPopulation1Stdev"; - this.numericUpDownPopulation1Stdev.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation1Stdev.TabIndex = 24; - this.numericUpDownPopulation1Stdev.Value = new decimal(new int[] { - 20, - 0, - 0, - 0}); - // - // numericUpDownPopulation1Mean - // - this.numericUpDownPopulation1Mean.DecimalPlaces = 1; - this.numericUpDownPopulation1Mean.Location = new System.Drawing.Point(125, 36); - this.numericUpDownPopulation1Mean.Maximum = new decimal(new int[] { - 1000000000, - 0, - 0, - 0}); - this.numericUpDownPopulation1Mean.Name = "numericUpDownPopulation1Mean"; - this.numericUpDownPopulation1Mean.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation1Mean.TabIndex = 26; - this.numericUpDownPopulation1Mean.Value = new decimal(new int[] { - 50, - 0, - 0, - 0}); - // - // labelMeanPop1 - // - this.labelMeanPop1.AutoSize = true; - this.labelMeanPop1.Location = new System.Drawing.Point(44, 38); - this.labelMeanPop1.Name = "labelMeanPop1"; - this.labelMeanPop1.Size = new System.Drawing.Size(34, 13); - this.labelMeanPop1.TabIndex = 25; - this.labelMeanPop1.Text = "Mean"; - this.labelMeanPop1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelMeanPop1_MouseClick); - // - // labelStdevPop1 - // - this.labelStdevPop1.AutoSize = true; - this.labelStdevPop1.Location = new System.Drawing.Point(12, 71); - this.labelStdevPop1.Name = "labelStdevPop1"; - this.labelStdevPop1.Size = new System.Drawing.Size(98, 13); - this.labelStdevPop1.TabIndex = 27; - this.labelStdevPop1.Text = "Standard Deviation"; - this.labelStdevPop1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelStdevPop1_MouseClick); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.numericUpDownPopulation1Mean); - this.groupBox1.Controls.Add(this.numericUpDownPopulation1NumberOfEvents); - this.groupBox1.Controls.Add(this.labelEventsPop1); - this.groupBox1.Controls.Add(this.labelStdevPop1); - this.groupBox1.Controls.Add(this.labelMeanPop1); - this.groupBox1.Controls.Add(this.numericUpDownPopulation1Stdev); - this.groupBox1.Location = new System.Drawing.Point(7, 219); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(243, 157); - this.groupBox1.TabIndex = 28; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Population 1"; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.numericUpDownPopulation2Mean); - this.groupBox2.Controls.Add(this.numericUpDownPopulation2NumberOfEvents); - this.groupBox2.Controls.Add(this.labelEventsPop2); - this.groupBox2.Controls.Add(this.labelStdevPop2); - this.groupBox2.Controls.Add(this.labelMeanPop2); - this.groupBox2.Controls.Add(this.numericUpDownPopulation2Stdev); - this.groupBox2.Location = new System.Drawing.Point(7, 386); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(243, 157); - this.groupBox2.TabIndex = 29; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Population 2"; - // - // numericUpDownPopulation2Mean - // - this.numericUpDownPopulation2Mean.DecimalPlaces = 1; - this.numericUpDownPopulation2Mean.Location = new System.Drawing.Point(125, 36); - this.numericUpDownPopulation2Mean.Maximum = new decimal(new int[] { - 1000000000, - 0, - 0, - 0}); - this.numericUpDownPopulation2Mean.Name = "numericUpDownPopulation2Mean"; - this.numericUpDownPopulation2Mean.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation2Mean.TabIndex = 26; - this.numericUpDownPopulation2Mean.Value = new decimal(new int[] { - 150, - 0, - 0, - 0}); - // - // numericUpDownPopulation2NumberOfEvents - // - this.numericUpDownPopulation2NumberOfEvents.Location = new System.Drawing.Point(125, 109); - this.numericUpDownPopulation2NumberOfEvents.Maximum = new decimal(new int[] { - -1530494976, - 232830, - 0, - 0}); - this.numericUpDownPopulation2NumberOfEvents.Name = "numericUpDownPopulation2NumberOfEvents"; - this.numericUpDownPopulation2NumberOfEvents.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation2NumberOfEvents.TabIndex = 23; - this.numericUpDownPopulation2NumberOfEvents.ThousandsSeparator = true; - this.numericUpDownPopulation2NumberOfEvents.Value = new decimal(new int[] { - 5000, - 0, - 0, - 0}); - // - // labelEventsPop2 - // - this.labelEventsPop2.AutoSize = true; - this.labelEventsPop2.Location = new System.Drawing.Point(16, 111); - this.labelEventsPop2.Name = "labelEventsPop2"; - this.labelEventsPop2.Size = new System.Drawing.Size(91, 13); - this.labelEventsPop2.TabIndex = 22; - this.labelEventsPop2.Text = "Number of events"; - this.labelEventsPop2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelEventsPop2_MouseClick); - // - // labelStdevPop2 - // - this.labelStdevPop2.AutoSize = true; - this.labelStdevPop2.Location = new System.Drawing.Point(12, 71); - this.labelStdevPop2.Name = "labelStdevPop2"; - this.labelStdevPop2.Size = new System.Drawing.Size(98, 13); - this.labelStdevPop2.TabIndex = 27; - this.labelStdevPop2.Text = "Standard Deviation"; - this.labelStdevPop2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelStdevPop2_MouseClick); - // - // labelMeanPop2 - // - this.labelMeanPop2.AutoSize = true; - this.labelMeanPop2.Location = new System.Drawing.Point(44, 38); - this.labelMeanPop2.Name = "labelMeanPop2"; - this.labelMeanPop2.Size = new System.Drawing.Size(34, 13); - this.labelMeanPop2.TabIndex = 25; - this.labelMeanPop2.Text = "Mean"; - this.labelMeanPop2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.labelMeanPop2_MouseClick); - // - // numericUpDownPopulation2Stdev - // - this.numericUpDownPopulation2Stdev.DecimalPlaces = 1; - this.numericUpDownPopulation2Stdev.Location = new System.Drawing.Point(125, 69); - this.numericUpDownPopulation2Stdev.Maximum = new decimal(new int[] { - 1215752192, - 23, - 0, - 0}); - this.numericUpDownPopulation2Stdev.Name = "numericUpDownPopulation2Stdev"; - this.numericUpDownPopulation2Stdev.Size = new System.Drawing.Size(82, 20); - this.numericUpDownPopulation2Stdev.TabIndex = 24; - this.numericUpDownPopulation2Stdev.Value = new decimal(new int[] { - 40, - 0, - 0, - 0}); - // - // FormForHistogramScreen - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(256, 622); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.groupBoxGeneralInfo); - this.Controls.Add(this.checkBoxAddAsDescriptor); - this.Controls.Add(this.numericUpDownHistogramSize); - this.Controls.Add(this.label1); - this.Controls.Add(this.buttonGenerate); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "FormForHistogramScreen"; - this.Text = "Histogram based Screening"; - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownHistogramSize)).EndInit(); - this.groupBoxGeneralInfo.ResumeLayout(false); - this.groupBoxGeneralInfo.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPlateNumber)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1NumberOfEvents)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1Stdev)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation1Mean)).EndInit(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2Mean)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2NumberOfEvents)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPopulation2Stdev)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonGenerate; - private System.Windows.Forms.Label label1; - public System.Windows.Forms.NumericUpDown numericUpDownHistogramSize; - private System.Windows.Forms.GroupBox groupBoxGeneralInfo; - public System.Windows.Forms.NumericUpDown numericUpDownPlateNumber; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - public System.Windows.Forms.NumericUpDown numericUpDownRows; - private System.Windows.Forms.Label label4; - public System.Windows.Forms.NumericUpDown numericUpDownColumns; - public System.Windows.Forms.CheckBox checkBoxAddAsDescriptor; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation1NumberOfEvents; - private System.Windows.Forms.Label labelEventsPop1; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation1Stdev; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation1Mean; - private System.Windows.Forms.Label labelMeanPop1; - private System.Windows.Forms.Label labelStdevPop1; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox groupBox2; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation2Mean; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation2NumberOfEvents; - private System.Windows.Forms.Label labelEventsPop2; - private System.Windows.Forms.Label labelStdevPop2; - private System.Windows.Forms.Label labelMeanPop2; - public System.Windows.Forms.NumericUpDown numericUpDownPopulation2Stdev; - } -} \ No newline at end of file diff --git a/Forms/IO/FormForHistogramScreen.cs b/Forms/IO/FormForHistogramScreen.cs deleted file mode 100644 index 81d9157..0000000 --- a/Forms/IO/FormForHistogramScreen.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; - -namespace HCSAnalyzer.Forms.IO -{ - public partial class FormForHistogramScreen : Form - { - - cGlobalInfo GlobalInfo = null; - - public List AverageVariabilityWindows = new List(); - public List StDevVariabilityWindows = new List(); - public List EventsNumberVariabilityWindows = new List(); - - public FormForHistogramScreen(cGlobalInfo GlobalInfo) - { - this.GlobalInfo = GlobalInfo; - InitializeComponent(); - if (GlobalInfo.CurrentScreen == null) this.checkBoxAddAsDescriptor.Enabled = false; - - FormForVariability WindowAveragePop1 = new FormForVariability(); - AverageVariabilityWindows.Add(WindowAveragePop1); - - FormForVariability WindowAveragePop2 = new FormForVariability(); - AverageVariabilityWindows.Add(WindowAveragePop2); - - FormForVariability WindowStdevPop1 = new FormForVariability(); - StDevVariabilityWindows.Add(WindowStdevPop1); - - FormForVariability WindowStdevPop2 = new FormForVariability(); - StDevVariabilityWindows.Add(WindowStdevPop2); - - FormForVariability WindowEventsPop1 = new FormForVariability(); - EventsNumberVariabilityWindows.Add(WindowEventsPop1); - - FormForVariability WindowEventsPop2 = new FormForVariability(); - EventsNumberVariabilityWindows.Add(WindowEventsPop2); - } - - private void checkBoxAddAsDescriptor_CheckedChanged(object sender, EventArgs e) - { - groupBoxGeneralInfo.Enabled = !checkBoxAddAsDescriptor.Checked; - - if (checkBoxAddAsDescriptor.Checked) - { - numericUpDownPlateNumber.Value = GlobalInfo.CurrentScreen.GetNumberOfOriginalPlates(); - numericUpDownColumns.Value = GlobalInfo.CurrentScreen.Columns; - numericUpDownRows.Value = GlobalInfo.CurrentScreen.Rows; - } - } - - private void labelMeanPop1_MouseClick(object sender, MouseEventArgs e) - { - int IdxPop = 0; - - double CurrentVariability = (double)AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value; - bool IsColumnVariable = AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked; - - bool IsPositiveCol = AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked; - bool IsPositiveRow = AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked; - - bool IsRowVariable = AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked; - - AverageVariabilityWindows[IdxPop].Text = "Population "+IdxPop+" - Average"; - - if (AverageVariabilityWindows[IdxPop].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value = (decimal)CurrentVariability; - AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - - if (IsPositiveCol) - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = true; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = false; - } - else - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = false; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = true; - } - if (IsPositiveRow) - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = true; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = false; - } - else - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = false; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = true; - } - } - } - - private void labelMeanPop2_MouseClick(object sender, MouseEventArgs e) - { - int IdxPop = 1; - - double CurrentVariability = (double)AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value; - bool IsColumnVariable = AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked; - - bool IsPositiveCol = AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked; - bool IsPositiveRow = AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked; - - bool IsRowVariable = AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked; - - AverageVariabilityWindows[IdxPop].Text = "Population " + IdxPop + " - Average"; - - if (AverageVariabilityWindows[IdxPop].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value = (decimal)CurrentVariability; - AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - - if (IsPositiveCol) - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = true; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = false; - } - else - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = false; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = true; - } - if (IsPositiveRow) - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = true; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = false; - } - else - { - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = false; - AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = true; - } - } - - } - - private void labelStdevPop1_MouseClick(object sender, MouseEventArgs e) - { - int IdxPop = 0; - - double CurrentVariability = (double)StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value; - bool IsColumnVariable = StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked; - bool IsRowVariable = StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked; - - bool IsPositiveCol = StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked; - bool IsPositiveRow = StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked; - - StDevVariabilityWindows[IdxPop].Text = "Population " + IdxPop + " - Standard Deviation"; - - if (StDevVariabilityWindows[IdxPop].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value = (decimal)CurrentVariability; - StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - - if (IsPositiveCol) - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = true; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = false; - } - else - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = false; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = true; - } - if (IsPositiveRow) - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = true; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = false; - } - else - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = false; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = true; - } - - } - } - - private void labelStdevPop2_MouseClick(object sender, MouseEventArgs e) - { - int IdxPop = 1; - - double CurrentVariability = (double)StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value; - bool IsColumnVariable = StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked; - bool IsRowVariable = StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked; - - bool IsPositiveCol = StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked; - bool IsPositiveRow = StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked; - - StDevVariabilityWindows[IdxPop].Text = "Population " + IdxPop + " - Standard Deviation"; - - if (StDevVariabilityWindows[IdxPop].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value = (decimal)CurrentVariability; - StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - - if (IsPositiveCol) - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = true; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = false; - } - else - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked = false; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsNegative.Checked = true; - } - if (IsPositiveRow) - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = true; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = false; - } - else - { - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked = false; - StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsNegative.Checked = true; - } - - } - } - - private void labelEventsPop1_MouseClick(object sender, MouseEventArgs e) - { - - double CurrentVariability = (double)EventsNumberVariabilityWindows[0].numericUpDownVariability.Value; - bool IsColumnVariable = EventsNumberVariabilityWindows[0].checkBoxVariableAlongTheColumns.Checked; - bool IsRowVariable = EventsNumberVariabilityWindows[0].checkBoxVariableAlongTheRows.Checked; - - EventsNumberVariabilityWindows[0].Text = "Population 1 - Number of Events"; - - if (EventsNumberVariabilityWindows[0].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - EventsNumberVariabilityWindows[0].numericUpDownVariability.Value = (decimal)CurrentVariability; - EventsNumberVariabilityWindows[0].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - EventsNumberVariabilityWindows[0].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - } - - } - - private void labelEventsPop2_MouseClick(object sender, MouseEventArgs e) - { - double CurrentVariability = (double)EventsNumberVariabilityWindows[1].numericUpDownVariability.Value; - bool IsColumnVariable = EventsNumberVariabilityWindows[1].checkBoxVariableAlongTheColumns.Checked; - bool IsRowVariable = EventsNumberVariabilityWindows[1].checkBoxVariableAlongTheRows.Checked; - - EventsNumberVariabilityWindows[1].Text = "Population 2 - Number of Events"; - - if (EventsNumberVariabilityWindows[1].ShowDialog() != System.Windows.Forms.DialogResult.OK) - { - EventsNumberVariabilityWindows[1].numericUpDownVariability.Value = (decimal)CurrentVariability; - EventsNumberVariabilityWindows[1].checkBoxVariableAlongTheColumns.Checked = IsColumnVariable; - EventsNumberVariabilityWindows[1].checkBoxVariableAlongTheRows.Checked = IsRowVariable; - } - - } - - - - } -} diff --git a/Forms/IO/FormForImportExcel.Designer.cs b/Forms/IO/FormForImportExcel.Designer.cs index 4d40de9..88a27d7 100644 --- a/Forms/IO/FormForImportExcel.Designer.cs +++ b/Forms/IO/FormForImportExcel.Designer.cs @@ -39,20 +39,25 @@ private void InitializeComponent() this.numericUpDownColumns = new System.Windows.Forms.NumericUpDown(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBoxPlateDim = new System.Windows.Forms.GroupBox(); + this.contextMenuStripForPlateDim = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem96 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem384 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1536 = new System.Windows.Forms.ToolStripMenuItem(); this.buttonChangeMode = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForImport)).BeginInit(); this.contextMenuStripDataGrid.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).BeginInit(); - this.groupBox1.SuspendLayout(); + this.groupBoxPlateDim.SuspendLayout(); + this.contextMenuStripForPlateDim.SuspendLayout(); this.SuspendLayout(); // // buttonOk // this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOk.Location = new System.Drawing.Point(480, 600); + this.buttonOk.Location = new System.Drawing.Point(483, 521); this.buttonOk.Name = "buttonOk"; this.buttonOk.Size = new System.Drawing.Size(149, 30); this.buttonOk.TabIndex = 4; @@ -63,14 +68,14 @@ private void InitializeComponent() // this.dataGridViewForImport.AllowUserToAddRows = false; this.dataGridViewForImport.AllowUserToDeleteRows = false; - this.dataGridViewForImport.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.dataGridViewForImport.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.dataGridViewForImport.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridViewForImport.ContextMenuStrip = this.contextMenuStripDataGrid; - this.dataGridViewForImport.Location = new System.Drawing.Point(12, 127); + this.dataGridViewForImport.Location = new System.Drawing.Point(10, 93); this.dataGridViewForImport.Name = "dataGridViewForImport"; - this.dataGridViewForImport.Size = new System.Drawing.Size(617, 467); + this.dataGridViewForImport.Size = new System.Drawing.Size(622, 422); this.dataGridViewForImport.TabIndex = 3; // // contextMenuStripDataGrid @@ -97,7 +102,7 @@ private void InitializeComponent() // // numericUpDownRows // - this.numericUpDownRows.Location = new System.Drawing.Point(96, 68); + this.numericUpDownRows.Location = new System.Drawing.Point(74, 51); this.numericUpDownRows.Maximum = new decimal(new int[] { 1215752192, 23, @@ -114,7 +119,7 @@ private void InitializeComponent() // // numericUpDownColumns // - this.numericUpDownColumns.Location = new System.Drawing.Point(96, 29); + this.numericUpDownColumns.Location = new System.Drawing.Point(74, 21); this.numericUpDownColumns.Maximum = new decimal(new int[] { 1000000000, 0, @@ -132,7 +137,7 @@ private void InitializeComponent() // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(21, 70); + this.label2.Location = new System.Drawing.Point(15, 53); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(34, 13); this.label2.TabIndex = 34; @@ -141,24 +146,55 @@ private void InitializeComponent() // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(21, 31); + this.label1.Location = new System.Drawing.Point(15, 23); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(47, 13); this.label1.TabIndex = 35; this.label1.Text = "Columns"; // - // groupBox1 + // groupBoxPlateDim // - this.groupBox1.Controls.Add(this.numericUpDownColumns); - this.groupBox1.Controls.Add(this.numericUpDownRows); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Location = new System.Drawing.Point(12, 12); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(206, 109); - this.groupBox1.TabIndex = 38; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Plate Dimensions"; + this.groupBoxPlateDim.ContextMenuStrip = this.contextMenuStripForPlateDim; + this.groupBoxPlateDim.Controls.Add(this.numericUpDownColumns); + this.groupBoxPlateDim.Controls.Add(this.numericUpDownRows); + this.groupBoxPlateDim.Controls.Add(this.label1); + this.groupBoxPlateDim.Controls.Add(this.label2); + this.groupBoxPlateDim.Location = new System.Drawing.Point(8, 3); + this.groupBoxPlateDim.Name = "groupBoxPlateDim"; + this.groupBoxPlateDim.Size = new System.Drawing.Size(186, 84); + this.groupBoxPlateDim.TabIndex = 38; + this.groupBoxPlateDim.TabStop = false; + this.groupBoxPlateDim.Text = "Plate Dimensions"; + // + // contextMenuStripForPlateDim + // + this.contextMenuStripForPlateDim.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem96, + this.toolStripMenuItem384, + this.toolStripMenuItem1536}); + this.contextMenuStripForPlateDim.Name = "contextMenuStripForPlateDim"; + this.contextMenuStripForPlateDim.Size = new System.Drawing.Size(153, 92); + // + // toolStripMenuItem96 + // + this.toolStripMenuItem96.Name = "toolStripMenuItem96"; + this.toolStripMenuItem96.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem96.Text = "96"; + this.toolStripMenuItem96.Click += new System.EventHandler(this.toolStripMenuItem96_Click); + // + // toolStripMenuItem384 + // + this.toolStripMenuItem384.Name = "toolStripMenuItem384"; + this.toolStripMenuItem384.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem384.Text = "384"; + this.toolStripMenuItem384.Click += new System.EventHandler(this.toolStripMenuItem384_Click); + // + // toolStripMenuItem1536 + // + this.toolStripMenuItem1536.Name = "toolStripMenuItem1536"; + this.toolStripMenuItem1536.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem1536.Text = "1536"; + this.toolStripMenuItem1536.Click += new System.EventHandler(this.toolStripMenuItem1536_Click); // // buttonChangeMode // @@ -175,9 +211,9 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(641, 642); + this.ClientSize = new System.Drawing.Size(642, 558); this.Controls.Add(this.buttonChangeMode); - this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBoxPlateDim); this.Controls.Add(this.dataGridViewForImport); this.Controls.Add(this.buttonOk); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); @@ -187,8 +223,9 @@ private void InitializeComponent() this.contextMenuStripDataGrid.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).EndInit(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); + this.groupBoxPlateDim.ResumeLayout(false); + this.groupBoxPlateDim.PerformLayout(); + this.contextMenuStripForPlateDim.ResumeLayout(false); this.ResumeLayout(false); } @@ -201,10 +238,14 @@ private void InitializeComponent() public System.Windows.Forms.NumericUpDown numericUpDownColumns; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; - private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBoxPlateDim; private System.Windows.Forms.ContextMenuStrip contextMenuStripDataGrid; private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem unselectAllToolStripMenuItem; private System.Windows.Forms.Button buttonChangeMode; + private System.Windows.Forms.ContextMenuStrip contextMenuStripForPlateDim; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem96; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem384; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1536; } } \ No newline at end of file diff --git a/Forms/IO/FormForImportExcel.cs b/Forms/IO/FormForImportExcel.cs index c5afebd..5d5ea89 100644 --- a/Forms/IO/FormForImportExcel.cs +++ b/Forms/IO/FormForImportExcel.cs @@ -12,7 +12,6 @@ namespace HCSAnalyzer { public partial class FormForImportExcel : Form { - private bool FirstTime = true; public bool IsImportCSV = false; public bool IsAppend; @@ -53,7 +52,23 @@ private void buttonChangeMode_Click(object sender, EventArgs e) } + private void toolStripMenuItem96_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 12; + this.numericUpDownRows.Value = 8; + } + + private void toolStripMenuItem384_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 24; + this.numericUpDownRows.Value = 16; + } + + private void toolStripMenuItem1536_Click(object sender, EventArgs e) + { + this.numericUpDownColumns.Value = 48; + this.numericUpDownRows.Value = 32; + } - } } diff --git a/Forms/IO/FormForImportExcel.resx b/Forms/IO/FormForImportExcel.resx index 288e07b..4352095 100644 --- a/Forms/IO/FormForImportExcel.resx +++ b/Forms/IO/FormForImportExcel.resx @@ -120,6 +120,9 @@ 17, 17 + + 214, 17 + diff --git a/Forms/IO/FormForMultipleClassSelection.Designer.cs b/Forms/IO/FormForMultipleClassSelection.Designer.cs new file mode 100644 index 0000000..26757a3 --- /dev/null +++ b/Forms/IO/FormForMultipleClassSelection.Designer.cs @@ -0,0 +1,88 @@ +namespace HCSAnalyzer.Forms.IO +{ + partial class FormForMultipleClassSelection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForMultipleClassSelection)); + this.buttonOk = new System.Windows.Forms.Button(); + this.splitContainerForClassSelection = new System.Windows.Forms.SplitContainer(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForClassSelection)).BeginInit(); + this.splitContainerForClassSelection.Panel2.SuspendLayout(); + this.splitContainerForClassSelection.SuspendLayout(); + this.SuspendLayout(); + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(9, 10); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(127, 23); + this.buttonOk.TabIndex = 0; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + // + // splitContainerForClassSelection + // + this.splitContainerForClassSelection.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.splitContainerForClassSelection.Location = new System.Drawing.Point(3, 4); + this.splitContainerForClassSelection.Name = "splitContainerForClassSelection"; + this.splitContainerForClassSelection.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainerForClassSelection.Panel2 + // + this.splitContainerForClassSelection.Panel2.Controls.Add(this.buttonOk); + this.splitContainerForClassSelection.Panel2MinSize = 30; + this.splitContainerForClassSelection.Size = new System.Drawing.Size(145, 298); + this.splitContainerForClassSelection.SplitterDistance = 250; + this.splitContainerForClassSelection.TabIndex = 1; + // + // FormForMultipleClassSelection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(151, 306); + this.Controls.Add(this.splitContainerForClassSelection); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormForMultipleClassSelection"; + this.Text = "Select Classes"; + this.splitContainerForClassSelection.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerForClassSelection)).EndInit(); + this.splitContainerForClassSelection.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonOk; + public System.Windows.Forms.SplitContainer splitContainerForClassSelection; + } +} \ No newline at end of file diff --git a/Forms/IO/FormForCellByCellClusteringResults.cs b/Forms/IO/FormForMultipleClassSelection.cs similarity index 70% rename from Forms/IO/FormForCellByCellClusteringResults.cs rename to Forms/IO/FormForMultipleClassSelection.cs index db15f40..868ffce 100644 --- a/Forms/IO/FormForCellByCellClusteringResults.cs +++ b/Forms/IO/FormForMultipleClassSelection.cs @@ -9,9 +9,9 @@ namespace HCSAnalyzer.Forms.IO { - public partial class FormForCellByCellClusteringResults : Form + public partial class FormForMultipleClassSelection : Form { - public FormForCellByCellClusteringResults() + public FormForMultipleClassSelection() { InitializeComponent(); } diff --git a/Forms/IO/FormForMultipleClassSelection.resx b/Forms/IO/FormForMultipleClassSelection.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/Forms/IO/FormForMultipleClassSelection.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/IO/FormForMultivariateScreen.Designer.cs b/Forms/IO/FormForMultivariateScreen.Designer.cs index 6cc95e0..5e1cf4a 100644 --- a/Forms/IO/FormForMultivariateScreen.Designer.cs +++ b/Forms/IO/FormForMultivariateScreen.Designer.cs @@ -233,7 +233,7 @@ private void InitializeComponent() this.Controls.Add(this.numericUpDownDimensionNumber); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormForMultivariateScreen"; - this.Text = "FormForMultivariateScreen"; + this.Text = "Generate Multivariate Screening"; ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDimensionNumber)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRows)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownColumns)).EndInit(); diff --git a/Forms/IO/FormForMultivariateScreen.cs b/Forms/IO/FormForMultivariateScreen.cs index 48d545f..8c69705 100644 --- a/Forms/IO/FormForMultivariateScreen.cs +++ b/Forms/IO/FormForMultivariateScreen.cs @@ -62,12 +62,12 @@ public void UpDateDisplay() } - for (int i = 0; i < GlobalInfo.GetNumberofDefinedClass(); i++) + for (int i = 0; i < GlobalInfo.GetNumberofDefinedWellClass(); i++) { int IdxPosCol = 0; dataGridViewForCompounds.Rows.Add(); dataGridViewForCompounds.Rows[i].Cells[IdxPosCol].Value = "Phenotype " + i; - dataGridViewForCompounds.Rows[i].Cells[IdxPosCol++].Style.BackColor = GlobalInfo.GetColor(i); + dataGridViewForCompounds.Rows[i].Cells[IdxPosCol++].Style.BackColor = GlobalInfo.ListWellClasses[i].ColourForDisplay; int Position = i; diff --git a/Forms/IO/FormForNameRequest.Designer.cs b/Forms/IO/FormForNameRequest.Designer.cs index 54419b3..7f5a2f7 100644 --- a/Forms/IO/FormForNameRequest.Designer.cs +++ b/Forms/IO/FormForNameRequest.Designer.cs @@ -30,12 +30,26 @@ private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.textBoxForName = new System.Windows.Forms.TextBox(); + this.listBox1 = new System.Windows.Forms.ListBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); this.SuspendLayout(); // // button1 // this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; - this.button1.Location = new System.Drawing.Point(42, 50); + this.button1.Location = new System.Drawing.Point(153, 970); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(147, 23); this.button1.TabIndex = 0; @@ -44,23 +58,142 @@ private void InitializeComponent() // // textBoxForName // + this.textBoxForName.AllowDrop = true; this.textBoxForName.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; this.textBoxForName.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.RecentlyUsedList; - this.textBoxForName.Location = new System.Drawing.Point(21, 12); + this.textBoxForName.Location = new System.Drawing.Point(133, 12); this.textBoxForName.Name = "textBoxForName"; this.textBoxForName.Size = new System.Drawing.Size(188, 20); this.textBoxForName.TabIndex = 1; + this.textBoxForName.TextChanged += new System.EventHandler(this.textBoxForName_TextChanged); + // + // listBox1 + // + this.listBox1.AllowDrop = true; + this.listBox1.FormattingEnabled = true; + this.listBox1.HorizontalScrollbar = true; + this.listBox1.Location = new System.Drawing.Point(27, 48); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(413, 914); + this.listBox1.TabIndex = 2; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(454, 65); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(35, 20); + this.numericUpDown1.TabIndex = 3; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(523, 65); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(35, 20); + this.numericUpDown2.TabIndex = 4; + this.numericUpDown2.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(451, 48); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(51, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Maximum"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(520, 48); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(48, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Minimum"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.DarkRed; + this.label3.Location = new System.Drawing.Point(478, 28); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(53, 20); + this.label3.TabIndex = 7; + this.label3.Text = "Class"; + // + // numericUpDown3 + // + this.numericUpDown3.Location = new System.Drawing.Point(464, 156); + this.numericUpDown3.Name = "numericUpDown3"; + this.numericUpDown3.Size = new System.Drawing.Size(120, 20); + this.numericUpDown3.TabIndex = 8; + this.numericUpDown3.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(451, 126); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(155, 13); + this.label4.TabIndex = 9; + this.label4.Text = "Number of Pathway to vizualize"; + // + // numericUpDown4 + // + this.numericUpDown4.DecimalPlaces = 3; + this.numericUpDown4.Location = new System.Drawing.Point(470, 217); + this.numericUpDown4.Name = "numericUpDown4"; + this.numericUpDown4.Size = new System.Drawing.Size(120, 20); + this.numericUpDown4.TabIndex = 10; + this.numericUpDown4.Value = new decimal(new int[] { + 1, + 0, + 0, + 131072}); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(486, 198); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(44, 13); + this.label5.TabIndex = 11; + this.label5.Text = "P-Value"; // // FormForNameRequest // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(230, 100); + this.AutoSize = true; + this.ClientSize = new System.Drawing.Size(621, 1020); + this.Controls.Add(this.label5); + this.Controls.Add(this.numericUpDown4); + this.Controls.Add(this.label4); + this.Controls.Add(this.numericUpDown3); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.listBox1); this.Controls.Add(this.textBoxForName); this.Controls.Add(this.button1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "FormForNameRequest"; this.Text = "Enter Name"; + this.TopMost = true; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -70,5 +203,15 @@ private void InitializeComponent() private System.Windows.Forms.Button button1; public System.Windows.Forms.TextBox textBoxForName; + public System.Windows.Forms.ListBox listBox1; + public System.Windows.Forms.NumericUpDown numericUpDown1; + public System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDown3; + public System.Windows.Forms.NumericUpDown numericUpDown4; + private System.Windows.Forms.Label label5; } } \ No newline at end of file diff --git a/Forms/IO/FormForNameRequest.cs b/Forms/IO/FormForNameRequest.cs index 23930fd..9fbf265 100644 --- a/Forms/IO/FormForNameRequest.cs +++ b/Forms/IO/FormForNameRequest.cs @@ -15,5 +15,26 @@ public FormForNameRequest() { InitializeComponent(); } + + private void textBoxForName_TextChanged(object sender, EventArgs e) + { + + char[] searchchar = textBoxForName.Text.ToCharArray(); + string searchstring = textBoxForName.Text; + listBox1.SelectionMode = SelectionMode.MultiExtended; + for (int i = 0; i < listBox1.Items.Count; i++) + { + if (listBox1.Items[i].ToString().ToUpper().Contains(searchstring.ToUpper()) && searchstring!="") + { + listBox1.SetSelected(i, true); + } + else + { + listBox1.SetSelected(i, false); + } + } + + + } } } diff --git a/Forms/IO/FormForNewDescName.Designer.cs b/Forms/IO/FormForNewDescName.Designer.cs new file mode 100644 index 0000000..1ac5938 --- /dev/null +++ b/Forms/IO/FormForNewDescName.Designer.cs @@ -0,0 +1,88 @@ +namespace HCSAnalyzer.Forms.IO +{ + partial class FormForNewDescName + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormForNewDescName)); + this.label1 = new System.Windows.Forms.Label(); + this.textBoxName = new System.Windows.Forms.TextBox(); + this.buttonOk = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(31, 18); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(171, 39); + this.label1.TabIndex = 0; + this.label1.Text = "This descriptor name already exists\r\n\r\nEnter a new one"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // textBoxName + // + this.textBoxName.Location = new System.Drawing.Point(34, 80); + this.textBoxName.Name = "textBoxName"; + this.textBoxName.Size = new System.Drawing.Size(168, 20); + this.textBoxName.TabIndex = 1; + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOk.Location = new System.Drawing.Point(65, 128); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(103, 23); + this.buttonOk.TabIndex = 2; + this.buttonOk.Text = "Ok"; + this.buttonOk.UseVisualStyleBackColor = true; + // + // FormForNewDescName + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(232, 168); + this.Controls.Add(this.buttonOk); + this.Controls.Add(this.textBoxName); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "FormForNewDescName"; + this.Text = "Error"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + public System.Windows.Forms.TextBox textBoxName; + private System.Windows.Forms.Button buttonOk; + } +} \ No newline at end of file diff --git a/Forms/FormForCellbyCellClassif.cs b/Forms/IO/FormForNewDescName.cs similarity index 67% rename from Forms/FormForCellbyCellClassif.cs rename to Forms/IO/FormForNewDescName.cs index 18f057a..7e37950 100644 --- a/Forms/FormForCellbyCellClassif.cs +++ b/Forms/IO/FormForNewDescName.cs @@ -7,11 +7,11 @@ using System.Text; using System.Windows.Forms; -namespace HCSAnalyzer.Forms +namespace HCSAnalyzer.Forms.IO { - public partial class FormForCellbyCellClassif : Form + public partial class FormForNewDescName : Form { - public FormForCellbyCellClassif() + public FormForNewDescName() { InitializeComponent(); } diff --git a/Forms/IO/FormForNewDescName.resx b/Forms/IO/FormForNewDescName.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/Forms/IO/FormForNewDescName.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/IO/FormSingleCellClusteringInfo.Designer.cs b/Forms/IO/FormSingleCellClusteringInfo.Designer.cs deleted file mode 100644 index dde2148..0000000 --- a/Forms/IO/FormSingleCellClusteringInfo.Designer.cs +++ /dev/null @@ -1,218 +0,0 @@ -namespace HCSAnalyzer.Forms.FormsForGraphsDisplay -{ - partial class FormSingleCellClusteringInfo - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSingleCellClusteringInfo)); - this.buttonOk = new System.Windows.Forms.Button(); - this.radioButtonEM = new System.Windows.Forms.RadioButton(); - this.numericUpDownClassNumber = new System.Windows.Forms.NumericUpDown(); - this.label1 = new System.Windows.Forms.Label(); - this.checkBoxEMAutomated = new System.Windows.Forms.CheckBox(); - this.groupBoxAutomated = new System.Windows.Forms.GroupBox(); - this.groupBoxDescriptorBased = new System.Windows.Forms.GroupBox(); - this.labelDescForClass = new System.Windows.Forms.Label(); - this.comboBoxDescriptorForClass = new System.Windows.Forms.ComboBox(); - this.radioButtonAutomated = new System.Windows.Forms.RadioButton(); - this.radioButtonDescriptorBased = new System.Windows.Forms.RadioButton(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownClassNumber)).BeginInit(); - this.groupBoxAutomated.SuspendLayout(); - this.groupBoxDescriptorBased.SuspendLayout(); - this.SuspendLayout(); - // - // buttonOk - // - this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOk.Location = new System.Drawing.Point(86, 212); - this.buttonOk.Name = "buttonOk"; - this.buttonOk.Size = new System.Drawing.Size(130, 32); - this.buttonOk.TabIndex = 0; - this.buttonOk.Text = "Ok"; - this.buttonOk.UseVisualStyleBackColor = true; - // - // radioButtonEM - // - this.radioButtonEM.AutoSize = true; - this.radioButtonEM.Checked = true; - this.radioButtonEM.Location = new System.Drawing.Point(123, 19); - this.radioButtonEM.Name = "radioButtonEM"; - this.radioButtonEM.Size = new System.Drawing.Size(41, 17); - this.radioButtonEM.TabIndex = 1; - this.radioButtonEM.TabStop = true; - this.radioButtonEM.Text = "EM"; - this.radioButtonEM.UseVisualStyleBackColor = true; - // - // numericUpDownClassNumber - // - this.numericUpDownClassNumber.Location = new System.Drawing.Point(108, 55); - this.numericUpDownClassNumber.Maximum = new decimal(new int[] { - 10000, - 0, - 0, - 0}); - this.numericUpDownClassNumber.Minimum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownClassNumber.Name = "numericUpDownClassNumber"; - this.numericUpDownClassNumber.Size = new System.Drawing.Size(68, 20); - this.numericUpDownClassNumber.TabIndex = 2; - this.numericUpDownClassNumber.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(19, 57); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(83, 13); - this.label1.TabIndex = 3; - this.label1.Text = "Number of class"; - // - // checkBoxEMAutomated - // - this.checkBoxEMAutomated.AutoSize = true; - this.checkBoxEMAutomated.Location = new System.Drawing.Point(195, 57); - this.checkBoxEMAutomated.Name = "checkBoxEMAutomated"; - this.checkBoxEMAutomated.Size = new System.Drawing.Size(77, 17); - this.checkBoxEMAutomated.TabIndex = 4; - this.checkBoxEMAutomated.Text = "Automated"; - this.checkBoxEMAutomated.UseVisualStyleBackColor = true; - this.checkBoxEMAutomated.CheckedChanged += new System.EventHandler(this.checkBoxEMAutomated_CheckedChanged); - // - // groupBoxAutomated - // - this.groupBoxAutomated.Controls.Add(this.numericUpDownClassNumber); - this.groupBoxAutomated.Controls.Add(this.checkBoxEMAutomated); - this.groupBoxAutomated.Controls.Add(this.radioButtonEM); - this.groupBoxAutomated.Controls.Add(this.label1); - this.groupBoxAutomated.Location = new System.Drawing.Point(7, 12); - this.groupBoxAutomated.Name = "groupBoxAutomated"; - this.groupBoxAutomated.Size = new System.Drawing.Size(287, 90); - this.groupBoxAutomated.TabIndex = 5; - this.groupBoxAutomated.TabStop = false; - this.groupBoxAutomated.Text = " "; - // - // groupBoxDescriptorBased - // - this.groupBoxDescriptorBased.Controls.Add(this.labelDescForClass); - this.groupBoxDescriptorBased.Controls.Add(this.comboBoxDescriptorForClass); - this.groupBoxDescriptorBased.Enabled = false; - this.groupBoxDescriptorBased.Location = new System.Drawing.Point(7, 106); - this.groupBoxDescriptorBased.Name = "groupBoxDescriptorBased"; - this.groupBoxDescriptorBased.Size = new System.Drawing.Size(287, 85); - this.groupBoxDescriptorBased.TabIndex = 6; - this.groupBoxDescriptorBased.TabStop = false; - this.groupBoxDescriptorBased.Text = " "; - // - // labelDescForClass - // - this.labelDescForClass.AutoSize = true; - this.labelDescForClass.Location = new System.Drawing.Point(23, 38); - this.labelDescForClass.Name = "labelDescForClass"; - this.labelDescForClass.Size = new System.Drawing.Size(97, 13); - this.labelDescForClass.TabIndex = 15; - this.labelDescForClass.Text = "Descriptor for class"; - // - // comboBoxDescriptorForClass - // - this.comboBoxDescriptorForClass.FormattingEnabled = true; - this.comboBoxDescriptorForClass.Location = new System.Drawing.Point(132, 35); - this.comboBoxDescriptorForClass.Name = "comboBoxDescriptorForClass"; - this.comboBoxDescriptorForClass.Size = new System.Drawing.Size(140, 21); - this.comboBoxDescriptorForClass.TabIndex = 14; - // - // radioButtonAutomated - // - this.radioButtonAutomated.AutoSize = true; - this.radioButtonAutomated.Checked = true; - this.radioButtonAutomated.Location = new System.Drawing.Point(22, 10); - this.radioButtonAutomated.Name = "radioButtonAutomated"; - this.radioButtonAutomated.Size = new System.Drawing.Size(76, 17); - this.radioButtonAutomated.TabIndex = 7; - this.radioButtonAutomated.TabStop = true; - this.radioButtonAutomated.Text = "Automated"; - this.radioButtonAutomated.UseVisualStyleBackColor = true; - this.radioButtonAutomated.CheckedChanged += new System.EventHandler(this.radioButtonAutomated_CheckedChanged); - // - // radioButtonDescriptorBased - // - this.radioButtonDescriptorBased.AutoSize = true; - this.radioButtonDescriptorBased.Location = new System.Drawing.Point(22, 105); - this.radioButtonDescriptorBased.Name = "radioButtonDescriptorBased"; - this.radioButtonDescriptorBased.Size = new System.Drawing.Size(105, 17); - this.radioButtonDescriptorBased.TabIndex = 8; - this.radioButtonDescriptorBased.Text = "Descriptor based"; - this.radioButtonDescriptorBased.UseVisualStyleBackColor = true; - this.radioButtonDescriptorBased.CheckedChanged += new System.EventHandler(this.radioButtonDescriptorBased_CheckedChanged); - // - // FormSingleCellClusteringInfo - // - this.AcceptButton = this.buttonOk; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(300, 259); - this.Controls.Add(this.radioButtonDescriptorBased); - this.Controls.Add(this.radioButtonAutomated); - this.Controls.Add(this.groupBoxDescriptorBased); - this.Controls.Add(this.groupBoxAutomated); - this.Controls.Add(this.buttonOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.Name = "FormSingleCellClusteringInfo"; - this.Text = "Clustering Properties"; - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownClassNumber)).EndInit(); - this.groupBoxAutomated.ResumeLayout(false); - this.groupBoxAutomated.PerformLayout(); - this.groupBoxDescriptorBased.ResumeLayout(false); - this.groupBoxDescriptorBased.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button buttonOk; - public System.Windows.Forms.RadioButton radioButtonEM; - public System.Windows.Forms.NumericUpDown numericUpDownClassNumber; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.GroupBox groupBoxAutomated; - private System.Windows.Forms.GroupBox groupBoxDescriptorBased; - public System.Windows.Forms.RadioButton radioButtonAutomated; - public System.Windows.Forms.RadioButton radioButtonDescriptorBased; - public System.Windows.Forms.CheckBox checkBoxEMAutomated; - private System.Windows.Forms.Label labelDescForClass; - public System.Windows.Forms.ComboBox comboBoxDescriptorForClass; - } -} \ No newline at end of file diff --git a/Forms/IO/FormSingleCellClusteringInfo.cs b/Forms/IO/FormSingleCellClusteringInfo.cs deleted file mode 100644 index 192b0c2..0000000 --- a/Forms/IO/FormSingleCellClusteringInfo.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using HCSAnalyzer.Classes; - -namespace HCSAnalyzer.Forms.FormsForGraphsDisplay -{ - public partial class FormSingleCellClusteringInfo : Form - { - public FormSingleCellClusteringInfo(cGlobalInfo GlobalInfo) - { - InitializeComponent(); - - ToolTip toolTip1 = new ToolTip(); - // Set up the delays for the ToolTip. - toolTip1.AutoPopDelay = 5000; - toolTip1.InitialDelay = 1000; - toolTip1.ReshowDelay = 500; - - toolTip1.ShowAlways = true; - - // Set up the ToolTip text for the Button and Checkbox. - toolTip1.SetToolTip(this.labelDescForClass, "Choose a descriptor that contains the class of the objects."); - // toolTip1.SetToolTip(this.labelNeutralClass, "Define (if necessary !) a class value that not be taken into account for the learning process."); - toolTip1.SetToolTip(this.radioButtonAutomated, "The object classes will be evaluated automatically."); - toolTip1.SetToolTip(this.radioButtonDescriptorBased, "One descriptor represents already the object class."); - - foreach (var item in GlobalInfo.CheckedListBoxForDescActive.Items) - { - this.comboBoxDescriptorForClass.Items.Add(item); - } - } - - private void checkBoxEMAutomated_CheckedChanged(object sender, EventArgs e) - { - this.numericUpDownClassNumber.Enabled = !checkBoxEMAutomated.Checked; - } - - private void radioButtonAutomated_CheckedChanged(object sender, EventArgs e) - { - groupBoxAutomated.Enabled = true; - groupBoxDescriptorBased.Enabled = false; - } - - private void radioButtonDescriptorBased_CheckedChanged(object sender, EventArgs e) - { - groupBoxAutomated.Enabled = false; - groupBoxDescriptorBased.Enabled = true; - - } - - - - } -} diff --git a/Classes/3D/c3DWorld.cs b/GUI/3D/3D_Engine/c3DWorld.cs similarity index 99% rename from Classes/3D/c3DWorld.cs rename to GUI/3D/3D_Engine/c3DWorld.cs index f37912d..0a4abaa 100644 --- a/Classes/3D/c3DWorld.cs +++ b/GUI/3D/3D_Engine/c3DWorld.cs @@ -538,7 +538,7 @@ public void CopyMetaObjectSignatureToTable(cMetaBiologicalObject MetaObject, int void WellInfoClick(object sender, EventArgs e) { - CurrentlySelectedWell.DisplayInfoWindow(); + CurrentlySelectedWell.DisplayInfoWindow(CurrentScreen.ListDescriptors.CurrentSelectedDescriptorIdx); } @@ -926,7 +926,7 @@ private bool IsThisObjectInsideTheOther(cInteractive3DObject Content, cBiologica private void AddObject3D(cObject3D Object3D) { - // Object3D.SetColor(Object3D.Colour.R, Object3D.Colour.G, Object3D.Colour.B); + Object3D.SetColor(Object3D.Colour); // Object3D.vtk_Actor.SetPosition(Object3D.vtk_Actor.GetPosition()[0] * Xres, Object3D.vtk_Actor.GetPosition()[1] * Yres, Object3D.vtk_Actor.GetPosition()[2] * Zres); ListObject.Add(Object3D); Object3D.AddMeToTheWorld(ren1); diff --git a/Classes/3D/cGeometricalObjects.cs b/GUI/3D/3D_Engine/cGeometricalObjects.cs similarity index 99% rename from Classes/3D/cGeometricalObjects.cs rename to GUI/3D/3D_Engine/cGeometricalObjects.cs index 2e17268..bbd887b 100644 --- a/Classes/3D/cGeometricalObjects.cs +++ b/GUI/3D/3D_Engine/cGeometricalObjects.cs @@ -298,7 +298,7 @@ private void Create(cDRC_Region AssociatedRegion, Color Color, double Regulariza { cWell TmpWell = AssociatedRegion.GetListWells()[j][i]; if (TmpWell == null) continue; - double PosZ = TmpWell.ListDescriptors[TmpWell.AssociatedPlate.ParentScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue(); + double PosZ = TmpWell.ListDescriptors[TmpWell.AssociatedPlate.ParentScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); if (PosZ >= GlobalMax) GlobalMax = PosZ; if (PosZ <= GlobalMin) GlobalMin = PosZ; @@ -577,6 +577,7 @@ public c3DText(c3DWorld CurrentWorld, string TextToDisplay, cPoint3D Position, C TextActor.SetPickable(0); TextActor.SetScale(Scale); TextActor.GetProperty().SetColor(Colour.R / 255.0, Colour.G / 255.0, Colour.B / 255.0); + TextActor.GetProperty().SetAmbient(1); CurrentWorld.ren1.AddActor(TextActor); TextActor.SetCamera(CurrentWorld.ren1.GetActiveCamera()); diff --git a/Classes/3D/cInteractiveObjects.cs b/GUI/3D/3D_Engine/cInteractiveObjects.cs similarity index 100% rename from Classes/3D/cInteractiveObjects.cs rename to GUI/3D/3D_Engine/cInteractiveObjects.cs diff --git a/Classes/3D/cMatrix.cs b/GUI/3D/3D_Engine/cMatrix.cs similarity index 100% rename from Classes/3D/cMatrix.cs rename to GUI/3D/3D_Engine/cMatrix.cs diff --git a/Classes/3D/cMetaBiologicalObject.cs b/GUI/3D/3D_Engine/cMetaBiologicalObject.cs similarity index 100% rename from Classes/3D/cMetaBiologicalObject.cs rename to GUI/3D/3D_Engine/cMetaBiologicalObject.cs diff --git a/Classes/3D/cObject3D.cs b/GUI/3D/3D_Engine/cObject3D.cs similarity index 89% rename from Classes/3D/cObject3D.cs rename to GUI/3D/3D_Engine/cObject3D.cs index 52b2a7c..4acf03e 100644 --- a/Classes/3D/cObject3D.cs +++ b/GUI/3D/3D_Engine/cObject3D.cs @@ -12,6 +12,7 @@ namespace HCSAnalyzer.Classes._3D /// /// cPoint3D class /// + [Serializable] public class cPoint3D { public cPoint3D(double X, double Y, double Z) @@ -25,6 +26,13 @@ public cPoint3D(double X, double Y, double Z) public double Y; public double Z; + // The overloaded + operator + public static cPoint3D operator +(cPoint3D First, cPoint3D Second) + { + return new cPoint3D(First.X + Second.X, First.Y + Second.Y, First.Z + Second.Z); + } + + public double DistTo(cPoint3D DestPoint) { @@ -109,7 +117,7 @@ protected void CreateVTK3DObject(int InterpolationMode) } else if (InterpolationMode == 3) { - // vtk_Actor.GetProperty().SetSpecularColor(this.Colour.R / 255.0, this.Colour.G / 255.0, this.Colour.B / 255.0); + // vtk_Actor.GetProperty().SetSpecularColor(this.Colour.R / 255.0, this.Colour.G / 255.0, this.Colour.B / 255.0); vtk_Actor.GetProperty().SetAmbient(0.8); vtk_Actor.GetProperty().SetDiffuse(0.1); vtk_Actor.GetProperty().SetInterpolationToPhong(); @@ -129,7 +137,9 @@ public void SetOpacity(double Opacity) public void SetColor(Color Colour) { - vtk_Actor.GetProperty().SetColor(Colour.R, Colour.G, Colour.B); + vtk_Actor.GetProperty().SetColor(Colour.R/255.0, Colour.G/255.0, Colour.B/255.0); + vtk_Actor.GetProperty().SetOpacity(Colour.A / 255.0); + vtk_Actor.GetProperty().SetAmbient(0); } public void SetToWireFrame() @@ -168,7 +178,7 @@ public void AddText(String Text, c3DWorld CurrentWorld, double scale) TextActor.SetMapper(TextMapper); //TextActor.SetPosition(this.GetActor().GetCenter()[0]-1, this.GetActor().GetCenter()[1]-1, this.GetActor().GetCenter()[2]-2); - TextActor.SetPosition(Position.X , Position.Y , Position.Z - 1); + TextActor.SetPosition(Position.X, Position.Y, Position.Z - 1); TextActor.SetPickable(0); CurrentWorld.ren1.AddActor(TextActor); TextActor.SetCamera(CurrentWorld.ren1.GetActiveCamera()); diff --git a/GUI/3D/FormFor3DDataDisplay.Designer.cs b/GUI/3D/FormFor3DDataDisplay.Designer.cs new file mode 100644 index 0000000..3556a99 --- /dev/null +++ b/GUI/3D/FormFor3DDataDisplay.Designer.cs @@ -0,0 +1,309 @@ +namespace HCSAnalyzer.Forms +{ + partial class FormFor3DDataDisplay + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFor3DDataDisplay)); + this.renderWindowControl1 = new Kitware.VTK.RenderWindowControl(); + this.comboBoxDescriptorX = new System.Windows.Forms.ComboBox(); + this.comboBoxDescriptorY = new System.Windows.Forms.ComboBox(); + this.comboBoxDescriptorZ = new System.Windows.Forms.ComboBox(); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.displayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.axisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.selectedDescriptorsAsActiveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.buttonRefresh = new System.Windows.Forms.Button(); + this.panelForClasses = new System.Windows.Forms.Panel(); + this.checkBoxForDisplayAxesInformation = new System.Windows.Forms.CheckBox(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.MainPanel = new System.Windows.Forms.Panel(); + this.menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.MainPanel.SuspendLayout(); + this.SuspendLayout(); + // + // renderWindowControl1 + // + this.renderWindowControl1.AddTestActors = false; + this.renderWindowControl1.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.renderWindowControl1.Location = new System.Drawing.Point(3, 3); + this.renderWindowControl1.Name = "renderWindowControl1"; + this.renderWindowControl1.Size = new System.Drawing.Size(690, 566); + this.renderWindowControl1.TabIndex = 0; + this.renderWindowControl1.TestText = null; + this.renderWindowControl1.Load += new System.EventHandler(this.renderWindowControl1_Load); + // + // comboBoxDescriptorX + // + this.comboBoxDescriptorX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxDescriptorX.FormattingEnabled = true; + this.comboBoxDescriptorX.Location = new System.Drawing.Point(23, 34); + this.comboBoxDescriptorX.Name = "comboBoxDescriptorX"; + this.comboBoxDescriptorX.Size = new System.Drawing.Size(193, 21); + this.comboBoxDescriptorX.TabIndex = 14; + this.comboBoxDescriptorX.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorX_SelectedIndexChanged); + // + // comboBoxDescriptorY + // + this.comboBoxDescriptorY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxDescriptorY.FormattingEnabled = true; + this.comboBoxDescriptorY.Location = new System.Drawing.Point(23, 65); + this.comboBoxDescriptorY.Name = "comboBoxDescriptorY"; + this.comboBoxDescriptorY.Size = new System.Drawing.Size(193, 21); + this.comboBoxDescriptorY.TabIndex = 15; + this.comboBoxDescriptorY.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorY_SelectedIndexChanged); + // + // comboBoxDescriptorZ + // + this.comboBoxDescriptorZ.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxDescriptorZ.FormattingEnabled = true; + this.comboBoxDescriptorZ.Location = new System.Drawing.Point(23, 96); + this.comboBoxDescriptorZ.Name = "comboBoxDescriptorZ"; + this.comboBoxDescriptorZ.Size = new System.Drawing.Size(193, 21); + this.comboBoxDescriptorZ.TabIndex = 16; + this.comboBoxDescriptorZ.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorZ_SelectedIndexChanged); + // + // menuStrip + // + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.displayToolStripMenuItem, + this.toolsToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(929, 24); + this.menuStrip.TabIndex = 17; + this.menuStrip.Text = "menuStrip1"; + // + // displayToolStripMenuItem + // + this.displayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.refreshToolStripMenuItem, + this.axisToolStripMenuItem}); + this.displayToolStripMenuItem.Name = "displayToolStripMenuItem"; + this.displayToolStripMenuItem.Size = new System.Drawing.Size(57, 20); + this.displayToolStripMenuItem.Text = "Display"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(132, 22); + this.toolStripMenuItem1.Text = "Options"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(132, 22); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // axisToolStripMenuItem + // + this.axisToolStripMenuItem.CheckOnClick = true; + this.axisToolStripMenuItem.Name = "axisToolStripMenuItem"; + this.axisToolStripMenuItem.Size = new System.Drawing.Size(132, 22); + this.axisToolStripMenuItem.Text = "Axis"; + this.axisToolStripMenuItem.Click += new System.EventHandler(this.axisToolStripMenuItem_Click); + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.selectedDescriptorsAsActiveToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20); + this.toolsToolStripMenuItem.Text = "Tools"; + // + // selectedDescriptorsAsActiveToolStripMenuItem + // + this.selectedDescriptorsAsActiveToolStripMenuItem.Name = "selectedDescriptorsAsActiveToolStripMenuItem"; + this.selectedDescriptorsAsActiveToolStripMenuItem.Size = new System.Drawing.Size(230, 22); + this.selectedDescriptorsAsActiveToolStripMenuItem.Text = "Selected Descriptors as Active"; + this.selectedDescriptorsAsActiveToolStripMenuItem.Click += new System.EventHandler(this.selectedDescriptorsAsActiveToolStripMenuItem_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(3, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(14, 13); + this.label1.TabIndex = 18; + this.label1.Text = "X"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(3, 99); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(14, 13); + this.label2.TabIndex = 18; + this.label2.Text = "Z"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 68); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(14, 13); + this.label3.TabIndex = 18; + this.label3.Text = "Y"; + // + // buttonRefresh + // + this.buttonRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonRefresh.Location = new System.Drawing.Point(141, 3); + this.buttonRefresh.Name = "buttonRefresh"; + this.buttonRefresh.Size = new System.Drawing.Size(75, 23); + this.buttonRefresh.TabIndex = 19; + this.buttonRefresh.Text = "Refresh"; + this.buttonRefresh.UseVisualStyleBackColor = true; + this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click); + // + // panelForClasses + // + this.panelForClasses.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.panelForClasses.Location = new System.Drawing.Point(6, 155); + this.panelForClasses.Name = "panelForClasses"; + this.panelForClasses.Size = new System.Drawing.Size(140, 414); + this.panelForClasses.TabIndex = 20; + // + // checkBoxForDisplayAxesInformation + // + this.checkBoxForDisplayAxesInformation.AutoSize = true; + this.checkBoxForDisplayAxesInformation.Checked = true; + this.checkBoxForDisplayAxesInformation.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxForDisplayAxesInformation.Location = new System.Drawing.Point(6, 132); + this.checkBoxForDisplayAxesInformation.Name = "checkBoxForDisplayAxesInformation"; + this.checkBoxForDisplayAxesInformation.Size = new System.Drawing.Size(104, 17); + this.checkBoxForDisplayAxesInformation.TabIndex = 21; + this.checkBoxForDisplayAxesInformation.Text = "Axes Information"; + this.checkBoxForDisplayAxesInformation.UseVisualStyleBackColor = true; + this.checkBoxForDisplayAxesInformation.CheckedChanged += new System.EventHandler(this.checkBoxForDisplayAxesInformation_CheckedChanged); + // + // splitContainer1 + // + this.splitContainer1.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.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.splitContainer1.Location = new System.Drawing.Point(3, 3); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.renderWindowControl1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.buttonRefresh); + this.splitContainer1.Panel2.Controls.Add(this.checkBoxForDisplayAxesInformation); + this.splitContainer1.Panel2.Controls.Add(this.comboBoxDescriptorX); + this.splitContainer1.Panel2.Controls.Add(this.panelForClasses); + this.splitContainer1.Panel2.Controls.Add(this.comboBoxDescriptorY); + this.splitContainer1.Panel2.Controls.Add(this.comboBoxDescriptorZ); + this.splitContainer1.Panel2.Controls.Add(this.label2); + this.splitContainer1.Panel2.Controls.Add(this.label1); + this.splitContainer1.Panel2.Controls.Add(this.label3); + this.splitContainer1.Size = new System.Drawing.Size(923, 574); + this.splitContainer1.SplitterDistance = 698; + this.splitContainer1.TabIndex = 22; + // + // MainPanel + // + this.MainPanel.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.MainPanel.Controls.Add(this.splitContainer1); + this.MainPanel.Location = new System.Drawing.Point(0, 27); + this.MainPanel.Name = "MainPanel"; + this.MainPanel.Size = new System.Drawing.Size(929, 580); + this.MainPanel.TabIndex = 23; + // + // FormFor3DDataDisplay + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(929, 607); + this.Controls.Add(this.MainPanel); + this.Controls.Add(this.menuStrip); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip; + this.Name = "FormFor3DDataDisplay"; + this.Text = "3D Data Visualization"; + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.MainPanel.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + public System.Windows.Forms.ComboBox comboBoxDescriptorX; + public System.Windows.Forms.ComboBox comboBoxDescriptorY; + public System.Windows.Forms.ComboBox comboBoxDescriptorZ; + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem displayToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolStripMenuItem axisToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectedDescriptorsAsActiveToolStripMenuItem; + private System.Windows.Forms.Button buttonRefresh; + private System.Windows.Forms.Panel panelForClasses; + private System.Windows.Forms.CheckBox checkBoxForDisplayAxesInformation; + private System.Windows.Forms.SplitContainer splitContainer1; + public Kitware.VTK.RenderWindowControl renderWindowControl1; + public System.Windows.Forms.Panel MainPanel; + } +} \ No newline at end of file diff --git a/Forms/3D/FormFor3DDataDisplay.cs b/GUI/3D/FormFor3DDataDisplay.cs similarity index 62% rename from Forms/3D/FormFor3DDataDisplay.cs rename to GUI/3D/FormFor3DDataDisplay.cs index 495b3a8..b72e50b 100644 --- a/Forms/3D/FormFor3DDataDisplay.cs +++ b/GUI/3D/FormFor3DDataDisplay.cs @@ -13,46 +13,104 @@ using System.Runtime.InteropServices; using HCSAnalyzer.Forms._3D; using HCSAnalyzer.Classes; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer.Forms { public partial class FormFor3DDataDisplay : Form { - FormFor3DVizuOptions WindowFormFor3DVizuOptions = new FormFor3DVizuOptions(); + FormFor3DVizuOptions WindowFormFor3DVizuOptions = null; public cScreening CompleteScreening = null; - vtkOrientationMarkerWidget widget; - double RadiusSphere = 0.01; - + public double RadiusSphere = 0.01; + public double SphereOpacity = 1; private bool IsFullScreen; c3DWorld CurrentWorld = null; vtkAxesActor axes; double FontSize = 5; + PanelForClassSelection ClassSelectionPanel; + public vtkActor actorSpheres; + public vtkSphereSource SphereSource; + + #region Lighting parameters + public vtkLight light; + bool IsLightAutomated = true; + bool IsDisplayLightSource = false; + public double LightIntensity; + public double LightDiffuse; + public double LightAmbient; + public double LightSpecular; + + #endregion + + + ToolTip ToolTipForX = new ToolTip(); + ToolTip ToolTipForY = new ToolTip(); + ToolTip ToolTipForZ = new ToolTip(); public FormFor3DDataDisplay(bool IsFullScreen, cScreening CompleteScreening) { this.CompleteScreening = CompleteScreening; InitializeComponent(); + + // toolTip1.SetToolTip(comboBoxDescriptorX,comboBoxDescriptorX.Text+"aaaaaa"); + //comboBoxDescriptorX.MouseHover += new System.EventHandler(this.comboBoxDescriptorX_MouseHover); + + //this.comboBoxDescriptorX.tool + // Set up the ToolTip text for the Button and Checkbox. + // toolTip1.SetToolTip(, "Unsupervised feature selection.\nThese approaches use all the active wells as data for the dimensionality reduction."); + + this.IsFullScreen = IsFullScreen; - // WindowFormFor3DVizuOptions.Parent = this; + // WindowFormFor3DVizuOptions.Parent = this; for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) { ListScales.Add(1); } + + ClassSelectionPanel = new PanelForClassSelection(CompleteScreening.GlobalInfo, true, Classes.Base_Classes.GUI.eClassType.WELL); + ClassSelectionPanel.Height = panelForClasses.Height; + ClassSelectionPanel.SelectAll(); + panelForClasses.Controls.Add(ClassSelectionPanel); + + foreach (var CurrentCheckBox in ClassSelectionPanel.ListCheckBoxes) + { + CurrentCheckBox.CheckedChanged += new EventHandler(CurrentCheckBox_CheckedChanged); + } + + ToolTipForX.AutoPopDelay = ToolTipForY.AutoPopDelay = ToolTipForZ.AutoPopDelay = 5000; + ToolTipForX.InitialDelay = ToolTipForY.InitialDelay = ToolTipForZ.InitialDelay = 500; + ToolTipForX.ReshowDelay = ToolTipForY.ReshowDelay = ToolTipForZ.ReshowDelay = 500; + ToolTipForX.ShowAlways = ToolTipForY.ShowAlways = ToolTipForZ.ShowAlways = true; + ToolTipForX.SetToolTip(comboBoxDescriptorX, comboBoxDescriptorX.Text); + + + this.WindowFormFor3DVizuOptions = new FormFor3DVizuOptions(this); + + this.LightIntensity = (double)this.WindowFormFor3DVizuOptions.numericUpDownLightIntensity.Value; + this.LightAmbient = (double)this.WindowFormFor3DVizuOptions.numericUpDownLightAmbient.Value; + this.LightDiffuse = (double)this.WindowFormFor3DVizuOptions.numericUpDownLightIntensity.Value; + this.LightSpecular = (double)this.WindowFormFor3DVizuOptions.numericUpDownLightIntensity.Value; + + SphereSource = vtkSphereSource.New(); + + } - private void renderWindowControl1_Load(object sender, EventArgs e) + private void CurrentCheckBox_CheckedChanged(object sender, EventArgs e) { DisplayXYZ(); } - - + private void renderWindowControl1_Load(object sender, EventArgs e) + { + DisplayXYZ(); + } public List ListScales = new List(); - - + public void DisplayXYZ() { if (CompleteScreening == null) return; @@ -72,15 +130,17 @@ public void DisplayXYZ() if (CurrentWorld == null) { CurrentWorld = new c3DWorld(new cPoint3D(1000, 1000, 1000), new cPoint3D(ListScales[DescX], ListScales[DescY], ListScales[DescZ]), this.renderWindowControl1, Pos, CompleteScreening); + light = vtkLight.New(); + CurrentWorld.SetBackgroundColor(Color.Black); + // CurrentWorld.ren1.AddLight(light); + //CurrentWorld.ren1.RemoveAllLights(); } - CurrentWorld.SetBackgroundColor(Color.Black); + CurrentWorld.ren1.RemoveAllViewProps(); // if (widget != null) widget.SetEnabled(0); - - Series CurrentSeries = new Series("ScatterPoints"); double MinX = double.MaxValue; @@ -113,6 +173,8 @@ public void DisplayXYZ() cExtendedList ListPtY = new cExtendedList(); cExtendedList ListPtZ = new cExtendedList(); + List ListCheckBoxes = ClassSelectionPanel.GetListSelectedClass(); + for (int i = 0; i < ListPlate.Count; i++) { cPlate CurrentPlate = ListPlate[i]; @@ -120,7 +182,7 @@ public void DisplayXYZ() for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) { cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if (TmpWell != null) + if ((TmpWell != null) && (ListCheckBoxes[TmpWell.GetClassIdx()])) { TempX = TmpWell.ListDescriptors[DescX].GetValue(); @@ -140,9 +202,9 @@ public void DisplayXYZ() List Col = new List(); - Col.Add((char)(TmpWell.GetColor().R)); - Col.Add((char)(TmpWell.GetColor().G)); - Col.Add((char)(TmpWell.GetColor().B)); + Col.Add((char)(TmpWell.GetClassColor().R)); + Col.Add((char)(TmpWell.GetClassColor().G)); + Col.Add((char)(TmpWell.GetClassColor().B)); // IntPtr unmanagedPointer = Marshal.UnsafeAddrOfPinnedArrayElement(Col.ToArray(), 0); @@ -153,9 +215,6 @@ public void DisplayXYZ() ListPtY.Add(TempY); ListPtZ.Add(TempZ); - - - // CurrentSpot.Name = TmpWell.AssociatedPlate.Name + " - " + TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; // CurrentSpot.ObjectType = TmpWell.AssociatedPlate.Name + " - " + TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; // Plate3D.AddObject(CurrentSpot); @@ -193,8 +252,9 @@ public void DisplayXYZ() vtkPolyData polydata = vtkPolyData.New(); polydata.SetPoints(Allpoints); polydata.GetPointData().SetScalars(colors); - vtkSphereSource SphereSource = vtkSphereSource.New(); + // vtkSphereSource SphereSource = vtkSphereSource.New(); SphereSource.SetRadius(RadiusSphere); + //SphereSource vtkGlyph3D glyph3D = vtkGlyph3D.New(); glyph3D.SetColorModeToColorByScalar(); glyph3D.SetSourceConnection(SphereSource.GetOutputPort()); @@ -206,11 +266,50 @@ public void DisplayXYZ() vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); mapper.SetInputConnection(glyph3D.GetOutputPort()); - vtkActor actor = vtkActor.New(); - actor.SetMapper(mapper); + actorSpheres = vtkActor.New(); + actorSpheres.SetMapper(mapper); + actorSpheres.GetProperty().SetOpacity(this.SphereOpacity); + CurrentWorld.ren1.AddActor(actorSpheres); + + if (this.IsLightAutomated) + { + CurrentWorld.ren1.RemoveAllLights(); + CurrentWorld.ren1.AutomaticLightCreationOn(); + // this.light.SetIntensity(0); + } + else + { + CurrentWorld.ren1.RemoveAllLights(); + CurrentWorld.ren1.AddLight(light); + this.light.SetIntensity(this.LightIntensity); + CurrentWorld.ren1.AutomaticLightCreationOff(); + actorSpheres.GetProperty().SetInterpolationToPhong(); + actorSpheres.GetProperty().SetAmbient(this.LightAmbient); + actorSpheres.GetProperty().SetDiffuse(this.LightDiffuse); + actorSpheres.GetProperty().SetSpecular(this.LightSpecular); + + + + light.SetFocalPoint(0.5, 0.5, 1); + light.SetPosition(0.5, 0.5, -1); - CurrentWorld.ren1.AddActor(actor); + light.SetDiffuseColor(1, 1, 1); + if (this.IsDisplayLightSource) + { + light.SetPositional(1); + vtkLightActor lightActor = vtkLightActor.New(); + lightActor.SetLight(light); + CurrentWorld.ren1.AddViewProp(lightActor); + } + + + + + } + + + #region Connect For DRC if ((CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions != null) && (CompleteScreening.GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked)) { foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) @@ -225,26 +324,17 @@ public void DisplayXYZ() { //cWell TmpWell0 = CompleteScreening.GetCurrentDisplayPlate().GetWell(item[IdxWell], IdxValue0, true); - - - if ((item[IdxWell] != null) && (item[IdxWell + 1] != null) && (item[IdxWell].GetClass() >= -1)) + if ((item[IdxWell] != null) && (item[IdxWell + 1] != null) && (item[IdxWell].GetClassIdx() >= -1)) { - double StartX = (item[IdxWell].ListDescriptors[DescX].GetValue() - MinValueX) / (MaxValueX - MinValueX); double StartY = (item[IdxWell].ListDescriptors[DescY].GetValue() - MinValueY) / (MaxValueY - MinValueY); double StartZ = (item[IdxWell].ListDescriptors[DescZ].GetValue() - MinValueZ) / (MaxValueZ - MinValueZ); double EndX = (item[IdxWell + 1].ListDescriptors[DescX].GetValue() - MinValueX) / (MaxValueX - MinValueX); double EndY = (item[IdxWell + 1].ListDescriptors[DescY].GetValue() - MinValueY) / (MaxValueY - MinValueY); double EndZ = (item[IdxWell + 1].ListDescriptors[DescZ].GetValue() - MinValueZ) / (MaxValueZ - MinValueZ); - - - cPoint3D StartPt = new cPoint3D(StartX, StartY, StartZ); cPoint3D EndPt = new cPoint3D(EndX, EndY, EndZ); - - c3DLine NewLine = new c3DLine(StartPt, EndPt); - CurrentWorld.AddGeometric3DObject(NewLine); } @@ -274,7 +364,9 @@ public void DisplayXYZ() //WindowforDRCsDisplay.LRichTextBox.Add(DRCDisplay.CurrentRichTextBox); } } + #endregion + #region Build axis // vtkAxesActor axis = vtkAxesActor.New(); vtkAxisActor axisX = vtkAxisActor.New(); axisX.SetPoint1(0, 0, 0); @@ -306,23 +398,23 @@ public void DisplayXYZ() CurrentWorld.ren1.AddActor(axisZ); - + if (widget == null) { widget = vtkOrientationMarkerWidget.New(); - axes = vtkAxesActor.New(); + axes = vtkAxesActor.New(); widget.SetOutlineColor(0.9300, 0.5700, 0.1300); widget.SetInteractor(CurrentWorld.iren); widget.SetViewport(0.0, 0.0, 0.4, 0.4); - widget.SetEnabled(0); - // widget.InteractiveOn(); - + widget.SetEnabled(0); + // widget.InteractiveOn(); + if (this.comboBoxDescriptorX.SelectedItem == null) axes.SetXAxisLabelText(this.comboBoxDescriptorX.Items[0].ToString()); else - axes.SetXAxisLabelText(this.comboBoxDescriptorX.SelectedItem.ToString()); + axes.SetXAxisLabelText(this.comboBoxDescriptorX.SelectedItem.ToString()); if (this.comboBoxDescriptorY.SelectedItem == null) axes.SetYAxisLabelText(this.comboBoxDescriptorY.Items[0].ToString()); @@ -335,26 +427,44 @@ public void DisplayXYZ() axes.SetZAxisLabelText(this.comboBoxDescriptorZ.SelectedItem.ToString()); widget.SetOrientationMarker(axes); - - } else { - if(this.comboBoxDescriptorX.SelectedItem!=null) - axes.SetXAxisLabelText(this.comboBoxDescriptorX.SelectedItem.ToString()); + if (this.comboBoxDescriptorX.SelectedItem != null) + axes.SetXAxisLabelText(this.comboBoxDescriptorX.SelectedItem.ToString()); if (this.comboBoxDescriptorY.SelectedItem != null) - axes.SetYAxisLabelText(this.comboBoxDescriptorY.SelectedItem.ToString()); + axes.SetYAxisLabelText(this.comboBoxDescriptorY.SelectedItem.ToString()); if (this.comboBoxDescriptorZ.SelectedItem != null) - axes.SetZAxisLabelText(this.comboBoxDescriptorZ.SelectedItem.ToString()); + axes.SetZAxisLabelText(this.comboBoxDescriptorZ.SelectedItem.ToString()); widget.SetOrientationMarker(axes); - } - // + if ((this.checkBoxForDisplayAxesInformation.Checked) && (ListPtX.Count > 0)) + { + double CurrentFontSize = this.FontSize / 400.0;// 0.02; + + c3DText MaxAxeX = new c3DText(CurrentWorld, MaxValueX.ToString("N2"), new cPoint3D(1, 0, 0), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MaxAxeX); + + c3DText MaxAxeY = new c3DText(CurrentWorld, MaxValueY.ToString("N2"), new cPoint3D(0, 1, 0), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MaxAxeY); + + c3DText MaxAxeZ = new c3DText(CurrentWorld, MaxValueZ.ToString("N2"), new cPoint3D(0, 0, 1), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MaxAxeZ); + c3DText MinAxeX = new c3DText(CurrentWorld, MinValueX.ToString("N2"), new cPoint3D(0, -0.1, -0.1), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MinAxeX); + + c3DText MinAxeY = new c3DText(CurrentWorld, MinValueY.ToString("N2"), new cPoint3D(-0.1, -0.1, 0), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MinAxeY); + + c3DText MinAxeZ = new c3DText(CurrentWorld, MinValueZ.ToString("N2"), new cPoint3D(-0.1, 0, -0.1), Color.White, CurrentFontSize); + CurrentWorld.AddGeometric3DObject(MinAxeZ); + } + #endregion //vtkCameraWidget Wid = vtkCameraWidget.New(); //Wid.SetInteractor(CurrentWorld.iren); @@ -382,41 +492,59 @@ public void DisplayXYZ() //c3DText CaptionZ = new c3DText(CurrentWorld, CompleteScreening.ListDescriptors[DescZ].GetName(), new cPoint3D(MinX, MinY, MaxZ), Color.DarkBlue, this.FontSize); //c3DLine LineZ = new c3DLine(new cPoint3D(MinX, MinY, MinZ), new cPoint3D(MinX, MinY, MaxZ), Color.DarkBlue); //CurrentWorld.AddGeometric3DObject(LineZ); + + #region Update ComboBoxes + if (comboBoxDescriptorX.Text == "") + ToolTipForX.SetToolTip(comboBoxDescriptorX, comboBoxDescriptorX.Items[0].ToString()); + else + ToolTipForX.SetToolTip(comboBoxDescriptorX, comboBoxDescriptorX.Text); + + if (comboBoxDescriptorY.Text == "") + ToolTipForY.SetToolTip(comboBoxDescriptorY, comboBoxDescriptorY.Items[0].ToString()); + else + ToolTipForY.SetToolTip(comboBoxDescriptorY, comboBoxDescriptorY.Text); + + if (comboBoxDescriptorZ.Text == "") + ToolTipForZ.SetToolTip(comboBoxDescriptorZ, comboBoxDescriptorZ.Items[0].ToString()); + else + ToolTipForZ.SetToolTip(comboBoxDescriptorZ, comboBoxDescriptorZ.Text); + #endregion + CurrentWorld.SimpleRender();// Render(); } - private void comboBoxDescriptorZ_SelectedIndexChanged(object sender, EventArgs e) + private void comboBoxDescriptorX_SelectedIndexChanged(object sender, EventArgs e) { + ToolTipForX.SetToolTip(comboBoxDescriptorX, comboBoxDescriptorX.Text); DisplayXYZ(); } - private void comboBoxDescriptorX_SelectedIndexChanged(object sender, EventArgs e) + private void comboBoxDescriptorY_SelectedIndexChanged(object sender, EventArgs e) { + ToolTipForY.SetToolTip(comboBoxDescriptorY, comboBoxDescriptorY.Text); DisplayXYZ(); } - private void comboBoxDescriptorY_SelectedIndexChanged(object sender, EventArgs e) + private void comboBoxDescriptorZ_SelectedIndexChanged(object sender, EventArgs e) { + ToolTipForZ.SetToolTip(comboBoxDescriptorZ, comboBoxDescriptorZ.Text); DisplayXYZ(); } - - - private void toolStripMenuItem1_Click(object sender, EventArgs e) { - WindowFormFor3DVizuOptions.numericUpDownRadiusSphere.Value = (decimal)(this.RadiusSphere*100.0); + WindowFormFor3DVizuOptions.numericUpDownRadiusSphere.Value = (decimal)(this.RadiusSphere * 100.0); WindowFormFor3DVizuOptions.numericUpDownFontSize.Value = (decimal)this.FontSize; if (WindowFormFor3DVizuOptions.ShowDialog() == System.Windows.Forms.DialogResult.OK) { - this.RadiusSphere = (double)WindowFormFor3DVizuOptions.numericUpDownRadiusSphere.Value/100.0; + this.RadiusSphere = (double)WindowFormFor3DVizuOptions.numericUpDownRadiusSphere.Value / 100.0; this.FontSize = (double)WindowFormFor3DVizuOptions.numericUpDownFontSize.Value; + this.SphereOpacity = (double)WindowFormFor3DVizuOptions.numericUpDownSphereOpacity.Value; + this.IsDisplayLightSource = WindowFormFor3DVizuOptions.checkBoxLightDisplaySource.Checked; + this.IsLightAutomated = WindowFormFor3DVizuOptions.radioButtonLightAutomated.Checked; DisplayXYZ(); } - - - } private void refreshToolStripMenuItem_Click(object sender, EventArgs e) @@ -432,7 +560,38 @@ private void axisToolStripMenuItem_Click(object sender, EventArgs e) widget.SetEnabled(0); } + private void selectedDescriptorsAsActiveToolStripMenuItem_Click(object sender, EventArgs e) + { + for (int i = 0; i < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; i++) + CompleteScreening.ListDescriptors.SetItemState(i, false); + + int DescX = this.comboBoxDescriptorX.SelectedIndex; + int DescY = this.comboBoxDescriptorY.SelectedIndex; + int DescZ = this.comboBoxDescriptorZ.SelectedIndex; + CompleteScreening.ListDescriptors.SetItemState(DescX, true); + CompleteScreening.ListDescriptors.SetItemState(DescY, true); + CompleteScreening.ListDescriptors.SetItemState(DescZ, true); + + CompleteScreening.GlobalInfo.WindowHCSAnalyzer.RefreshInfoScreeningRichBox(); + + if (CompleteScreening.GlobalInfo.ViewMode == eViewMode.PIE) + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(0, false); + } + + private void buttonRefresh_Click(object sender, EventArgs e) + { + DisplayXYZ(); + } + + private void checkBoxForDisplayAxesInformation_CheckedChanged(object sender, EventArgs e) + { + DisplayXYZ(); + } } + + + + } diff --git a/Forms/3D/FormFor3DDataDisplay.resx b/GUI/3D/FormFor3DDataDisplay.resx similarity index 99% rename from Forms/3D/FormFor3DDataDisplay.resx rename to GUI/3D/FormFor3DDataDisplay.resx index de527c9..4a01126 100644 --- a/Forms/3D/FormFor3DDataDisplay.resx +++ b/GUI/3D/FormFor3DDataDisplay.resx @@ -117,7 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 diff --git a/GUI/3D/FormFor3DVizuOptions.Designer.cs b/GUI/3D/FormFor3DVizuOptions.Designer.cs new file mode 100644 index 0000000..442caae --- /dev/null +++ b/GUI/3D/FormFor3DVizuOptions.Designer.cs @@ -0,0 +1,452 @@ +namespace HCSAnalyzer.Forms._3D +{ + partial class FormFor3DVizuOptions + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFor3DVizuOptions)); + this.numericUpDownRadiusSphere = new System.Windows.Forms.NumericUpDown(); + this.buttonOK = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDownFontSize = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDownSphereOpacity = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPageObjectProperties = new System.Windows.Forms.TabPage(); + this.tabPageLighting = new System.Windows.Forms.TabPage(); + this.radioButtonLightAutomated = new System.Windows.Forms.RadioButton(); + this.radioButtonLightManual = new System.Windows.Forms.RadioButton(); + this.panelManualLight = new System.Windows.Forms.Panel(); + this.checkBoxLightDisplaySource = new System.Windows.Forms.CheckBox(); + this.numericUpDownLightIntensity = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.numericUpDownLightAmbient = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownLightDiffuse = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.numericUpDownLightSpecular = new System.Windows.Forms.NumericUpDown(); + this.label7 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRadiusSphere)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSphereOpacity)).BeginInit(); + this.tabControl1.SuspendLayout(); + this.tabPageObjectProperties.SuspendLayout(); + this.tabPageLighting.SuspendLayout(); + this.panelManualLight.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightIntensity)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightAmbient)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightDiffuse)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightSpecular)).BeginInit(); + this.SuspendLayout(); + // + // numericUpDownRadiusSphere + // + this.numericUpDownRadiusSphere.DecimalPlaces = 1; + this.numericUpDownRadiusSphere.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownRadiusSphere.Location = new System.Drawing.Point(117, 42); + this.numericUpDownRadiusSphere.Maximum = new decimal(new int[] { + 100000000, + 0, + 0, + 0}); + this.numericUpDownRadiusSphere.Name = "numericUpDownRadiusSphere"; + this.numericUpDownRadiusSphere.Size = new System.Drawing.Size(76, 20); + this.numericUpDownRadiusSphere.TabIndex = 5; + this.numericUpDownRadiusSphere.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.numericUpDownRadiusSphere.ValueChanged += new System.EventHandler(this.numericUpDownRadiusSphere_ValueChanged); + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point(129, 275); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(108, 27); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "Ok"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(17, 44); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(77, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Sphere Radius"; + // + // numericUpDownFontSize + // + this.numericUpDownFontSize.DecimalPlaces = 1; + this.numericUpDownFontSize.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownFontSize.Location = new System.Drawing.Point(117, 16); + this.numericUpDownFontSize.Maximum = new decimal(new int[] { + 100000000, + 0, + 0, + 0}); + this.numericUpDownFontSize.Name = "numericUpDownFontSize"; + this.numericUpDownFontSize.Size = new System.Drawing.Size(76, 20); + this.numericUpDownFontSize.TabIndex = 20; + this.numericUpDownFontSize.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(17, 18); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(51, 13); + this.label4.TabIndex = 19; + this.label4.Text = "Font Size"; + // + // numericUpDownSphereOpacity + // + this.numericUpDownSphereOpacity.DecimalPlaces = 1; + this.numericUpDownSphereOpacity.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownSphereOpacity.Location = new System.Drawing.Point(117, 68); + this.numericUpDownSphereOpacity.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSphereOpacity.Name = "numericUpDownSphereOpacity"; + this.numericUpDownSphereOpacity.Size = new System.Drawing.Size(76, 20); + this.numericUpDownSphereOpacity.TabIndex = 22; + this.numericUpDownSphereOpacity.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownSphereOpacity.ValueChanged += new System.EventHandler(this.numericUpDownSphereOpacity_ValueChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(17, 70); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(80, 13); + this.label1.TabIndex = 21; + this.label1.Text = "Sphere Opacity"; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPageObjectProperties); + this.tabControl1.Controls.Add(this.tabPageLighting); + this.tabControl1.Location = new System.Drawing.Point(6, 7); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(231, 262); + this.tabControl1.TabIndex = 23; + // + // tabPageObjectProperties + // + this.tabPageObjectProperties.Controls.Add(this.numericUpDownFontSize); + this.tabPageObjectProperties.Controls.Add(this.numericUpDownSphereOpacity); + this.tabPageObjectProperties.Controls.Add(this.label3); + this.tabPageObjectProperties.Controls.Add(this.label1); + this.tabPageObjectProperties.Controls.Add(this.numericUpDownRadiusSphere); + this.tabPageObjectProperties.Controls.Add(this.label4); + this.tabPageObjectProperties.Location = new System.Drawing.Point(4, 22); + this.tabPageObjectProperties.Name = "tabPageObjectProperties"; + this.tabPageObjectProperties.Padding = new System.Windows.Forms.Padding(3); + this.tabPageObjectProperties.Size = new System.Drawing.Size(223, 236); + this.tabPageObjectProperties.TabIndex = 0; + this.tabPageObjectProperties.Text = "Objects"; + this.tabPageObjectProperties.UseVisualStyleBackColor = true; + // + // tabPageLighting + // + this.tabPageLighting.Controls.Add(this.panelManualLight); + this.tabPageLighting.Controls.Add(this.radioButtonLightManual); + this.tabPageLighting.Controls.Add(this.radioButtonLightAutomated); + this.tabPageLighting.Location = new System.Drawing.Point(4, 22); + this.tabPageLighting.Name = "tabPageLighting"; + this.tabPageLighting.Padding = new System.Windows.Forms.Padding(3); + this.tabPageLighting.Size = new System.Drawing.Size(223, 236); + this.tabPageLighting.TabIndex = 1; + this.tabPageLighting.Text = "Lighting"; + this.tabPageLighting.UseVisualStyleBackColor = true; + // + // radioButtonLightAutomated + // + this.radioButtonLightAutomated.AutoSize = true; + this.radioButtonLightAutomated.Checked = true; + this.radioButtonLightAutomated.Location = new System.Drawing.Point(16, 8); + this.radioButtonLightAutomated.Name = "radioButtonLightAutomated"; + this.radioButtonLightAutomated.Size = new System.Drawing.Size(76, 17); + this.radioButtonLightAutomated.TabIndex = 0; + this.radioButtonLightAutomated.TabStop = true; + this.radioButtonLightAutomated.Text = "Automated"; + this.radioButtonLightAutomated.UseVisualStyleBackColor = true; + this.radioButtonLightAutomated.CheckedChanged += new System.EventHandler(this.radioButtonLightAutomated_CheckedChanged); + // + // radioButtonLightManual + // + this.radioButtonLightManual.AutoSize = true; + this.radioButtonLightManual.Location = new System.Drawing.Point(16, 33); + this.radioButtonLightManual.Name = "radioButtonLightManual"; + this.radioButtonLightManual.Size = new System.Drawing.Size(60, 17); + this.radioButtonLightManual.TabIndex = 1; + this.radioButtonLightManual.Text = "Manual"; + this.radioButtonLightManual.UseVisualStyleBackColor = true; + this.radioButtonLightManual.CheckedChanged += new System.EventHandler(this.radioButtonLightManual_CheckedChanged); + // + // panelManualLight + // + this.panelManualLight.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelManualLight.Controls.Add(this.numericUpDownLightSpecular); + this.panelManualLight.Controls.Add(this.label7); + this.panelManualLight.Controls.Add(this.numericUpDownLightDiffuse); + this.panelManualLight.Controls.Add(this.label6); + this.panelManualLight.Controls.Add(this.numericUpDownLightAmbient); + this.panelManualLight.Controls.Add(this.label5); + this.panelManualLight.Controls.Add(this.numericUpDownLightIntensity); + this.panelManualLight.Controls.Add(this.label2); + this.panelManualLight.Controls.Add(this.checkBoxLightDisplaySource); + this.panelManualLight.Enabled = false; + this.panelManualLight.Location = new System.Drawing.Point(13, 56); + this.panelManualLight.Name = "panelManualLight"; + this.panelManualLight.Size = new System.Drawing.Size(200, 162); + this.panelManualLight.TabIndex = 2; + // + // checkBoxLightDisplaySource + // + this.checkBoxLightDisplaySource.AutoSize = true; + this.checkBoxLightDisplaySource.Location = new System.Drawing.Point(8, 8); + this.checkBoxLightDisplaySource.Name = "checkBoxLightDisplaySource"; + this.checkBoxLightDisplaySource.Size = new System.Drawing.Size(97, 17); + this.checkBoxLightDisplaySource.TabIndex = 0; + this.checkBoxLightDisplaySource.Text = "Display Source"; + this.checkBoxLightDisplaySource.UseVisualStyleBackColor = true; + // + // numericUpDownLightIntensity + // + this.numericUpDownLightIntensity.DecimalPlaces = 1; + this.numericUpDownLightIntensity.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownLightIntensity.Location = new System.Drawing.Point(105, 37); + this.numericUpDownLightIntensity.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightIntensity.Name = "numericUpDownLightIntensity"; + this.numericUpDownLightIntensity.Size = new System.Drawing.Size(76, 20); + this.numericUpDownLightIntensity.TabIndex = 24; + this.numericUpDownLightIntensity.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightIntensity.ValueChanged += new System.EventHandler(this.numericUpDownLightIntensity_ValueChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(5, 39); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(46, 13); + this.label2.TabIndex = 23; + this.label2.Text = "Intensity"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(5, 68); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(45, 13); + this.label5.TabIndex = 25; + this.label5.Text = "Ambient"; + // + // numericUpDownLightAmbient + // + this.numericUpDownLightAmbient.DecimalPlaces = 1; + this.numericUpDownLightAmbient.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownLightAmbient.Location = new System.Drawing.Point(105, 66); + this.numericUpDownLightAmbient.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightAmbient.Name = "numericUpDownLightAmbient"; + this.numericUpDownLightAmbient.Size = new System.Drawing.Size(76, 20); + this.numericUpDownLightAmbient.TabIndex = 26; + this.numericUpDownLightAmbient.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightAmbient.ValueChanged += new System.EventHandler(this.numericUpDownLightAmbient_ValueChanged); + // + // numericUpDownLightDiffuse + // + this.numericUpDownLightDiffuse.DecimalPlaces = 1; + this.numericUpDownLightDiffuse.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownLightDiffuse.Location = new System.Drawing.Point(105, 92); + this.numericUpDownLightDiffuse.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightDiffuse.Name = "numericUpDownLightDiffuse"; + this.numericUpDownLightDiffuse.Size = new System.Drawing.Size(76, 20); + this.numericUpDownLightDiffuse.TabIndex = 28; + this.numericUpDownLightDiffuse.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightDiffuse.ValueChanged += new System.EventHandler(this.numericUpDownLightDiffuse_ValueChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(5, 94); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(40, 13); + this.label6.TabIndex = 27; + this.label6.Text = "Diffuse"; + // + // numericUpDownLightSpecular + // + this.numericUpDownLightSpecular.DecimalPlaces = 1; + this.numericUpDownLightSpecular.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.numericUpDownLightSpecular.Location = new System.Drawing.Point(105, 118); + this.numericUpDownLightSpecular.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightSpecular.Name = "numericUpDownLightSpecular"; + this.numericUpDownLightSpecular.Size = new System.Drawing.Size(76, 20); + this.numericUpDownLightSpecular.TabIndex = 30; + this.numericUpDownLightSpecular.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownLightSpecular.ValueChanged += new System.EventHandler(this.numericUpDownLightSpecular_ValueChanged); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(5, 120); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(49, 13); + this.label7.TabIndex = 29; + this.label7.Text = "Specular"; + // + // FormFor3DVizuOptions + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(242, 309); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.buttonOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormFor3DVizuOptions"; + this.Text = "Options Visualization 3D"; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownRadiusSphere)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownFontSize)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownSphereOpacity)).EndInit(); + this.tabControl1.ResumeLayout(false); + this.tabPageObjectProperties.ResumeLayout(false); + this.tabPageObjectProperties.PerformLayout(); + this.tabPageLighting.ResumeLayout(false); + this.tabPageLighting.PerformLayout(); + this.panelManualLight.ResumeLayout(false); + this.panelManualLight.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightIntensity)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightAmbient)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightDiffuse)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownLightSpecular)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.NumericUpDown numericUpDownRadiusSphere; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Label label3; + public System.Windows.Forms.NumericUpDown numericUpDownFontSize; + private System.Windows.Forms.Label label4; + public System.Windows.Forms.NumericUpDown numericUpDownSphereOpacity; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPageObjectProperties; + private System.Windows.Forms.TabPage tabPageLighting; + private System.Windows.Forms.Panel panelManualLight; + private System.Windows.Forms.RadioButton radioButtonLightManual; + public System.Windows.Forms.CheckBox checkBoxLightDisplaySource; + public System.Windows.Forms.RadioButton radioButtonLightAutomated; + public System.Windows.Forms.NumericUpDown numericUpDownLightSpecular; + private System.Windows.Forms.Label label7; + public System.Windows.Forms.NumericUpDown numericUpDownLightDiffuse; + private System.Windows.Forms.Label label6; + public System.Windows.Forms.NumericUpDown numericUpDownLightAmbient; + private System.Windows.Forms.Label label5; + public System.Windows.Forms.NumericUpDown numericUpDownLightIntensity; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/GUI/3D/FormFor3DVizuOptions.cs b/GUI/3D/FormFor3DVizuOptions.cs new file mode 100644 index 0000000..02cff08 --- /dev/null +++ b/GUI/3D/FormFor3DVizuOptions.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.Forms._3D +{ + public partial class FormFor3DVizuOptions : Form + { + + // public FormFor3DDataDisplay Parent = null; + FormFor3DDataDisplay Parent; + + public FormFor3DVizuOptions(FormFor3DDataDisplay Parent) + { + InitializeComponent(); + this.Parent = Parent; + } + + private void radioButtonLightAutomated_CheckedChanged(object sender, EventArgs e) + { + panelManualLight.Enabled = radioButtonLightManual.Checked; + } + + private void radioButtonLightManual_CheckedChanged(object sender, EventArgs e) + { + panelManualLight.Enabled = radioButtonLightManual.Checked; + } + + private void numericUpDownLightIntensity_ValueChanged(object sender, EventArgs e) + { + Parent.LightIntensity = (double)this.numericUpDownLightIntensity.Value; + Parent.light.SetIntensity(Parent.LightIntensity); + Parent.renderWindowControl1.Invalidate(); + } + + private void numericUpDownLightAmbient_ValueChanged(object sender, EventArgs e) + { + Parent.LightAmbient = (double)this.numericUpDownLightAmbient.Value; + Parent.actorSpheres.GetProperty().SetAmbient(Parent.LightAmbient); + Parent.renderWindowControl1.Invalidate(); + } + + private void numericUpDownLightDiffuse_ValueChanged(object sender, EventArgs e) + { + Parent.LightDiffuse = (double)this.numericUpDownLightDiffuse.Value; + Parent.actorSpheres.GetProperty().SetDiffuse(Parent.LightDiffuse); + Parent.renderWindowControl1.Invalidate(); + } + + private void numericUpDownLightSpecular_ValueChanged(object sender, EventArgs e) + { + Parent.LightSpecular = (double)this.numericUpDownLightSpecular.Value; + Parent.actorSpheres.GetProperty().SetSpecular(Parent.LightSpecular); + Parent.renderWindowControl1.Invalidate(); + } + + private void numericUpDownRadiusSphere_ValueChanged(object sender, EventArgs e) + { + Parent.RadiusSphere = (double)this.numericUpDownRadiusSphere.Value / 100.0; + Parent.SphereSource.SetRadius(Parent.RadiusSphere); + Parent.renderWindowControl1.Invalidate(); + } + + private void numericUpDownSphereOpacity_ValueChanged(object sender, EventArgs e) + { + Parent.SphereOpacity = (double)this.numericUpDownSphereOpacity.Value; + Parent.actorSpheres.GetProperty().SetOpacity(Parent.SphereOpacity); + Parent.renderWindowControl1.Invalidate(); + } + + } +} diff --git a/GUI/3D/FormFor3DVizuOptions.resx b/GUI/3D/FormFor3DVizuOptions.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/GUI/3D/FormFor3DVizuOptions.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/AboutBox.Designer.cs b/GUI/AboutBox.Designer.cs similarity index 100% rename from Forms/AboutBox.Designer.cs rename to GUI/AboutBox.Designer.cs diff --git a/Forms/AboutBox.cs b/GUI/AboutBox.cs similarity index 100% rename from Forms/AboutBox.cs rename to GUI/AboutBox.cs diff --git a/Forms/AboutBox.resx b/GUI/AboutBox.resx similarity index 100% rename from Forms/AboutBox.resx rename to GUI/AboutBox.resx diff --git a/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassEditing.cs b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassEditing.cs new file mode 100644 index 0000000..1eeab56 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassEditing.cs @@ -0,0 +1,75 @@ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using HCSAnalyzer.Classes; +using System.Windows.Forms; +using System.Drawing; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + class PanelForClassEditing : System.Windows.Forms.Panel + { + List ListTextBoxes; + List ListPanelColor; + cGlobalInfo GlobalInfo; + + public PanelForClassEditing(cGlobalInfo GlobalInfo) + { + this.GlobalInfo = GlobalInfo; + int NumClass = GlobalInfo.GetNumberofDefinedWellClass(); + this.Height = GlobalInfo.OptionsWindow.panelForWellClasses.Height; + this.AutoScroll = true; + //this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + ListTextBoxes = new List(); + ListPanelColor = new List(); + + for (int IdxClass = 0; IdxClass < NumClass; IdxClass++) + { + System.Windows.Forms.Panel PanelForColor = new System.Windows.Forms.Panel(); + PanelForColor.Width = 13; + PanelForColor.Height = 13; + PanelForColor.BackColor = GlobalInfo.ListWellClasses[IdxClass].ColourForDisplay; + PanelForColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + PanelForColor.Location = new System.Drawing.Point(5, PanelForColor.Height * IdxClass-2); + PanelForColor.Tag = IdxClass; + PanelForColor.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.MouseDoubleClick); + ListPanelColor.Add(PanelForColor); + + System.Windows.Forms.TextBox CurrentTextBox = new System.Windows.Forms.TextBox(); + CurrentTextBox.Text = "Class " + IdxClass; + CurrentTextBox.Location = new System.Drawing.Point(PanelForColor.Width+15, (CurrentTextBox.Height+5) * IdxClass); + CurrentTextBox.TextChanged += new EventHandler(CurrentTextBox_TextChanged); + CurrentTextBox.Tag = IdxClass; + ListTextBoxes.Add(CurrentTextBox); + + PanelForColor.Location = new System.Drawing.Point(5, CurrentTextBox.Location.Y+5); + + } + this.Controls.AddRange(ListPanelColor.ToArray()); + this.Controls.AddRange(ListTextBoxes.ToArray()); + } + + void CurrentTextBox_TextChanged(object sender, EventArgs e) + { + int Idx = (int)(((System.Windows.Forms.TextBox)sender).Tag); + GlobalInfo.ListWellClasses[Idx].Name = ((System.Windows.Forms.TextBox)sender).Text; + } + + void MouseDoubleClick(object sender, EventArgs e) + { + int Idx = (int)(((System.Windows.Forms.Panel)sender).Tag); + ColorDialog colorDialog = new ColorDialog(); + if (colorDialog.ShowDialog() != DialogResult.OK) return; + Color backgroundColor = colorDialog.Color; + ListPanelColor[Idx].BackColor = backgroundColor; + + GlobalInfo.ListWellClasses[Idx].ColourForDisplay = backgroundColor; + } + + + } +} diff --git a/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassSelection.cs b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassSelection.cs new file mode 100644 index 0000000..ad3483d --- /dev/null +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForClassSelection.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using HCSAnalyzer.Classes; +using System.Windows.Forms; +using HCSAnalyzer.Classes.Base_Classes.GUI; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + class PanelForClassSelection : System.Windows.Forms.Panel + { + public List ListCheckBoxes; + public List ListRadioButtons; + + + + public PanelForClassSelection(cGlobalInfo GlobalInfo, bool IsCheckBoxes, eClassType ClassType) + { + int NumClass = GlobalInfo.GetNumberofDefinedWellClass(); + if (ClassType == eClassType.PHENOTYPE) + NumClass = GlobalInfo.GetNumberofDefinedCellularPhenotypes(); + + this.AutoScroll = true; + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + + + if (IsCheckBoxes) + ListCheckBoxes = new List(); + else + ListRadioButtons = new List(); + + for (int IdxClass = 0; IdxClass < NumClass; IdxClass++) + { + System.Windows.Forms.Panel PanelForColor = new System.Windows.Forms.Panel(); + PanelForColor.Width = 13; + PanelForColor.Height = 13; + if (ClassType == eClassType.WELL) + PanelForColor.BackColor = GlobalInfo.ListWellClasses[IdxClass].ColourForDisplay; + else if (ClassType == eClassType.PHENOTYPE) + PanelForColor.BackColor = GlobalInfo.ListCellularPhenotypes[IdxClass].ColourForDisplay; + + PanelForColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + PanelForColor.Location = new System.Drawing.Point(5, PanelForColor.Height * IdxClass); + PanelForColor.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + + if (IsCheckBoxes) + { + System.Windows.Forms.CheckBox CurrentCheckBox = new System.Windows.Forms.CheckBox(); + if (ClassType == eClassType.WELL) + CurrentCheckBox.Text = GlobalInfo.ListWellClasses[IdxClass].Name; + else if (ClassType == eClassType.PHENOTYPE) + CurrentCheckBox.Text = GlobalInfo.ListCellularPhenotypes[IdxClass].Name; + + CurrentCheckBox.Location = new System.Drawing.Point(PanelForColor.Width + 15, CurrentCheckBox.Height * IdxClass); + CurrentCheckBox.Checked = true; + CurrentCheckBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + ListCheckBoxes.Add(CurrentCheckBox); + PanelForColor.Location = new System.Drawing.Point(5, CurrentCheckBox.Location.Y + 5); + } + else + { + System.Windows.Forms.RadioButton CurrentRadioButton = new System.Windows.Forms.RadioButton(); + CurrentRadioButton.Text = GlobalInfo.ListWellClasses[IdxClass].Name; + CurrentRadioButton.Location = new System.Drawing.Point(PanelForColor.Width + 15, CurrentRadioButton.Height * IdxClass); + CurrentRadioButton.Checked = false; + CurrentRadioButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + ListRadioButtons.Add(CurrentRadioButton); + PanelForColor.Location = new System.Drawing.Point(5, CurrentRadioButton.Location.Y + 5); + } + this.Controls.Add(PanelForColor); + } + + if (IsCheckBoxes) + this.Controls.AddRange(ListCheckBoxes.ToArray()); + else + this.Controls.AddRange(ListRadioButtons.ToArray()); + + } + + + private void PanelForClassSelection_MouseDown(object sender, MouseEventArgs e) + { + if ((e.Button != System.Windows.Forms.MouseButtons.Right)||(this.ListRadioButtons!=null)) return; + + ContextMenuStrip contextMenuStripPicker = new ContextMenuStrip(); + + ToolStripMenuItem SelectItem = new ToolStripMenuItem("Select all"); + SelectItem.Click += new System.EventHandler(this.SelectItem); + contextMenuStripPicker.Items.Add(SelectItem); + + ToolStripMenuItem UnselectItem = new ToolStripMenuItem("Unselect all"); + UnselectItem.Click += new System.EventHandler(this.UnselectItem); + contextMenuStripPicker.Items.Add(UnselectItem); + + contextMenuStripPicker.Show(System.Windows.Forms.Control.MousePosition); + //ToolStripMenuItem SelectAllItem = new ToolStripMenuItem("Select all"); + //SelectAllItem.Click += new System.EventHandler(this.SelectAllItem); + //contextMenuStripActorPicker.Items.Add(SelectAllItem); + } + + public List GetListIndexSelectedClass() + { + List SelectedClass = new List(); + int Idx = 0; + foreach (var item in this.ListCheckBoxes) + { + if (item.Checked) + SelectedClass.Add(Idx); + Idx++; + } + return SelectedClass; + } + + public List GetListSelectedClass() + { + List SelectedClass = new List(); + + if (this.ListCheckBoxes != null) + { + foreach (var item in this.ListCheckBoxes) + { + if (item.Checked) + SelectedClass.Add(true); + else + SelectedClass.Add(false); + } + } + else + { + foreach (var item in this.ListRadioButtons) + { + if (item.Checked) + SelectedClass.Add(true); + else + SelectedClass.Add(false); + } + + } + return SelectedClass; + } + + public void UnSelectAll() + { + if (this.ListCheckBoxes != null) + { + + foreach (var item in this.ListCheckBoxes) + item.Checked = false; + } + } + + public void SelectAll() + { + foreach (var item in this.ListCheckBoxes) + item.Checked = true; + } + + public void Select(int SelectedIdx) + { + int Idx = 0; + + if (this.ListCheckBoxes != null) + { + foreach (var item in this.ListCheckBoxes) + { + if (Idx == SelectedIdx) + { + item.Checked = true; + return; + } + Idx++; + } + } + else + { + foreach (var item in this.ListRadioButtons) + { + if (Idx == SelectedIdx) + { + item.Checked = true; + return; + } + Idx++; + } + + } + } + + void UnselectItem(object sender, EventArgs e) + { + UnSelectAll(); + } + + void SelectItem(object sender, EventArgs e) + { + foreach (var item in this.ListCheckBoxes) + item.Checked = true; + } + + } +} diff --git a/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForPhenotypeEditing.cs b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForPhenotypeEditing.cs new file mode 100644 index 0000000..5461ad2 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/PanelForPhenotypeEditing.cs @@ -0,0 +1,74 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using HCSAnalyzer.Classes; +using System.Windows.Forms; +using System.Drawing; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + class PanelForPhenotypeEditing : System.Windows.Forms.Panel + { + List ListTextBoxes; + List ListPanelColor; + cGlobalInfo GlobalInfo; + + public PanelForPhenotypeEditing(cGlobalInfo GlobalInfo) + { + this.GlobalInfo = GlobalInfo; + int NumClass = GlobalInfo.GetNumberofDefinedCellularPhenotypes(); + this.Height = GlobalInfo.OptionsWindow.panelForWellClasses.Height; + this.AutoScroll = true; + //this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PanelForClassSelection_MouseDown); + ListTextBoxes = new List(); + ListPanelColor = new List(); + + for (int IdxClass = 0; IdxClass < NumClass; IdxClass++) + { + System.Windows.Forms.Panel PanelForColor = new System.Windows.Forms.Panel(); + PanelForColor.Width = 13; + PanelForColor.Height = 13; + PanelForColor.BackColor = GlobalInfo.ListCellularPhenotypes[IdxClass].ColourForDisplay; + PanelForColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + PanelForColor.Location = new System.Drawing.Point(5, PanelForColor.Height * IdxClass-2); + PanelForColor.Tag = IdxClass; + PanelForColor.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.MouseDoubleClick); + ListPanelColor.Add(PanelForColor); + + System.Windows.Forms.TextBox CurrentTextBox = new System.Windows.Forms.TextBox(); + CurrentTextBox.Text = "Phenotype " + IdxClass; + CurrentTextBox.Location = new System.Drawing.Point(PanelForColor.Width+15, (CurrentTextBox.Height+5) * IdxClass); + CurrentTextBox.TextChanged += new EventHandler(CurrentTextBox_TextChanged); + CurrentTextBox.Tag = IdxClass; + ListTextBoxes.Add(CurrentTextBox); + + PanelForColor.Location = new System.Drawing.Point(5, CurrentTextBox.Location.Y+5); + + } + this.Controls.AddRange(ListPanelColor.ToArray()); + this.Controls.AddRange(ListTextBoxes.ToArray()); + } + + void CurrentTextBox_TextChanged(object sender, EventArgs e) + { + int Idx = (int)(((System.Windows.Forms.TextBox)sender).Tag); + GlobalInfo.ListCellularPhenotypes[Idx].Name = ((System.Windows.Forms.TextBox)sender).Text; + } + + void MouseDoubleClick(object sender, EventArgs e) + { + int Idx = (int)(((System.Windows.Forms.Panel)sender).Tag); + ColorDialog colorDialog = new ColorDialog(); + if (colorDialog.ShowDialog() != DialogResult.OK) return; + Color backgroundColor = colorDialog.Color; + ListPanelColor[Idx].BackColor = backgroundColor; + + GlobalInfo.ListCellularPhenotypes[Idx].ColourForDisplay = backgroundColor; + } + + + } +} diff --git a/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.Designer.cs b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.Designer.cs new file mode 100644 index 0000000..392f397 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.Designer.cs @@ -0,0 +1,60 @@ +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection +{ + partial class UserControlForSingleClass + { + /// + /// 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.checkBox1 = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(69, 20); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(80, 17); + this.checkBox1.TabIndex = 0; + this.checkBox1.Text = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // UserControlForSingleClass + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.checkBox1); + this.Name = "UserControlForSingleClass"; + this.Size = new System.Drawing.Size(170, 150); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox checkBox1; + } +} diff --git a/Forms/3D/FormFor3DVizuOptions.cs b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.cs similarity index 57% rename from Forms/3D/FormFor3DVizuOptions.cs rename to GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.cs index 6bab49b..1d68f10 100644 --- a/Forms/3D/FormFor3DVizuOptions.cs +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.cs @@ -1,25 +1,19 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; +using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; -namespace HCSAnalyzer.Forms._3D +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection { - public partial class FormFor3DVizuOptions : Form + public partial class UserControlForSingleClass : UserControl { - - // public FormFor3DDataDisplay Parent = null; - - - public FormFor3DVizuOptions() + public UserControlForSingleClass() { InitializeComponent(); - } - } } diff --git a/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.resx b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/ForClassSelection/UserControlForSingleClass.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/Forms/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs b/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs similarity index 83% rename from Forms/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs rename to GUI/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs index 6fa07f0..ec788d5 100644 --- a/Forms/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs +++ b/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.Designer.cs @@ -36,15 +36,17 @@ private void InitializeComponent() this.numericUpDownMarkerSize = new System.Windows.Forms.NumericUpDown(); this.numericUpDownMax = new System.Windows.Forms.NumericUpDown(); this.numericUpDownMin = new System.Windows.Forms.NumericUpDown(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarkerSize)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMax)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMin)).BeginInit(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(36, 24); + this.label1.Location = new System.Drawing.Point(22, 22); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(48, 13); this.label1.TabIndex = 0; @@ -53,7 +55,7 @@ private void InitializeComponent() // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(36, 68); + this.label2.Location = new System.Drawing.Point(22, 54); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(51, 13); this.label2.TabIndex = 0; @@ -62,7 +64,7 @@ private void InitializeComponent() // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(36, 113); + this.label3.Location = new System.Drawing.Point(23, 114); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(63, 13); this.label3.TabIndex = 0; @@ -71,7 +73,7 @@ private void InitializeComponent() // buttonOK // this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Location = new System.Drawing.Point(69, 165); + this.buttonOK.Location = new System.Drawing.Point(35, 148); this.buttonOK.Name = "buttonOK"; this.buttonOK.Size = new System.Drawing.Size(146, 25); this.buttonOK.TabIndex = 1; @@ -81,7 +83,7 @@ private void InitializeComponent() // // numericUpDownMarkerSize // - this.numericUpDownMarkerSize.Location = new System.Drawing.Point(128, 111); + this.numericUpDownMarkerSize.Location = new System.Drawing.Point(95, 112); this.numericUpDownMarkerSize.Maximum = new decimal(new int[] { 100000000, 0, @@ -99,7 +101,7 @@ private void InitializeComponent() // numericUpDownMax // this.numericUpDownMax.DecimalPlaces = 3; - this.numericUpDownMax.Location = new System.Drawing.Point(128, 66); + this.numericUpDownMax.Location = new System.Drawing.Point(80, 52); this.numericUpDownMax.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -122,7 +124,7 @@ private void InitializeComponent() // numericUpDownMin // this.numericUpDownMin.DecimalPlaces = 3; - this.numericUpDownMin.Location = new System.Drawing.Point(128, 22); + this.numericUpDownMin.Location = new System.Drawing.Point(80, 20); this.numericUpDownMin.Maximum = new decimal(new int[] { -1304428544, 434162106, @@ -142,18 +144,28 @@ private void InitializeComponent() 0, 0}); // + // groupBox1 + // + this.groupBox1.Controls.Add(this.numericUpDownMin); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.numericUpDownMax); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Location = new System.Drawing.Point(8, 9); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(200, 85); + this.groupBox1.TabIndex = 4; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Y axis"; + // // FormForMaxMinRequest // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(285, 202); - this.Controls.Add(this.numericUpDownMin); - this.Controls.Add(this.numericUpDownMax); + this.ClientSize = new System.Drawing.Size(216, 183); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.numericUpDownMarkerSize); this.Controls.Add(this.buttonOK); this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormForMaxMinRequest"; @@ -161,6 +173,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMarkerSize)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMax)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownMin)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -170,10 +184,11 @@ private void InitializeComponent() private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; private System.Windows.Forms.Button buttonOK; public System.Windows.Forms.NumericUpDown numericUpDownMarkerSize; public System.Windows.Forms.NumericUpDown numericUpDownMax; public System.Windows.Forms.NumericUpDown numericUpDownMin; + private System.Windows.Forms.GroupBox groupBox1; + public System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormForMaxMinRequest.cs b/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForMaxMinRequest.cs rename to GUI/FormsForGraphsDisplay/FormForMaxMinRequest.cs diff --git a/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.resx b/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/FormForMaxMinRequest.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormForPie.Designer.cs b/GUI/FormsForGraphsDisplay/FormForPie.Designer.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForPie.Designer.cs rename to GUI/FormsForGraphsDisplay/FormForPie.Designer.cs diff --git a/Forms/FormsForGraphsDisplay/FormForPie.cs b/GUI/FormsForGraphsDisplay/FormForPie.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormForPie.cs rename to GUI/FormsForGraphsDisplay/FormForPie.cs diff --git a/GUI/FormsForGraphsDisplay/FormForPie.resx b/GUI/FormsForGraphsDisplay/FormForPie.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/FormForPie.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayScreening.Designer.cs b/GUI/FormsForGraphsDisplay/FormToDisplayScreening.Designer.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormToDisplayScreening.Designer.cs rename to GUI/FormsForGraphsDisplay/FormToDisplayScreening.Designer.cs diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayScreening.cs b/GUI/FormsForGraphsDisplay/FormToDisplayScreening.cs similarity index 81% rename from Forms/FormsForGraphsDisplay/FormToDisplayScreening.cs rename to GUI/FormsForGraphsDisplay/FormToDisplayScreening.cs index b859a2b..dc5abe7 100644 --- a/Forms/FormsForGraphsDisplay/FormToDisplayScreening.cs +++ b/GUI/FormsForGraphsDisplay/FormToDisplayScreening.cs @@ -10,17 +10,15 @@ using HCSAnalyzer.Classes; using System.IO; using HCSAnalyzer.Forms.FormsForOptions; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer.Controls { - - - public abstract partial class cWindowToDisplayGeneralArray : Form { protected List PanelList; public int CellSize = 5; - private int Gutter = 10; + private int Gutter = 25; protected int XNumber; public cWindowToDisplayGeneralArray(cPanelForDisplayArray[][] ListPanel) @@ -38,7 +36,7 @@ public cWindowToDisplayGeneralArray(cPanelForDisplayArray SimplePanel) public void RefreshDisplay(bool IsOnlyColors) { - // System.Drawing.Graphics formGraphics = this.panelForPlates.CreateGraphics(); + // System.Drawing.Graphics formGraphics = this.panelForPlates.CreateGraphics(); if (!IsOnlyColors) this.panelForPlates.Controls.Clear(); //int XNumber = this.panelForPlates.Width / (PanelList[0].Width + Gutter); @@ -49,10 +47,21 @@ public void RefreshDisplay(bool IsOnlyColors) PanelList[i].SetNewCellSize(this.CellSize); PanelList[i].Location = new Point(i % XNumber * (PanelList[i].Width + Gutter) + Gutter / 2, (i / XNumber) * (PanelList[i].Height + Gutter) + Gutter / 2); + if (!IsOnlyColors) this.panelForPlates.Controls.Add(PanelList[i]); - //if (i > 0) formGraphics.DrawLine(new Pen(Color.Tomato), - // new Point(PanelList[i - 1].Location.X+PanelList[i - 1].Width/2, PanelList[i - 1].Location.Y+PanelList[i - 1].Height/2), - // new Point(PanelList[i].Location.X+PanelList[i].Width/2, PanelList[i].Location.Y+PanelList[i].Height/2)); + + if (PanelList[i].Tag != null) + { + cPlate CurrentPlate = (cPlate)PanelList[i].Tag; + Label TextToAdd = new Label(); + TextBox TB = new TextBox(); + TB.Text = CurrentPlate.Name; + TB.ReadOnly = true; + TB.Location = new Point(PanelList[i].Location.X, PanelList[i].Location.Y + PanelList[i].Height); + TB.Width = PanelList[i].Width; + this.panelForPlates.Controls.Add(TB); + } + } } @@ -137,9 +146,9 @@ private void buttonOk_Click(object sender, EventArgs e) PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Add(PanelList[0].CurrentScreening.ListPlatesActive[i].Name); } PanelList[0].CurrentScreening.CurrentDisplayPlateIdx = 0; - PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = 0; + PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = 0; - PanelList[0].CurrentScreening.GetCurrentDisplayPlate().DisplayDistribution(PanelList[0].CurrentScreening.ListDescriptors.CurrentSelectedDescriptor, false); + PanelList[0].CurrentScreening.GetCurrentDisplayPlate().DisplayDistribution(PanelList[0].CurrentScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); this.Dispose(); } @@ -147,15 +156,15 @@ private void buttonOk_Click(object sender, EventArgs e) private void displayToolStripMenuItem_Click(object sender, EventArgs e) { FormForFullScreeningViewOptions WindowForVizuOptions = new FormForFullScreeningViewOptions(); - - if(PanelList.Count>this.XNumber) + + if (PanelList.Count > this.XNumber) WindowForVizuOptions.numericUpDownHorizontalPlateNumbers.Maximum = PanelList.Count; else WindowForVizuOptions.numericUpDownHorizontalPlateNumbers.Maximum = this.XNumber; - // if(this.XNumber>=Win + // if(this.XNumber>=Win WindowForVizuOptions.numericUpDownHorizontalPlateNumbers.Value = (decimal)this.XNumber; - if(WindowForVizuOptions.ShowDialog()!= System.Windows.Forms.DialogResult.OK) return; + if (WindowForVizuOptions.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; this.XNumber = (int)WindowForVizuOptions.numericUpDownHorizontalPlateNumbers.Value; RefreshDisplay(false); @@ -164,8 +173,11 @@ private void displayToolStripMenuItem_Click(object sender, EventArgs e) public class cWindowToDisplayEntireScreening : cWindowToDisplayGeneralArray { - public cWindowToDisplayEntireScreening(List PanelList, string Text, int XNumber) + cGlobalInfo GlobalInfo; + + public cWindowToDisplayEntireScreening(List PanelList, string Text, int XNumber, cGlobalInfo GlobalInfo) { + this.GlobalInfo = GlobalInfo; this.XNumber = XNumber; this.Text += " : " + Text; cExtendedList GlobalValues = new cExtendedList(); @@ -185,11 +197,11 @@ public cWindowToDisplayEntireScreening(List PanelList, st PanelList[i].GlobalMin = Min_; PanelList[i].GlobalMax = Max_; PanelList[i].ParentWindow = this; - } this.PanelList = PanelList; this.comboBoxDistances.Visible = false; + RefreshDisplay(false); this.Show(); } @@ -204,11 +216,14 @@ public void RemovePlate(cPlate PlateToRemove) RefreshDisplay(false); break; } - } + } - + public void PerformScreeningClustering(List PlatesToCluster) + { + this.GlobalInfo.WindowHCSAnalyzer.PerformScreeningClustering(PlatesToCluster, false); + RefreshDisplay(false); } } @@ -235,7 +250,6 @@ public cWindowToDisplayEntireDescriptors(List PanelList, PanelList[i].GlobalMin = Min_; PanelList[i].GlobalMax = Max_; PanelList[i].ParentWindow = this; - } this.PanelList = PanelList; @@ -243,18 +257,15 @@ public cWindowToDisplayEntireDescriptors(List PanelList, RefreshDisplay(false); this.Show(); } - - } - public class cWindowToDisplaySingleMatrix : cWindowToDisplayGeneralArray { public cWindowToDisplaySingleMatrix(cPanelForDisplayArray PanelToDisplay, eDistances Dist) { //this.CellSize = SizeSquare; this.Text = "Distance Matrix ( " + Dist.ToString() + ")"; - + this.XNumber = 1; this.checkBoxDisplayClasses.Visible = false; @@ -283,8 +294,6 @@ public cWindowToDisplaySingleMatrix(cPanelForDisplayArray PanelToDisplay, eDista } } - - public abstract partial class cPanelForDisplayArray : Panel { public cScreening CurrentScreening; @@ -292,7 +301,8 @@ public abstract partial class cPanelForDisplayArray : Panel public cPlate AssociatedPlate = null; protected byte[][] LUT; public cWindowToDisplayGeneralArray ParentWindow; - + + public cExtendedList GetListValues() { if (ValuesMatrix == null) return null; @@ -330,7 +340,8 @@ public void SetNewCellSize(int NewSize) public cPanelForDisplayArray() { this.Paint += new System.Windows.Forms.PaintEventHandler(this.cPanelForDisplayArray_Paint); - + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + //this.Tag = this.DoubleBuffered = false; } @@ -356,6 +367,11 @@ public cPanelForDisplayArray(double[][] Values, cScreening CurrentScreening) DisplayMatrix(); + + + + + } private void cPanelForDisplayArray_Paint(object sender, PaintEventArgs e) @@ -372,7 +388,7 @@ protected void DisplayMatrix() { int PosXMatrix = 0; int PosYMatrix = 0; - // Color BorderColor = Color.BlueViolet; + // Color BorderColor = Color.BlueViolet; Color CenterColor = Color.Transparent; int NumCol = ValuesMatrix.Length; @@ -380,7 +396,7 @@ protected void DisplayMatrix() double[,] MatrixToDisplay = new double[NumCol, NumRow]; System.Drawing.Graphics formGraphics = this.CreateGraphics(); - // this.BackColor = Color.Tomato; + // this.BackColor = Color.Tomato; if ((this.IsDisplayClasses == false)) { double LocalMin = Min; @@ -392,12 +408,12 @@ protected void DisplayMatrix() LocalMax = GlobalMax; } - - // MemoryStream ms = new MemoryStream(BitmapData); - Bitmap BMP = new Bitmap(ValuesMatrix[0].Length*CellSize+ PosXMatrix , ValuesMatrix.Length*CellSize+PosYMatrix); + // MemoryStream ms = new MemoryStream(BitmapData); + + Bitmap BMP = new Bitmap(ValuesMatrix[0].Length * CellSize + PosXMatrix, ValuesMatrix.Length * CellSize + PosYMatrix); for (int j = 0; j < ValuesMatrix.Length; j++) for (int i = 0; i < ValuesMatrix[0].Length; i++) @@ -415,13 +431,13 @@ protected void DisplayMatrix() } continue; } - // continue; + // continue; int ConvertedValue1 = 0; - if(LocalMax!=LocalMin) - ConvertedValue1 = (int)(((ValuesMatrix[j][i] - LocalMin) * (LUT[0].Length - 1)) / (LocalMax - LocalMin)); + if (LocalMax != LocalMin) + ConvertedValue1 = (int)(((ValuesMatrix[j][i] - LocalMin) * (LUT[0].Length - 1)) / (LocalMax - LocalMin)); CenterColor = Color.FromArgb(LUT[0][ConvertedValue1], LUT[1][ConvertedValue1], LUT[2][ConvertedValue1]); - for(int k=0;k Max) Max = ValuesMatrix[j][i]; @@ -551,7 +576,7 @@ public FormToDisplayPlate(cPlate PlateToDisplay, cScreening CompleteScreening) this.SetNewCellSize(5); //DisplayMatrix(); - // this.Update(); + // this.Update(); } @@ -560,15 +585,32 @@ private void FormToDisplayPlate_MouseClick(object sender, MouseEventArgs e) if (e.Button == MouseButtons.Right) { ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); + ToolStripMenuItem ToolStripMenuItem_RemovePlate = new ToolStripMenuItem("Remove Plate"); - //ToolStripSeparator ToolStripSep = new ToolStripSeparator(); - contextMenuStrip.Items.AddRange(new ToolStripItem[] { ToolStripMenuItem_RemovePlate }); - contextMenuStrip.Show(Control.MousePosition); ToolStripMenuItem_RemovePlate.Click += new System.EventHandler(this.RemovePlate); + contextMenuStrip.Items.Add(ToolStripMenuItem_RemovePlate); + + ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + contextMenuStrip.Items.Add(ToolStripSep); + + ToolStripMenuItem ToolStripMenuItem_ClusterPlate = new ToolStripMenuItem("Clustering"); + ToolStripMenuItem_ClusterPlate.Click += new System.EventHandler(this.ClusterPlate); + contextMenuStrip.Items.Add(ToolStripMenuItem_ClusterPlate); + + contextMenuStrip.Show(Control.MousePosition); + } } - private void FormToDisplayPlate_MouseDoubleClick(object sender, MouseEventArgs e) + private void ClusterPlate(object sender, EventArgs e) + { + List ListPlate = new List(); + ListPlate.Add(this.PlateToDisplay); + + ((cWindowToDisplayEntireScreening)ParentWindow).PerformScreeningClustering(ListPlate); + } + + private void FormToDisplayPlate_MouseDoubleClick(object sender, MouseEventArgs e) { for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Count; Idx++) { @@ -587,16 +629,14 @@ private void RemovePlate(object sender, EventArgs e) //WindowToDisplayEntireScreening.RemovePlate(this.PlateToDisplay); } - - - } + } public partial class FormToDisplayDescriptorPlate : cPanelForDisplayArray { cScreening CompleteScreening; - // public cWindowToDisplayEntireScreening WindowToDisplayEntireScreening; + // public cWindowToDisplayEntireScreening WindowToDisplayEntireScreening; cPlate PlateToDisplay; int IdxDesc; @@ -640,12 +680,11 @@ public FormToDisplayDescriptorPlate(cPlate PlateToDisplay, cScreening CompleteSc private void FormToDisplayDescriptorPlate_MouseClick(object sender, EventArgs e) { PlateToDisplay.DisplayHistogram(IdxDesc); - + } } - public partial class FormToDisplayDistanceMap : cPanelForDisplayArray { public void RecomputeDistances(eDistances Dist) @@ -658,7 +697,7 @@ public void RecomputeDistances(eDistances Dist) cWell DestinationWell = this.AssociatedPlate.ListActiveWells[i]; ValuesMatrix[i][j] = ValuesMatrix[j][i] = SourceWell.DistanceTo(DestinationWell, Dist); - // CurrentScreening.ListDescriptors[0].IsActive + // CurrentScreening.ListDescriptors[0].IsActive } } @@ -696,17 +735,17 @@ private void CopyToClipBoard(object sender, EventArgs e) StringBuilder sb = new StringBuilder(); for (int j = 0; j < ValuesMatrix.Length; j++) - { - for (int i = 0; i < ValuesMatrix[0].Length; i++) - sb.Append(ValuesMatrix[j][i].ToString()+"\t"); + { + for (int i = 0; i < ValuesMatrix[0].Length; i++) + sb.Append(ValuesMatrix[j][i].ToString() + "\t"); + + sb.AppendLine(); + } - sb.AppendLine(); - } - Clipboard.SetText(sb.ToString()); } - + public FormToDisplayDistanceMap(cPlate CurrentPlate, cScreening CompleteScreening) { diff --git a/Forms/FormsForGraphsDisplay/FormToDisplayScreening.resx b/GUI/FormsForGraphsDisplay/FormToDisplayScreening.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/FormToDisplayScreening.resx rename to GUI/FormsForGraphsDisplay/FormToDisplayScreening.resx diff --git a/Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.Designer.cs b/GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.Designer.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.Designer.cs rename to GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.Designer.cs diff --git a/Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.cs b/GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/FormToDisplaySimpleTable.cs rename to GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.cs diff --git a/GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.resx b/GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/FormToDisplaySimpleTable.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/SimpleForm.Designer.cs b/GUI/FormsForGraphsDisplay/SimpleForm.Designer.cs similarity index 95% rename from Forms/FormsForGraphsDisplay/SimpleForm.Designer.cs rename to GUI/FormsForGraphsDisplay/SimpleForm.Designer.cs index 1c3e488..b56ca2f 100644 --- a/Forms/FormsForGraphsDisplay/SimpleForm.Designer.cs +++ b/GUI/FormsForGraphsDisplay/SimpleForm.Designer.cs @@ -45,9 +45,9 @@ private void InitializeComponent() // // chartForSimpleForm // - this.chartForSimpleForm.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.chartForSimpleForm.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.chartForSimpleForm.Location = new System.Drawing.Point(12, 38); this.chartForSimpleForm.Name = "chartForSimpleForm"; this.chartForSimpleForm.Size = new System.Drawing.Size(966, 446); @@ -118,8 +118,8 @@ private void InitializeComponent() // dataToolStripMenuItem // this.dataToolStripMenuItem.Name = "dataToolStripMenuItem"; - this.dataToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.C))); + this.dataToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); this.dataToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.dataToolStripMenuItem.Text = "Data"; this.dataToolStripMenuItem.Click += new System.EventHandler(this.dataToolStripMenuItem_Click); @@ -129,7 +129,6 @@ private void InitializeComponent() this.parametersToolStripMenuItem.Name = "parametersToolStripMenuItem"; this.parametersToolStripMenuItem.Size = new System.Drawing.Size(78, 20); this.parametersToolStripMenuItem.Text = "Parameters"; - this.parametersToolStripMenuItem.Click += new System.EventHandler(this.parametersToolStripMenuItem_Click); // // SimpleForm // @@ -160,6 +159,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem saveToFileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem DisplayParamaters; - private System.Windows.Forms.ToolStripMenuItem parametersToolStripMenuItem; + protected System.Windows.Forms.ToolStripMenuItem parametersToolStripMenuItem; } } \ No newline at end of file diff --git a/Forms/FormsForGraphsDisplay/SimpleForm.cs b/GUI/FormsForGraphsDisplay/SimpleForm.cs similarity index 77% rename from Forms/FormsForGraphsDisplay/SimpleForm.cs rename to GUI/FormsForGraphsDisplay/SimpleForm.cs index 543325a..2d462a6 100644 --- a/Forms/FormsForGraphsDisplay/SimpleForm.cs +++ b/GUI/FormsForGraphsDisplay/SimpleForm.cs @@ -12,11 +12,13 @@ namespace LibPlateAnalysis { - public partial class SimpleForm : Form + public /*abstract*/ partial class SimpleForm : Form { - FormForMaxMinRequest RequestWindow = new FormForMaxMinRequest(); - cScreening CompleteScreening = null; + protected FormForMaxMinRequest RequestWindow = new FormForMaxMinRequest(); + + + static DataPoint PtToTransfer; public SimpleForm(cScreening CompleteScreening) { @@ -24,12 +26,11 @@ public SimpleForm(cScreening CompleteScreening) this.CompleteScreening = CompleteScreening; } - public SimpleForm() { InitializeComponent(); - } + private void saveGraphToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog CurrSaveFileDialog = new SaveFileDialog(); @@ -116,60 +117,55 @@ private void printToolStripMenuItem_Click(object sender, EventArgs e) this.chartForSimpleForm.Printing.Print(false); } - - - static DataPoint PtToTransfer; void ChangeClass(object sender, EventArgs e) { cWell WellToTransfer = (cWell)(PtToTransfer.Tag); if (WellToTransfer == null) return; WellToTransfer.SetClass(int.Parse(sender.ToString().Remove(0, 6))); WellToTransfer.AssociatedPlate.UpdateNumberOfClass(); - PtToTransfer.Color = WellToTransfer.GetColor(); + PtToTransfer.Color = WellToTransfer.GetClassColor(); } - - - - private void parametersToolStripMenuItem_Click(object sender, EventArgs e) + private void chartForSimpleForm_MouseClick_1(object sender, MouseEventArgs e) { - if (this.chartForSimpleForm.Series[0].Points.Count >= 1) - RequestWindow.numericUpDownMarkerSize.Value = (decimal)this.chartForSimpleForm.Series[0].Points[0].MarkerSize; - + //if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; + //HitTestResult Res = this.chartForSimpleForm.HitTest(e.X, e.Y, ChartElementType.DataPoint); + //if (Res.Series == null) return; - RequestWindow.numericUpDownMax.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum; - RequestWindow.numericUpDownMin.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum; + //ContextMenuStrip contextMenuStripActorPicker = new ContextMenuStrip(); + //for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedClass(); i++) + //{ + // ToolStripItem ChangeClassItem = new ToolStripMenuItem("Class " + i); + // ChangeClassItem.Click += new System.EventHandler(this.ChangeClass); + // contextMenuStripActorPicker.Items.Add(ChangeClassItem); + //} - if (RequestWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + //if ((Res.Series.Points[Res.PointIndex].Tag == null) || (Res.Series.Points[Res.PointIndex].Tag.GetType().Name.ToString() != "cWell")) return; + //PtToTransfer = Res.Series.Points[Res.PointIndex]; + //contextMenuStripActorPicker.Show(Control.MousePosition); - if (RequestWindow.numericUpDownMax.Value <= RequestWindow.numericUpDownMin.Value) return; + //if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; - this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum = (double)RequestWindow.numericUpDownMax.Value; - this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum = (double)RequestWindow.numericUpDownMin.Value; - foreach (DataPoint Pt in this.chartForSimpleForm.Series[0].Points) - { - Pt.MarkerSize = (int)RequestWindow.numericUpDownMarkerSize.Value; - - } - } - - private void chartForSimpleForm_MouseClick_1(object sender, MouseEventArgs e) - { - if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; HitTestResult Res = this.chartForSimpleForm.HitTest(e.X, e.Y, ChartElementType.DataPoint); if (Res.Series == null) return; - ContextMenuStrip contextMenuStripActorPicker = new ContextMenuStrip(); - for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedClass(); i++) + PtToTransfer = Res.Series.Points[Res.PointIndex]; + cWell WellToTransfer = (cWell)(PtToTransfer.Tag); + if (WellToTransfer == null) return; + + List ListNewItemForClass = new List(); + for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedWellClass(); i++) { ToolStripItem ChangeClassItem = new ToolStripMenuItem("Class " + i); + if (i == WellToTransfer.GetClassIdx()) ChangeClassItem.ForeColor = Color.Gray; ChangeClassItem.Click += new System.EventHandler(this.ChangeClass); - contextMenuStripActorPicker.Items.Add(ChangeClassItem); + ListNewItemForClass.Add(ChangeClassItem); } + if (Res.Series.Points[Res.PointIndex].Tag.GetType().Name.ToString() != "cWell") return; + + WellToTransfer.BuildAndisplaySimpleContextMenu(ListNewItemForClass.ToArray()); + - if ((Res.Series.Points[Res.PointIndex].Tag == null) || (Res.Series.Points[Res.PointIndex].Tag.GetType().Name.ToString() != "cWell")) return; - PtToTransfer = Res.Series.Points[Res.PointIndex]; - contextMenuStripActorPicker.Show(Control.MousePosition); } private void chartForSimpleForm_MouseDoubleClick_1(object sender, MouseEventArgs e) @@ -188,11 +184,12 @@ private void chartForSimpleForm_MouseDoubleClick_1(object sender, MouseEventArgs int PosPlate = CompleteScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.FindStringExact(TmpWell.AssociatedPlate.Name); CompleteScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = PosPlate; CompleteScreening.CurrentDisplayPlateIdx = PosPlate; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - TmpWell.DisplayInfoWindow(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + TmpWell.DisplayInfoWindow(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); } } + } diff --git a/Forms/FormsForGraphsDisplay/SimpleForm.resx b/GUI/FormsForGraphsDisplay/SimpleForm.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/SimpleForm.resx rename to GUI/FormsForGraphsDisplay/SimpleForm.resx diff --git a/Forms/FormsForGraphsDisplay/SimpleFormForXY.Designer.cs b/GUI/FormsForGraphsDisplay/SimpleFormForXY.Designer.cs similarity index 100% rename from Forms/FormsForGraphsDisplay/SimpleFormForXY.Designer.cs rename to GUI/FormsForGraphsDisplay/SimpleFormForXY.Designer.cs diff --git a/Forms/FormsForGraphsDisplay/SimpleFormForXY.cs b/GUI/FormsForGraphsDisplay/SimpleFormForXY.cs similarity index 91% rename from Forms/FormsForGraphsDisplay/SimpleFormForXY.cs rename to GUI/FormsForGraphsDisplay/SimpleFormForXY.cs index 59ce156..f9d2117 100644 --- a/Forms/FormsForGraphsDisplay/SimpleFormForXY.cs +++ b/GUI/FormsForGraphsDisplay/SimpleFormForXY.cs @@ -176,7 +176,7 @@ public bool DisplayXY() CurrentSeries.Points.AddXY(TempX, TempY); - CurrentSeries.Points[Idx].Color = TmpWell.GetColor(); + CurrentSeries.Points[Idx].Color = TmpWell.GetClassColor(); if (IsFullScreen) CurrentSeries.Points[Idx].ToolTip = TmpWell.AssociatedPlate.Name + "\n" + TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; @@ -251,22 +251,20 @@ private void chartForSimpleFormXY_MouseDoubleClick(object sender, MouseEventArgs int PosPlate = CompleteScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.FindStringExact(TmpWell.AssociatedPlate.Name); CompleteScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = PosPlate; CompleteScreening.CurrentDisplayPlateIdx = PosPlate; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - TmpWell.DisplayInfoWindow(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + TmpWell.DisplayInfoWindow(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); } } - - - static DataPoint PtToTransfer; + void ChangeClass(object sender, EventArgs e) { cWell WellToTransfer = (cWell)(PtToTransfer.Tag); if (WellToTransfer == null) return; WellToTransfer.SetClass(int.Parse(sender.ToString().Remove(0, 6))); WellToTransfer.AssociatedPlate.UpdateNumberOfClass(); - PtToTransfer.Color = WellToTransfer.GetColor(); + PtToTransfer.Color = WellToTransfer.GetClassColor(); } private void parametersToolStripMenuItem_Click(object sender, EventArgs e) @@ -285,33 +283,40 @@ private void parametersToolStripMenuItem_Click(object sender, EventArgs e) this.chartForSimpleFormXY.ChartAreas[0].AxisY.Maximum = (double)RequestWindow.numericUpDownMax.Value; this.chartForSimpleFormXY.ChartAreas[0].AxisY.Minimum = (double)RequestWindow.numericUpDownMin.Value; foreach (DataPoint Pt in this.chartForSimpleFormXY.Series[0].Points) - { Pt.MarkerSize = (int)RequestWindow.numericUpDownMarkerSize.Value; - - } } private void chartForSimpleFormXY_MouseClick_1(object sender, MouseEventArgs e) { - if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; + if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; + + HitTestResult Res = this.chartForSimpleFormXY.HitTest(e.X, e.Y, ChartElementType.DataPoint); + if (Res.Series == null) return; + + PtToTransfer = Res.Series.Points[Res.PointIndex]; + cWell WellToTransfer = (cWell)(PtToTransfer.Tag); + if (WellToTransfer == null) return; - ContextMenuStrip contextMenuStripActorPicker = new ContextMenuStrip(); - for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedClass(); i++) + List ListNewItemForClass = new List(); + for (int i = 0; i < CompleteScreening.GlobalInfo.GetNumberofDefinedWellClass(); i++) { ToolStripItem ChangeClassItem = new ToolStripMenuItem("Class " + i); + if (i == WellToTransfer.GetClassIdx()) ChangeClassItem.ForeColor = Color.Gray; ChangeClassItem.Click += new System.EventHandler(this.ChangeClass); - contextMenuStripActorPicker.Items.Add(ChangeClassItem); + ListNewItemForClass.Add(ChangeClassItem); } - - HitTestResult Res = this.chartForSimpleFormXY.HitTest(e.X, e.Y, ChartElementType.DataPoint); if (Res.Series.Points[Res.PointIndex].Tag.GetType().Name.ToString() != "cWell") return; - PtToTransfer = Res.Series.Points[Res.PointIndex]; - contextMenuStripActorPicker.Show(Control.MousePosition); - } - - + WellToTransfer.BuildAndisplaySimpleContextMenu(ListNewItemForClass.ToArray()); + } + void DisplayValuesChart(object sender, EventArgs e) + { + cWell WellToTransfer = (cWell)(PtToTransfer.Tag); + if (WellToTransfer == null) return; + WellToTransfer.DisplayInfoWindow(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); + } + } } diff --git a/Forms/FormsForGraphsDisplay/SimpleFormForXY.resx b/GUI/FormsForGraphsDisplay/SimpleFormForXY.resx similarity index 100% rename from Forms/FormsForGraphsDisplay/SimpleFormForXY.resx rename to GUI/FormsForGraphsDisplay/SimpleFormForXY.resx diff --git a/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.cs b/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.cs new file mode 100644 index 0000000..a349d37 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Windows.Forms.DataVisualization.Charting; +using System.Drawing; +using HCSAnalyzer.Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + class cWindowToDisplayHisto : SimpleForm + { + public ChartArea CurrentChartArea; + // double BinValue; + cScreening CompleteScreening; + cExtendedList RawValues; + Series SerieForHisto; + double BinNumber = 100; + + public cWindowToDisplayHisto(cScreening CompleteScreening0, cExtendedList RawValues0) + { + this.CompleteScreening = CompleteScreening0; + + this.parametersToolStripMenuItem.Click += new System.EventHandler(this.parametersToolStripMenuItem_Click); + + RequestWindow.label3.Text = "Bin Number"; + + this.RawValues = RawValues0; + + CurrentChartArea = new ChartArea(); + CurrentChartArea.BorderColor = Color.Black; + + this.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + if(CompleteScreening!=null) + CurrentChartArea.Axes[0].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CurrentChartArea.Axes[1].Title = "Sum"; + CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + this.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + if (CompleteScreening != null) + CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; + CurrentChartArea.BackSecondaryColor = Color.White; + + + this.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; + this.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + this.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + this.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + + if ((CompleteScreening!=null)&&(CompleteScreening.GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked)) + { + StripLine AverageLine = new StripLine(); + AverageLine.BackColor = Color.Black; + AverageLine.IntervalOffset = RawValues.Mean(); + AverageLine.StripWidth = double.Epsilon; + CurrentChartArea.AxisX.StripLines.Add(AverageLine); + AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); + + StripLine StdLine = new StripLine(); + StdLine.BackColor = Color.FromArgb(64, Color.Black); + double Std = RawValues.Std(); + StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; + StdLine.StripWidth = Std; + CurrentChartArea.AxisX.StripLines.Add(StdLine); + AverageLine.StripWidth = 0.0001; + } + + SerieForHisto = new Series(); + SerieForHisto.ShadowOffset = 1; + SerieForHisto.ChartType = SeriesChartType.Column; + if (CompleteScreening != null) + SerieForHisto.Color = CompleteScreening.GlobalInfo.ListWellClasses[1].ColourForDisplay; + + List HistoPos = RawValues.CreateHistogram(this.BinNumber); + if (HistoPos.Count == 0) return; + + for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) + { + SerieForHisto.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); + SerieForHisto.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); + if (CompleteScreening != null) + { + if (CompleteScreening.SelectedClass == -1) + SerieForHisto.Points[IdxValue].Color = Color.Black; + else + SerieForHisto.Points[IdxValue].Color = CompleteScreening.GlobalInfo.ListWellClasses[CompleteScreening.SelectedClass].ColourForDisplay; + } + } + this.chartForSimpleForm.Series.Add(SerieForHisto); + } + + + + private void parametersToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.chartForSimpleForm.Series[0].Points.Count >= 1) + RequestWindow.numericUpDownMarkerSize.Value = (decimal)this.BinNumber; + + RequestWindow.numericUpDownMax.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum; + RequestWindow.numericUpDownMin.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum; + + if (RequestWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + if (RequestWindow.numericUpDownMax.Value <= RequestWindow.numericUpDownMin.Value) return; + + this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum = (double)RequestWindow.numericUpDownMax.Value; + this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum = (double)RequestWindow.numericUpDownMin.Value; + this.BinNumber = (double)RequestWindow.numericUpDownMarkerSize.Value; + + DrawHisto(); + } + + + private void DrawHisto() + { + List HistoPos = RawValues.CreateHistogram(this.BinNumber); + if (HistoPos.Count == 0) return; + + SerieForHisto.Points.Clear(); + + for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) + { + SerieForHisto.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); + SerieForHisto.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); + if (CompleteScreening.SelectedClass == -1) + SerieForHisto.Points[IdxValue].Color = Color.Black; + else + SerieForHisto.Points[IdxValue].Color = CompleteScreening.GlobalInfo.ListWellClasses[CompleteScreening.SelectedClass].ColourForDisplay; + } + + } + + private void InitializeComponent() + { + ((System.ComponentModel.ISupportInitialize)(this.chartForSimpleForm)).BeginInit(); + this.SuspendLayout(); + // + // RequestWindow + // + this.RequestWindow.Location = new System.Drawing.Point(25, 25); + // + // cWindowToDisplayHisto + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.ClientSize = new System.Drawing.Size(990, 491); + this.Name = "cWindowToDisplayHisto"; + ((System.ComponentModel.ISupportInitialize)(this.chartForSimpleForm)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + + } +} diff --git a/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.resx b/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/GUI/FormsForGraphsDisplay/cWindowToDisplayHisto.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/GUI/FormsForGraphsDisplay/cWindowToDisplayScatter.cs b/GUI/FormsForGraphsDisplay/cWindowToDisplayScatter.cs new file mode 100644 index 0000000..f73499e --- /dev/null +++ b/GUI/FormsForGraphsDisplay/cWindowToDisplayScatter.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using LibPlateAnalysis; +using System.Windows.Forms.DataVisualization.Charting; + +namespace HCSAnalyzer.Forms.FormsForGraphsDisplay +{ + class cWindowToDisplayScatter : SimpleForm + { + + + private void parametersToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.chartForSimpleForm.Series[0].Points.Count >= 1) + RequestWindow.numericUpDownMarkerSize.Value = (decimal)this.chartForSimpleForm.Series[0].Points[0].MarkerSize; + + + RequestWindow.numericUpDownMax.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum; + RequestWindow.numericUpDownMin.Value = (decimal)this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum; + + if (RequestWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + if (RequestWindow.numericUpDownMax.Value <= RequestWindow.numericUpDownMin.Value) return; + + this.chartForSimpleForm.ChartAreas[0].AxisY.Maximum = (double)RequestWindow.numericUpDownMax.Value; + this.chartForSimpleForm.ChartAreas[0].AxisY.Minimum = (double)RequestWindow.numericUpDownMin.Value; + foreach (DataPoint Pt in this.chartForSimpleForm.Series[0].Points) + { + Pt.MarkerSize = (int)RequestWindow.numericUpDownMarkerSize.Value; + + } + } + + + } +} diff --git a/Classes/CDisplayGraph.cs b/GUI/cDisplayGraph.cs similarity index 94% rename from Classes/CDisplayGraph.cs rename to GUI/cDisplayGraph.cs index 4b22112..575ec4e 100644 --- a/Classes/CDisplayGraph.cs +++ b/GUI/cDisplayGraph.cs @@ -5,6 +5,7 @@ using LibPlateAnalysis; using System.Windows.Forms.DataVisualization.Charting; using System.Drawing; +using HCSAnalyzer.Forms.FormsForGraphsDisplay; namespace HCSAnalyzer.Classes { @@ -13,12 +14,12 @@ class cDisplayGraph public string Title = ""; - public SimpleForm NewWindow = new SimpleForm(); + public cWindowToDisplayScatter NewWindow = new cWindowToDisplayScatter(); public Series Serie; public cDisplayGraph(double[] Values, string Name) { - SimpleForm NewWindow = new SimpleForm(); + SimpleForm NewWindow = new cWindowToDisplayScatter(); NewWindow.Text = Name; Serie = new Series(); diff --git a/Classes/cDisplayTable.cs b/GUI/cDisplayTable.cs similarity index 97% rename from Classes/cDisplayTable.cs rename to GUI/cDisplayTable.cs index b14b93f..fa1f8f0 100644 --- a/Classes/cDisplayTable.cs +++ b/GUI/cDisplayTable.cs @@ -67,7 +67,6 @@ public cDisplayTable(string Title, string[] ColumnNames, List Values, if ((idxString == 2) || (idxString == 7)) { - // if (CurrentString == "") continue; int ConvertedValue = (int)((GlobalInfo.LUTs.LUT_GREEN_TO_RED[0].Length - 1) * Math.Abs(double.Parse(CurrentString))); Color Coul = Color.FromArgb(GlobalInfo.LUTs.LUT_GREEN_TO_RED[0][ConvertedValue], GlobalInfo.LUTs.LUT_GREEN_TO_RED[1][ConvertedValue], GlobalInfo.LUTs.LUT_GREEN_TO_RED[2][ConvertedValue]); diff --git a/GUI/cDisplayTable.resx b/GUI/cDisplayTable.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/GUI/cDisplayTable.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/HCS Analyzer.csproj b/HCS Analyzer.csproj index a696bb3..60c89f0 100644 --- a/HCS Analyzer.csproj +++ b/HCS Analyzer.csproj @@ -13,17 +13,17 @@ OnBuildSuccess - v4.0 + v4.5 2.0 - true - F:\NewWebSite\ + false + publish\ true - Web + Disk true Foreground 7 @@ -31,14 +31,11 @@ false false true - http://hcs-analyzer.ip-korea.org/ - http://hcs-analyzer.ip-korea.org/ HCS Analyzer - IPK true publish.htm - 3 - 1.0.4.3 + 2 + 1.2.1.2 false true true @@ -54,6 +51,7 @@ 4 AllRules.ruleset x86 + false pdbonly @@ -63,6 +61,7 @@ prompt 4 AllRules.ruleset + false true @@ -80,6 +79,7 @@ ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules false false + false bin\x86\Release\ @@ -94,6 +94,7 @@ ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets false ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false Controls\LogoType1.ico @@ -130,6 +131,7 @@ false ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules false + false bin\x64\Release\ @@ -145,6 +147,7 @@ false ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules false + false @@ -170,6 +173,9 @@ Dlls\AlgLib.dll + + ..\BioCSharp\bin\Debug\BioCSharp.dll + C:\Program Files (x86)\Microsoft Research\Scientific DataSet 1.3\DataSetViewerControls.dll @@ -272,6 +278,15 @@ Dlls\vtk32\Kitware.VTK.dll + + packages\MathNet.Numerics.2.5.0\lib\net40\MathNet.Numerics.dll + + + packages\MathNet.Numerics.2.5.0\lib\net40\MathNet.Numerics.IO.dll + + + Dlls\MIConvexHullPlugin.dll + @@ -287,11 +302,15 @@ False Dlls\MSResearchSDS\Microsoft.Research.Science.Data.dll - - Dlls\Mine\MINE.dll + + False + Dlls\MINE.dll + + Dlls\R-Stats\R.NET.dll + Dlls\SQlite\SQLite.Designer.dll @@ -305,6 +324,7 @@ + @@ -317,149 +337,483 @@ - - - - - - - - - - - - - - - - - + + Form + + + FormForModelsHistory.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + Form + + + FormForSingleSlider.cs + + + Form + + + FormForXYMinMax.cs + + + + + + + + + + + + + + Component + + + Component + + + Component + + + Component + + + Component + + + Component + + + + + + + + + + Form + + + FormForDisplay.cs + + + + + + + + + + UserControl + + + PanelForParamManual.cs + + + + + + + + + + + + + + + + + + - - + + Form - - - + + + + + Form - + + FormForClassificationInfo.cs + + Form - - - - + + FormForKernelEditor.cs + + + UserControl + + + PanelForParamKNN.cs + + + UserControl + + + PanelForParamKStar.cs + + + UserControl + + + PanelForParamNaiveBayes.cs + + + UserControl + + + PanelForParamOneR.cs + + + UserControl + + + PanelForParamPerceptron.cs + + + UserControl + + + PanelForParamRandomForest.cs + + + UserControl + + + PanelForParamRandomTree.cs + + + UserControl + + + PanelForParamSVM.cs + + + UserControl + + + PanelForParamZeroR.cs + + + Form - + + FormForClusteringInfo.cs + + + UserControl + + + PanelForParamCobWeb.cs + + + UserControl + + + PanelForParamFarthestFirst.cs + + + UserControl + + + PanelForParamHierarchical.cs + + + UserControl + + + PanelForParamKMeans.cs + + + UserControl + + + PanelForParamEM.cs + + + UserControl + + + PanelForCellularPhenotypesColor.cs + + + UserControl + + + PanelForParamJ48.cs + + + UserControl + + + PanelForWellClassesColor.cs + + + + Form + + + FormPanelForHisto.cs + + + + Form + + + FormForCellTypeRelationships.cs + + + Form + + + FormForInfoSingleCellPopInit_Simulator.cs + + + Form + + + FormForRandSpecOfVar.cs + + + Form + + + FormForVariableDef.cs + + + Form + + + FormForNewCellType.cs + + + UserControl + + + PanelForParamCellCycle.cs + + + UserControl + + + PanelForParamVelocity.cs + + + UserControl + + + PanelForTransitionMatrix.cs + + + UserControl + + + PanelForParamGeneralForCellType.cs + + + UserControl + + + PanelForParamCellPopulations.cs + + + UserControl + + + PanelForParamCellTypes.cs + + + UserControl + + + PanelForParamPlateDesign.cs + + + UserControl + + + PanelForParamGeneral.cs + + + UserControl + + + PanelForParams3D.cs + + + UserControl + + + PanelForParamWorldDimensions.cs + + + Form + + + Form + + + + + + Form + + FormFor3DDataDisplay.cs - + Form - + FormFor3DVizuOptions.cs - + Form - + FormForEMInfo.cs - + Form - + FormForHierarchical.cs - + Form - + FormForKMeansInfo.cs - - Form - - - FormForCellbyCellClassif.cs - Form FormForDescriptorInfo.cs - + Form - + AboutBox.cs - - Form - - - FormForHistogramMode.cs - Form FormForPCAAxisGeneration.cs - + Form - + FormForDRCSelection.cs - + + Form + + + Component + + + Component + + Form - + Form - - FormForMaxMinRequest.cs + + Component + + + UserControl - + + UserControlForSingleClass.cs + + Form - - FormForDRCDesign.cs + + FormForMaxMinRequest.cs - + Form - - FormForPointSize.cs + + FormForDRCDesign.cs - + Form - - FormForSingleCellsDisplay.cs + + FormForPointSize.cs - + Form - - FormSingleCellClusteringInfo.cs + + FormForSingleCellsDisplayForProcess.cs - + Form - + FormToDisplaySimpleTable.cs - + Form - - FormToDisplayTable.cs + + FormToDisplayDataTable.cs Form @@ -467,17 +821,44 @@ FormForImageDisplay.cs + + Form + + + FormForLUTManager.cs + + + UserControl + + + UserControlSingleLUT.cs + + + + Form FormForFullScreeningViewOptions.cs - + Form - - FormForCellByCellClusteringResults.cs + + FormForGlobalInfoOptions.cs + + + UserControl + + + PanelForOptions3D.cs + + + UserControl + + + PanelForPlatesandWells.cs Form @@ -485,11 +866,11 @@ FormForDoubleProgress.cs - + Form - - FormForHistogramScreen.cs + + FormForMultipleClassSelection.cs Form @@ -497,22 +878,22 @@ FormForMultivariateScreen.cs - + Form - + FormToDisplayDRC.cs - + Form - + SimpleFormForXY.cs - + Form - + FormForClassificationTree.cs @@ -527,10 +908,10 @@ FormForKeggGene.cs - + Form - + FormForPlateDimensions.cs @@ -557,16 +938,22 @@ FormForVariability.cs + + Form + + + FormForNewDescName.cs + Form FormSaveScreening.cs - + Form - + FormToDisplayScreening.cs @@ -575,7 +962,7 @@ Component - + Form @@ -590,10 +977,10 @@ FormForPathway.cs - + Form - + FormForPie.cs @@ -608,10 +995,10 @@ FormForKegg.cs - + Form - + FormClassification.cs @@ -632,10 +1019,10 @@ FormForOptionsWindow.cs - + Form - + SimpleForm.cs @@ -644,25 +1031,41 @@ FormPlatesList.cs - + Form - + Form - + Form - + FormDendogram.cs - + + + + Form - - True - True - Reference.map + + FormFor3DVisu.cs + + + Form + + + FormForSimuGenerator.cs + + + Form + + + Form + + + FormTMP.cs Form @@ -671,91 +1074,178 @@ WindowHCSAnalyzer.cs - + + FormForModelsHistory.cs + + + FormForSingleSlider.cs + + + FormForXYMinMax.cs + + + FormForDisplay.cs + + + PanelForParamManual.cs + + cDisplayTable.cs - + cImageViewer.cs - + FormFor3DDataDisplay.cs - + FormFor3DVizuOptions.cs - + FormForEMInfo.cs - + FormForHierarchical.cs - + FormForKMeansInfo.cs - - FormForCellbyCellClassif.cs - FormForDescriptorInfo.cs - + AboutBox.cs - - FormForHistogramMode.cs - FormForPCAAxisGeneration.cs - - FormForPointSize.cs + + cWindowToDisplayHisto.cs + + + UserControlForSingleClass.cs - - FormForSingleCellsDisplay.cs + + FormForPointSize.cs - - FormSingleCellClusteringInfo.cs + + FormForSingleCellsDisplayForProcess.cs - + FormToDisplaySimpleTable.cs - - FormToDisplayTable.cs + + FormToDisplayDataTable.cs FormForImageDisplay.cs + + FormForLUTManager.cs + + + UserControlSingleLUT.cs + + + FormForClassificationInfo.cs + + + FormForKernelEditor.cs + + + PanelForParamKNN.cs + + + PanelForParamKStar.cs + + + PanelForParamNaiveBayes.cs + + + PanelForParamOneR.cs + + + PanelForParamPerceptron.cs + + + PanelForParamRandomForest.cs + + + PanelForParamRandomTree.cs + + + PanelForParamSVM.cs + + + PanelForParamZeroR.cs + + + FormForClusteringInfo.cs + + + PanelForParamCobWeb.cs + + + PanelForParamFarthestFirst.cs + + + PanelForParamHierarchical.cs + + + PanelForParamKMeans.cs + + + PanelForParamEM.cs + FormForFullScreeningViewOptions.cs - - FormForCellByCellClusteringResults.cs + + FormForGlobalInfoOptions.cs + + + PanelForCellularPhenotypesColor.cs + + + PanelForOptions3D.cs + + + PanelForParamJ48.cs + + + PanelForPlatesandWells.cs + + + PanelForWellClassesColor.cs FormForDoubleProgress.cs - - FormForHistogramScreen.cs + + FormForMultipleClassSelection.cs FormForMultivariateScreen.cs - + FormForDRCSelection.cs - + FormForMaxMinRequest.cs - + FormForDRCDesign.cs - + FormToDisplayDRC.cs - + + FormPanelForHisto.cs + + SimpleFormForXY.cs - + FormForClassificationTree.cs @@ -764,7 +1254,7 @@ FormForKeggGene.cs - + FormForPlateDimensions.cs @@ -773,6 +1263,9 @@ FormForWellInformation.cs + + FormForNewDescName.cs + FormForProgress.cs @@ -782,7 +1275,7 @@ FormSaveScreening.cs - + FormToDisplayScreening.cs @@ -791,7 +1284,7 @@ FormForPathway.cs - + FormForPie.cs @@ -800,7 +1293,7 @@ FormForKegg.cs - + FormClassification.cs @@ -812,15 +1305,69 @@ FormForOptionsWindow.cs - + SimpleForm.cs FormPlatesList.cs - + FormDendogram.cs + + FormFor3DVisu.cs + + + FormForCellTypeRelationships.cs + + + FormForInfoSingleCellPopInit_Simulator.cs + + + FormForRandSpecOfVar.cs + + + PanelForParamCellCycle.cs + + + PanelForParamVelocity.cs + + + PanelForTransitionMatrix.cs + + + FormForSimuGenerator.cs + + + FormForVariableDef.cs + + + FormForNewCellType.cs + + + PanelForParamGeneralForCellType.cs + + + PanelForParamCellPopulations.cs + + + PanelForParamCellTypes.cs + + + PanelForParamPlateDesign.cs + + + PanelForParamGeneral.cs + + + PanelForParams3D.cs + + + PanelForParamWorldDimensions.cs + + + FormTMP.cs + Designer WindowHCSAnalyzer.cs @@ -836,8 +1383,7 @@ True - - + SettingsSingleFileGenerator Settings.Designer.cs @@ -847,32 +1393,6 @@ Settings.settings True - - Reference.map - - - - Reference.map - - - Reference.map - - - Reference.map - - - Reference.map - - - MSDiscoCodeGenerator - Reference.cs - - - Reference.map - - - Reference.map - @@ -897,19 +1417,6 @@ - - - Dynamic - Web References\jp.genome.soap\ - http://soap.genome.jp/KEGG.wsdl - - - - - Settings - IMPlateAnalysis_jp_genome_soap_KEGG - - @@ -926,6 +1433,8 @@ Always + + Always @@ -953,6 +1462,38 @@ + + + + + + {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} + 2 + 7 + 0 + primary + False + True + + + {00020813-0000-0000-C000-000000000046} + 1 + 8 + 0 + primary + False + True + + + {0002E157-0000-0000-C000-000000000046} + 5 + 3 + 0 + primary + False + True + + diff --git a/HCS Analyzer.csproj.user b/HCS Analyzer.csproj.user index abdd053..93e6c6e 100644 --- a/HCS Analyzer.csproj.user +++ b/HCS Analyzer.csproj.user @@ -1,7 +1,7 @@  - F:\NewWebSite\|G:\Publish\|F:\Publish\|publish\ + publish\|F:\NewWebSite\|G:\Publish\|F:\Publish\ http://hcs-analyzer.ip-korea.org/ http://hcs-analyzer.ip-korea.org/ @@ -19,6 +19,8 @@ Project + + false diff --git a/HCS Analyzer.sln b/HCS Analyzer.sln index 30811c7..8d873a7 100644 --- a/HCS Analyzer.sln +++ b/HCS Analyzer.sln @@ -1,44 +1,68 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HCS Analyzer", "HCS Analyzer.csproj", "{FF1F8666-DA92-4052-ABA9-C6ADB629EA50}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HCSPlugin", "HCSPlugin\HCSPlugin.csproj", "{2475F0D3-2F54-4BAF-8882-33536F411764}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BioCSharp", "..\BioCSharp\BioCSharp.csproj", "{D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|Any CPU.ActiveCfg = Debug|x86 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|Any CPU.Build.0 = Debug|x86 + {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|x64.ActiveCfg = Debug|x64 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|x64.Build.0 = Debug|x64 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|x86.ActiveCfg = Debug|x86 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Debug|x86.Build.0 = Debug|x86 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|Any CPU.Build.0 = Release|Any CPU + {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|Mixed Platforms.Build.0 = Release|x86 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|x64.ActiveCfg = Release|x64 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|x64.Build.0 = Release|x64 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|x86.ActiveCfg = Release|x86 {FF1F8666-DA92-4052-ABA9-C6ADB629EA50}.Release|x86.Build.0 = Release|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|Any CPU.ActiveCfg = Debug|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|Any CPU.Build.0 = Debug|x86 + {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|x64.ActiveCfg = Debug|x64 {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|x64.Build.0 = Debug|x64 {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|x86.ActiveCfg = Debug|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Debug|x86.Build.0 = Debug|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|Any CPU.ActiveCfg = Release|Any CPU {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|Any CPU.Build.0 = Release|Any CPU + {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|Mixed Platforms.Build.0 = Release|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|x64.ActiveCfg = Release|x64 {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|x64.Build.0 = Release|x64 {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|x86.ActiveCfg = Release|x86 {2475F0D3-2F54-4BAF-8882-33536F411764}.Release|x86.Build.0 = Release|x86 + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|x64.ActiveCfg = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Debug|x86.ActiveCfg = Debug|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|Any CPU.Build.0 = Release|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|x64.ActiveCfg = Release|Any CPU + {D6B03DB6-364F-4174-B6C8-B8A6D882DFC0}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/HCS Analyzer.suo b/HCS Analyzer.suo index d8246ca..7f66945 100644 Binary files a/HCS Analyzer.suo and b/HCS Analyzer.suo differ diff --git a/HCS Analyzer.userprefs b/HCS Analyzer.userprefs new file mode 100644 index 0000000..5baf77a --- /dev/null +++ b/HCS Analyzer.userprefs @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/HCS Analyzer.v11.suo b/HCS Analyzer.v11.suo new file mode 100644 index 0000000..3823103 Binary files /dev/null and b/HCS Analyzer.v11.suo differ diff --git a/HCSPlugin/bin/Debug/HCSPlugin.dll b/HCSPlugin/bin/Debug/HCSPlugin.dll index 06c3873..4326391 100644 Binary files a/HCSPlugin/bin/Debug/HCSPlugin.dll and b/HCSPlugin/bin/Debug/HCSPlugin.dll differ diff --git a/HCSPlugin/bin/Debug/HCSPlugin.pdb b/HCSPlugin/bin/Debug/HCSPlugin.pdb index dd88926..0e2c50b 100644 Binary files a/HCSPlugin/bin/Debug/HCSPlugin.pdb and b/HCSPlugin/bin/Debug/HCSPlugin.pdb differ diff --git a/HCSPlugin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/HCSPlugin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 4a069f5..c3be841 100644 Binary files a/HCSPlugin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/HCSPlugin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/HCSPlugin/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/HCSPlugin/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache index c3ed337..a3b7aaa 100644 Binary files a/HCSPlugin/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/HCSPlugin/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/HCSPlugin/obj/x86/Debug/GenerateResource.read.1.tlog b/HCSPlugin/obj/x86/Debug/GenerateResource.read.1.tlog index a58b533..e47889b 100644 Binary files a/HCSPlugin/obj/x86/Debug/GenerateResource.read.1.tlog and b/HCSPlugin/obj/x86/Debug/GenerateResource.read.1.tlog differ diff --git a/HCSPlugin/obj/x86/Debug/GenerateResource.write.1.tlog b/HCSPlugin/obj/x86/Debug/GenerateResource.write.1.tlog index 99bdd3a..519d5af 100644 Binary files a/HCSPlugin/obj/x86/Debug/GenerateResource.write.1.tlog and b/HCSPlugin/obj/x86/Debug/GenerateResource.write.1.tlog differ diff --git a/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.FileListAbsolute.txt b/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.FileListAbsolute.txt index 9b20516..e66806b 100644 --- a/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.FileListAbsolute.txt +++ b/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.FileListAbsolute.txt @@ -101,10 +101,7 @@ E:\git_HCS\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog E:\git_HCS\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll E:\git_HCS\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb E:\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb -E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\ResolveAssemblyReference.cache E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources -E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.read.1.tlog -E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb J:\HCS-Analyzer_New\HCSPlugin\bin\Debug\HCSPlugin.pdb @@ -202,3 +199,57 @@ J:\HCS-Analyzer_New\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resou J:\HCS-Analyzer_New\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache J:\HCS-Analyzer_New\HCSPlugin\obj\x86\Debug\HCSPlugin.dll J:\HCS-Analyzer_New\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +D:\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\ResolveAssemblyReference.cache +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.read.1.tlog +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +D:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +C:\Work\underDev\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +C:\Work\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csprojResolveAssemblyReference.cache +C:\Work\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +C:\Work\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache +C:\Work\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +C:\Work\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +E:\underDev\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +E:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csprojResolveAssemblyReference.cache +E:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +E:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache +E:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +E:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +I:\underDev\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\ResolveAssemblyReference.cache +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.read.1.tlog +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +I:\underDev\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\ResolveAssemblyReference.cache +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.read.1.tlog +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +I:\underDev\Tmp_HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache +I:\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\ResolveAssemblyReference.cache +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.read.1.tlog +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\GenerateResource.write.1.tlog +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +I:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +E:\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csprojResolveAssemblyReference.cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\bin\Debug\HCSPlugin.pdb +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\obj\x86\Debug\HCSPlugin.csprojResolveAssemblyReference.cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb +D:\Source\HCS-Analyzer\HCSPlugin\bin\Debug\HCSPlugin.pdb +D:\Source\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csprojResolveAssemblyReference.cache +D:\Source\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.Properties.Resources.resources +D:\Source\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.csproj.GenerateResource.Cache +D:\Source\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.dll +D:\Source\HCS-Analyzer\HCSPlugin\obj\x86\Debug\HCSPlugin.pdb diff --git a/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.GenerateResource.Cache b/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.GenerateResource.Cache index e0bf26a..5924f6a 100644 Binary files a/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.GenerateResource.Cache and b/HCSPlugin/obj/x86/Debug/HCSPlugin.csproj.GenerateResource.Cache differ diff --git a/HCSPlugin/obj/x86/Debug/HCSPlugin.csprojResolveAssemblyReference.cache b/HCSPlugin/obj/x86/Debug/HCSPlugin.csprojResolveAssemblyReference.cache index 1cfd2e6..d1d489a 100644 Binary files a/HCSPlugin/obj/x86/Debug/HCSPlugin.csprojResolveAssemblyReference.cache and b/HCSPlugin/obj/x86/Debug/HCSPlugin.csprojResolveAssemblyReference.cache differ diff --git a/HCSPlugin/obj/x86/Debug/HCSPlugin.dll b/HCSPlugin/obj/x86/Debug/HCSPlugin.dll index 06c3873..4326391 100644 Binary files a/HCSPlugin/obj/x86/Debug/HCSPlugin.dll and b/HCSPlugin/obj/x86/Debug/HCSPlugin.dll differ diff --git a/HCSPlugin/obj/x86/Debug/HCSPlugin.pdb b/HCSPlugin/obj/x86/Debug/HCSPlugin.pdb index dd88926..0e2c50b 100644 Binary files a/HCSPlugin/obj/x86/Debug/HCSPlugin.pdb and b/HCSPlugin/obj/x86/Debug/HCSPlugin.pdb differ diff --git a/HCSPlugin/obj/x86/Debug/ResolveAssemblyReference.cache b/HCSPlugin/obj/x86/Debug/ResolveAssemblyReference.cache index ce49ecf..3746cf7 100644 Binary files a/HCSPlugin/obj/x86/Debug/ResolveAssemblyReference.cache and b/HCSPlugin/obj/x86/Debug/ResolveAssemblyReference.cache differ diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index e8339d2..f28986c 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -8,9 +8,9 @@ [assembly: AssemblyTitle("HCSAnalyzer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Institut Pasteur Korea")] +[assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright © Institut Pasteur Korea 2010")] +[assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index d39dfb4..63a1aad 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.239 +// Runtime Version:4.0.30319.17929 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -60,6 +60,9 @@ internal Resources() { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap application_exit { get { object obj = ResourceManager.GetObject("application-exit", resourceCulture); @@ -67,6 +70,16 @@ internal static System.Drawing.Bitmap application_exit { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Arrow { + get { + object obj = ResourceManager.GetObject("Arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized string similar to Thierry Dorval. /// @@ -76,6 +89,9 @@ internal static string author { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap BowlEffect { get { object obj = ResourceManager.GetObject("BowlEffect", resourceCulture); @@ -83,6 +99,9 @@ internal static System.Drawing.Bitmap BowlEffect { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap Capture { get { object obj = ResourceManager.GetObject("Capture", resourceCulture); @@ -90,6 +109,9 @@ internal static System.Drawing.Bitmap Capture { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap Capture1 { get { object obj = ResourceManager.GetObject("Capture1", resourceCulture); @@ -97,6 +119,9 @@ internal static System.Drawing.Bitmap Capture1 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap ColumnEffect { get { object obj = ResourceManager.GetObject("ColumnEffect", resourceCulture); @@ -104,6 +129,9 @@ internal static System.Drawing.Bitmap ColumnEffect { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap configure_4 { get { object obj = ResourceManager.GetObject("configure-4", resourceCulture); @@ -111,6 +139,9 @@ internal static System.Drawing.Bitmap configure_4 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap DarkLogo { get { object obj = ResourceManager.GetObject("DarkLogo", resourceCulture); @@ -118,6 +149,9 @@ internal static System.Drawing.Bitmap DarkLogo { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap db_add { get { object obj = ResourceManager.GetObject("db_add", resourceCulture); @@ -125,6 +159,9 @@ internal static System.Drawing.Bitmap db_add { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap db_comit { get { object obj = ResourceManager.GetObject("db_comit", resourceCulture); @@ -132,6 +169,9 @@ internal static System.Drawing.Bitmap db_comit { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap db_update { get { object obj = ResourceManager.GetObject("db_update", resourceCulture); @@ -139,6 +179,9 @@ internal static System.Drawing.Bitmap db_update { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap document_open_5 { get { object obj = ResourceManager.GetObject("document-open-5", resourceCulture); @@ -146,6 +189,9 @@ internal static System.Drawing.Bitmap document_open_5 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap EdgeEffect { get { object obj = ResourceManager.GetObject("EdgeEffect", resourceCulture); @@ -153,6 +199,9 @@ internal static System.Drawing.Bitmap EdgeEffect { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap format_justify_fill { get { object obj = ResourceManager.GetObject("format-justify-fill", resourceCulture); @@ -160,6 +209,9 @@ internal static System.Drawing.Bitmap format_justify_fill { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap help_about { get { object obj = ResourceManager.GetObject("help-about", resourceCulture); @@ -167,6 +219,9 @@ internal static System.Drawing.Bitmap help_about { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap insert_link { get { object obj = ResourceManager.GetObject("insert-link", resourceCulture); @@ -174,6 +229,9 @@ internal static System.Drawing.Bitmap insert_link { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap Logo { get { object obj = ResourceManager.GetObject("Logo", resourceCulture); @@ -181,6 +239,9 @@ internal static System.Drawing.Bitmap Logo { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap LUT { get { object obj = ResourceManager.GetObject("LUT", resourceCulture); @@ -188,6 +249,19 @@ internal static System.Drawing.Bitmap LUT { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MultiPlatesOn { + get { + object obj = ResourceManager.GetObject("MultiPlatesOn", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap office_chart_scatter { get { object obj = ResourceManager.GetObject("office-chart-scatter", resourceCulture); @@ -195,6 +269,9 @@ internal static System.Drawing.Bitmap office_chart_scatter { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap office_chart_scatter1 { get { object obj = ResourceManager.GetObject("office-chart-scatter1", resourceCulture); @@ -202,6 +279,9 @@ internal static System.Drawing.Bitmap office_chart_scatter1 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap RowEffect { get { object obj = ResourceManager.GetObject("RowEffect", resourceCulture); @@ -209,6 +289,9 @@ internal static System.Drawing.Bitmap RowEffect { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap WhitePicture { get { object obj = ResourceManager.GetObject("WhitePicture", resourceCulture); @@ -216,6 +299,9 @@ internal static System.Drawing.Bitmap WhitePicture { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap zoom_in_4 { get { object obj = ResourceManager.GetObject("zoom-in-4", resourceCulture); @@ -223,6 +309,9 @@ internal static System.Drawing.Bitmap zoom_in_4 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap zoom_in_41 { get { object obj = ResourceManager.GetObject("zoom-in-41", resourceCulture); @@ -230,6 +319,9 @@ internal static System.Drawing.Bitmap zoom_in_41 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap zoom_out_4 { get { object obj = ResourceManager.GetObject("zoom-out-4", resourceCulture); @@ -237,6 +329,9 @@ internal static System.Drawing.Bitmap zoom_out_4 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// internal static System.Drawing.Bitmap zoom_out_41 { get { object obj = ResourceManager.GetObject("zoom-out-41", resourceCulture); diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 2712fe2..6694618 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -118,82 +118,88 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\configure-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\application-exit.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\document-open-5.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Thierry Dorval - - ..\Resources\help-about.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\insert-link.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\BowlEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\DarkLogo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\zoom-in-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\zoom-in-41.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - Thierry Dorval + + ..\Resources\office-chart-scatter1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Arrow.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\format-justify-fill.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\bin\Capture.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\bin\RowEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\db_update.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\bin\Logo.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\help-about.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\office-chart-scatter.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\db_comit.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\ColumnEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\application-exit.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\WhitePicture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\zoom-out-41.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\Capture1.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\DarkLogo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\Logo.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\zoom-out-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\EdgeEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\zoom-out-41.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\bin\LUT.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\office-chart-scatter1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\configure-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\Capture1.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\zoom-out-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\format-justify-fill.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\db_update.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\zoom-in-41.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\document-open-5.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\insert-link.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\zoom-in-4.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\WhitePicture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\db_comit.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\ColumnEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\bin\BowlEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\db_add.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\bin\Capture.JPG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\bin\EdgeEffect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\MultiPlatesOn.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 230fd76..2fbb8e3 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.239 +// Runtime Version:4.0.30319.17929 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +12,7 @@ namespace HCSAnalyzer.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/Resources/Arrow.jpg b/Resources/Arrow.jpg new file mode 100644 index 0000000..5b92b29 Binary files /dev/null and b/Resources/Arrow.jpg differ diff --git a/Resources/MultiPlatesOff.jpg b/Resources/MultiPlatesOff.jpg new file mode 100644 index 0000000..5ef7590 Binary files /dev/null and b/Resources/MultiPlatesOff.jpg differ diff --git a/Resources/MultiPlatesOn.jpg b/Resources/MultiPlatesOn.jpg new file mode 100644 index 0000000..e39bc3c Binary files /dev/null and b/Resources/MultiPlatesOn.jpg differ diff --git a/Classif.cs b/SubHCSAnalyzer/Classif.cs similarity index 99% rename from Classif.cs rename to SubHCSAnalyzer/Classif.cs index de1bd69..69185ee 100644 --- a/Classif.cs +++ b/SubHCSAnalyzer/Classif.cs @@ -22,14 +22,8 @@ namespace HCSAnalyzer { - - - - - public partial class HCSAnalyzer { - protected virtual bool IsFileUsed(string file) { try @@ -91,9 +85,9 @@ private FormForImportExcel CellByCellFromCSV(string FileName) DataGridViewComboBoxColumn columnType = new DataGridViewComboBoxColumn(); if (GlobalInfo.OptionsWindow.radioButtonWellPosModeDouble.Checked) - columnType.DataSource = new string[] { "Plate name", "Column", "Row", "Descriptor" }; + columnType.DataSource = new string[] { "Plate name", "Column", "Row", "Descriptor", "Phenotype Class" }; else - columnType.DataSource = new string[] { "Plate name", "Well position", "Descriptor" }; + columnType.DataSource = new string[] { "Plate name", "Well position", "Descriptor", "Phenotype Class" }; columnType.Name = "Type"; FromExcel.dataGridViewForImport.Columns.Add(columnType); @@ -286,7 +280,7 @@ private void LoadingCSVProcedure(FormForImportExcel FromExcel) CSVsr.Close(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); MessageBox.Show("File loaded", "Process finished !", MessageBoxButtons.OK, MessageBoxIcon.Information); return; diff --git a/Clustering.cs b/SubHCSAnalyzer/Clustering.cs similarity index 72% rename from Clustering.cs rename to SubHCSAnalyzer/Clustering.cs index 3eb1297..579adef 100644 --- a/Clustering.cs +++ b/SubHCSAnalyzer/Clustering.cs @@ -20,130 +20,130 @@ namespace HCSAnalyzer public partial class HCSAnalyzer { #region User Interface - private void comboBoxClusteringMethod_SelectedIndexChanged(object sender, EventArgs e) - { - richTextBoxInfoClustering.Clear(); - - switch (comboBoxClusteringMethod.SelectedIndex) - { - case 0: - richTextBoxInfoClustering.AppendText("K-Means.\nFor more information, go to: http://en.wikipedia.org/wiki/K-means_clustering"); - checkBoxAutomatedClusterNumber.Checked = false; - checkBoxAutomatedClusterNumber.Enabled = false; - numericUpDownClusterNumber.ReadOnly = false; - break; - case 1: - richTextBoxInfoClustering.AppendText("EM.\nFor more information, go to: http://en.wikipedia.org/wiki/Expectation_maximization"); - checkBoxAutomatedClusterNumber.Enabled = true; - break; - case 2: - richTextBoxInfoClustering.AppendText("Hierarchical Clusterer.\nNote: well suited for large signatures, but computationaly heavy regarding the number of experiments.\nFor more information, go to: http://en.wikipedia.org/wiki/Hierarchical_clustering"); - checkBoxAutomatedClusterNumber.Checked = false; - checkBoxAutomatedClusterNumber.Enabled = false; - numericUpDownClusterNumber.ReadOnly = false; - break; - - } - - } - - private void richTextBoxInfoClustering_LinkClicked(object sender, LinkClickedEventArgs e) - { - ClickOnLink(e.LinkText); - - } - - private void buttonCluster_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - - if (!CompleteScreening.IsSelectedDescriptors()) - { - MessageBox.Show("You have to check at least one descriptor !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - this.Cursor = Cursors.WaitCursor; - // -------------- K - Means --------------------------- - if (comboBoxClusteringMethod.SelectedIndex == 0) - { - if (radioButtonClusterPlateByPlate.Checked) - { - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - KMeans((int)numericUpDownClusterNumber.Value, CurrentPlateToProcess); - } - richTextBoxInfoClustering.AppendText("\nPlate by plate clustering done !"); - } - else - { - KMeansFullScreen((int)numericUpDownClusterNumber.Value); - richTextBoxInfoClustering.AppendText("\nGlobal clustering done !"); - } - } - else if (comboBoxClusteringMethod.SelectedIndex == 1) // ---------------- EM -------------------------- - { - FormForEMInfo WindowEMinfo = new FormForEMInfo(); - - if (WindowEMinfo.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - if (checkBoxAutomatedClusterNumber.Checked) - { - string feedback = ClusteringEM(radioButtonClusterFullScreen.Checked, -1, WindowEMinfo); - if (feedback != null) - { - FormForCellByCellClusteringResults WindowFormForCellByCellClusteringResults = new FormForCellByCellClusteringResults(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.Clear(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.AppendText(feedback); - WindowFormForCellByCellClusteringResults.buttonPerformLearning.Text = "Ok"; - WindowFormForCellByCellClusteringResults.ShowDialog(); - } - } - else - { - string feedback = ClusteringEM(radioButtonClusterFullScreen.Checked, (int)numericUpDownClusterNumber.Value, WindowEMinfo); - if (feedback != null) - { - FormForCellByCellClusteringResults WindowFormForCellByCellClusteringResults = new FormForCellByCellClusteringResults(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.Clear(); - WindowFormForCellByCellClusteringResults.richTextBoxResults.AppendText(feedback); - WindowFormForCellByCellClusteringResults.buttonPerformLearning.Text = "Ok"; - WindowFormForCellByCellClusteringResults.ShowDialog(); - } - } - } - else if (comboBoxClusteringMethod.SelectedIndex == 2) // ---------------- Hierarchical -------------------------- - { - if (checkBoxAutomatedClusterNumber.Checked) - ClusteringHierarchical(radioButtonClusterFullScreen.Checked, -1); - else - ClusteringHierarchical(radioButtonClusterFullScreen.Checked, (int)numericUpDownClusterNumber.Value); - - } - - //CompleteScreening.GetPlate(CompleteScreening.CurrentDisplayPlate).DisplayClasses(CompleteScreening.PanelForPlate); - // tabControlMain.SelectedTab = tabPageDistribution; - this.Cursor = Cursors.Default; - - - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - - private void radioButtonClusterPlateByPlate_CheckedChanged(object sender, EventArgs e) - { - if (radioButtonClusterPlateByPlate.Checked) - richTextBoxInfoClustering.AppendText("\nWarning: in such mode the results can be inconsistent from one plate to another."); - } - - private void checkBoxAutomatedClusterNumber_CheckedChanged(object sender, EventArgs e) - { - numericUpDownClusterNumber.ReadOnly = checkBoxAutomatedClusterNumber.Checked; - if (checkBoxAutomatedClusterNumber.Checked) - richTextBoxInfoClustering.AppendText("\nWarning: this task can be time consuming.\nIf the number of class is higher than 10, the clustering will not be performed."); - } + //private void comboBoxClusteringMethod_SelectedIndexChanged(object sender, EventArgs e) + //{ + // richTextBoxInfoClustering.Clear(); + + // switch (comboBoxClusteringMethod.SelectedIndex) + // { + // case 0: + // richTextBoxInfoClustering.AppendText("K-Means.\nFor more information, go to: http://en.wikipedia.org/wiki/K-means_clustering"); + // checkBoxAutomatedClusterNumber.Checked = false; + // checkBoxAutomatedClusterNumber.Enabled = false; + // numericUpDownClusterNumber.ReadOnly = false; + // break; + // case 1: + // richTextBoxInfoClustering.AppendText("EM.\nFor more information, go to: http://en.wikipedia.org/wiki/Expectation_maximization"); + // checkBoxAutomatedClusterNumber.Enabled = true; + // break; + // case 2: + // richTextBoxInfoClustering.AppendText("Hierarchical Clusterer.\nNote: well suited for large signatures, but computationaly heavy regarding the number of experiments.\nFor more information, go to: http://en.wikipedia.org/wiki/Hierarchical_clustering"); + // checkBoxAutomatedClusterNumber.Checked = false; + // checkBoxAutomatedClusterNumber.Enabled = false; + // numericUpDownClusterNumber.ReadOnly = false; + // break; + + // } + + //} + + //private void richTextBoxInfoClustering_LinkClicked(object sender, LinkClickedEventArgs e) + //{ + // ClickOnLink(e.LinkText); + + //} + + //private void buttonCluster_Click(object sender, EventArgs e) + //{ + // if (CompleteScreening == null) return; + + // if (!CompleteScreening.IsSelectedDescriptors()) + // { + // MessageBox.Show("You have to check at least one descriptor !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + // } + + // this.Cursor = Cursors.WaitCursor; + // // -------------- K - Means --------------------------- + // if (comboBoxClusteringMethod.SelectedIndex == 0) + // { + // if (radioButtonClusterPlateByPlate.Checked) + // { + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + // // loop on all the plate + // for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + // { + // cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + // KMeans((int)numericUpDownClusterNumber.Value, CurrentPlateToProcess); + // } + // richTextBoxInfoClustering.AppendText("\nPlate by plate clustering done !"); + // } + // else + // { + // KMeansFullScreen((int)numericUpDownClusterNumber.Value); + // richTextBoxInfoClustering.AppendText("\nGlobal clustering done !"); + // } + // } + // else if (comboBoxClusteringMethod.SelectedIndex == 1) // ---------------- EM -------------------------- + // { + // FormForEMInfo WindowEMinfo = new FormForEMInfo(); + + // if (WindowEMinfo.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + // if (checkBoxAutomatedClusterNumber.Checked) + // { + // string feedback = ClusteringEM(radioButtonClusterFullScreen.Checked, -1, WindowEMinfo); + // if (feedback != null) + // { + // FormForCellByCellClusteringResults WindowFormForCellByCellClusteringResults = new FormForCellByCellClusteringResults(); + // WindowFormForCellByCellClusteringResults.richTextBoxResults.Clear(); + // WindowFormForCellByCellClusteringResults.richTextBoxResults.AppendText(feedback); + // WindowFormForCellByCellClusteringResults.buttonPerformLearning.Text = "Ok"; + // WindowFormForCellByCellClusteringResults.ShowDialog(); + // } + // } + // else + // { + // string feedback = ClusteringEM(radioButtonClusterFullScreen.Checked, (int)numericUpDownClusterNumber.Value, WindowEMinfo); + // if (feedback != null) + // { + // FormForCellByCellClusteringResults WindowFormForCellByCellClusteringResults = new FormForCellByCellClusteringResults(); + // WindowFormForCellByCellClusteringResults.richTextBoxResults.Clear(); + // WindowFormForCellByCellClusteringResults.richTextBoxResults.AppendText(feedback); + // WindowFormForCellByCellClusteringResults.buttonPerformLearning.Text = "Ok"; + // WindowFormForCellByCellClusteringResults.ShowDialog(); + // } + // } + // } + // else if (comboBoxClusteringMethod.SelectedIndex == 2) // ---------------- Hierarchical -------------------------- + // { + // if (checkBoxAutomatedClusterNumber.Checked) + // ClusteringHierarchical(radioButtonClusterFullScreen.Checked, -1); + // else + // ClusteringHierarchical(radioButtonClusterFullScreen.Checked, (int)numericUpDownClusterNumber.Value); + + // } + + // //CompleteScreening.GetPlate(CompleteScreening.CurrentDisplayPlate).DisplayClasses(CompleteScreening.PanelForPlate); + // // tabControlMain.SelectedTab = tabPageDistribution; + // this.Cursor = Cursors.Default; + + + // CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + //} + + //private void radioButtonClusterPlateByPlate_CheckedChanged(object sender, EventArgs e) + //{ + // if (radioButtonClusterPlateByPlate.Checked) + // richTextBoxInfoClustering.AppendText("\nWarning: in such mode the results can be inconsistent from one plate to another."); + //} + + //private void checkBoxAutomatedClusterNumber_CheckedChanged(object sender, EventArgs e) + //{ + // numericUpDownClusterNumber.ReadOnly = checkBoxAutomatedClusterNumber.Checked; + // if (checkBoxAutomatedClusterNumber.Checked) + // richTextBoxInfoClustering.AppendText("\nWarning: this task can be time consuming.\nIf the number of class is higher than 10, the clustering will not be performed."); + //} #endregion #region EM Clustering @@ -179,11 +179,7 @@ private string ClusteringEM(bool IsFullScreen, int ClassNumber, FormForEMInfo Wi private void ClusteringEMSinglePlate(cPlate CurrentPlateToProcess, int ClassNumber, FormForEMInfo WindowEMinfo) { weka.core.Instances Ninsts = CurrentPlateToProcess.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); - if (Ninsts.numInstances() == 0) - { - MessageBox.Show("No active wells !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } + weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); @@ -194,9 +190,9 @@ private void ClusteringEMSinglePlate(cPlate CurrentPlateToProcess, int ClassNumb EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); - if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedClass()) + if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedWellClass()) { - richTextBoxInfoClustering.AppendText("\n Plate " + CurrentPlateToProcess.Name + ", cluster Number: more than " + GlobalInfo.GetNumberofDefinedClass() + ", clustering not operated.\n"); + richTextBoxInfoClustering.AppendText("\n Plate " + CurrentPlateToProcess.Name + ", cluster Number: more than " + GlobalInfo.GetNumberofDefinedWellClass() + ", clustering not operated.\n"); return; } else @@ -225,9 +221,9 @@ private string ClusteringEMGlobalScreen(int ClassNumber, FormForEMInfo WindowEMi EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); - if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedClass()) + if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedWellClass()) { - richTextBoxInfoClustering.AppendText("\nCluster Number: more than " + GlobalInfo.GetNumberofDefinedClass() + ", clustering not operated.\n"); + richTextBoxInfoClustering.AppendText("\nCluster Number: more than " + GlobalInfo.GetNumberofDefinedWellClass() + ", clustering not operated.\n"); return null; } diff --git a/DimensionalityReduction.cs b/SubHCSAnalyzer/DimensionalityReduction.cs similarity index 99% rename from DimensionalityReduction.cs rename to SubHCSAnalyzer/DimensionalityReduction.cs index 40fcdf7..f52fdf7 100644 --- a/DimensionalityReduction.cs +++ b/SubHCSAnalyzer/DimensionalityReduction.cs @@ -39,7 +39,7 @@ private void comboBoxReduceDimMultiClass_SelectedIndexChanged(object sender, Eve } - private void ClickOnLink(string Link) + public void ClickOnLink(string Link) { System.Diagnostics.Process proc = new System.Diagnostics.Process(); if (GlobalInfo.OptionsWindow.radioButtonIE.Checked) diff --git a/Import_Export.cs b/SubHCSAnalyzer/Import_Export.cs similarity index 87% rename from Import_Export.cs rename to SubHCSAnalyzer/Import_Export.cs index c12d23b..b666678 100644 --- a/Import_Export.cs +++ b/SubHCSAnalyzer/Import_Export.cs @@ -19,6 +19,7 @@ using HCSAnalyzer.Forms.IO; using HCSAnalyzer.Forms.FormsForGraphsDisplay; using System.Data.SQLite; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer { @@ -238,7 +239,7 @@ private void importToolStripMenuItem_Click(object sender, EventArgs e) LoadTXTAssay(CurrOpenFileDialog); ResultLoading = true; } - if (CurrOpenFileDialog.FileNames[0].Remove(0, CurrOpenFileDialog.FileNames[0].Length - 4) == ".csv") + if ((CurrOpenFileDialog.FileNames[0].Remove(0, CurrOpenFileDialog.FileNames[0].Length - 4) == ".csv")|| (CurrOpenFileDialog.FileNames[0].Remove(0, CurrOpenFileDialog.FileNames[0].Length - 4) == ".CSV")) { FormForImportExcel CSVFeedBackWindow = LoadCSVAssay(CurrOpenFileDialog.FileNames, false); if (CSVFeedBackWindow == null) return; @@ -355,94 +356,6 @@ private void ProcessOK(FormForImportExcel CSVFeedBackWindow) } - - - - private void loadScreenToolStripMenuItem_Click(object sender, EventArgs e) - { - FolderBrowserDialog OpenFolderDialog = new FolderBrowserDialog(); - - DialogResult result = OpenFolderDialog.ShowDialog(); - if (result == DialogResult.OK) - { - - - - string Path = OpenFolderDialog.SelectedPath; - if (CompleteScreening != null) CompleteScreening.Close3DView(); - - - GlobalInfo = new cGlobalInfo(CompleteScreening, this); - GlobalInfo.OptionsWindow.Visible = false; - GlobalInfo.ComboForSelectedDesc = this.comboBoxDescriptorToDisplay; - GlobalInfo.CheckedListBoxForDescActive = this.checkedListBoxActiveDescriptors; - - //new Kitware.VTK.RenderWindowControl novelRender = new RenderWindowControl - - GlobalInfo.renderWindowControlForVTK = null;//renderWindowControlForVTK; - - - MyConsole = new FormConsole(); - MyConsole.Visible = false; - - PlateListWindow = new PlatesListForm(); - GlobalInfo.PlateListWindow = PlateListWindow; - - GlobalInfo.panelForPlate = this.panelForPlate; - - comboBoxClass.SelectedIndex = 1; - - - - - - - CompleteScreening = new cScreening("My first Screening", GlobalInfo); - - CompleteScreening.ListDescriptors.Clean(); - - FormForPlateDimensions PlateDim = new FormForPlateDimensions(); - if (PlateDim.ShowDialog() != System.Windows.Forms.DialogResult.OK) - return; - - CompleteScreening.LoadData(Path, (int)PlateDim.numericUpDownColumns.Value, (int)PlateDim.numericUpDownRows.Value); - - - - if (CompleteScreening.GetNumberOfOriginalPlates() == 0) - { - GlobalInfo.ConsoleWriteLine("No plate loaded !"); - return; - } - - for (int IdxPlate = 0; IdxPlate < CompleteScreening.GetNumberOfOriginalPlates(); IdxPlate++) - { - string Name = CompleteScreening.ListPlatesActive.GetPlate(IdxPlate).Name; - this.toolStripcomboBoxPlateList.Items.Add(Name); - PlateListWindow.listBoxPlateNameToProcess.Items.Add(Name); - PlateListWindow.listBoxAvaliableListPlates.Items.Add(Name); - - } - - UpdateUIAfterLoading(); - - StartingUpDateUI(); - - CompleteScreening.CurrentDisplayPlateIdx = 0; - //checkedListBoxActiveDescriptors.Items.Clear(); - CompleteScreening.ListDescriptors.CurrentSelectedDescriptor = 0; - - - - // this.toolStripcomboBoxPlateList.SelectedIndex = CompleteScreening.CurrentDisplayPlateIdx; - // comboBoxDescriptorToDisplay.SelectedIndex = CompleteScreening.ListDescriptors.CurrentSelectedDescriptor; - CompleteScreening.SetSelectionType(comboBoxClass.SelectedIndex - 1); - CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.CurrentDisplayPlateIdx).DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, true); - - // this.toolStripcomboBoxPlateList.SelectedIndex = CompleteScreening.CurrentDisplayPlateIdx; - } - } - #endregion #region CSV functions @@ -686,10 +599,20 @@ private FormForImportExcel LoadCSVAssay(string[] FileNames, bool IsAppend) FromExcel.dataGridViewForImport.Rows[i].Cells[IdxRow++].Value = "Row"; } else + if (Names[i].Contains("Name") || Names[i].Contains("Class") || Names[i].Contains("Locus") || Names[i].Contains("Info") || Names[i].Contains("Concentration")) + { + FromExcel.dataGridViewForImport.Rows[i].Cells[IdxRow++].Value = Names[i]; + } + else FromExcel.dataGridViewForImport.Rows[i].Cells[IdxRow++].Value = "Descriptor"; } else { + if (Names[i].Contains("Name") || Names[i].Contains("Class") || Names[i].Contains("Locus") || Names[i].Contains("Info") || Names[i].Contains("Concentration")) + { + FromExcel.dataGridViewForImport.Rows[i].Cells[IdxRow++].Value = Names[i]; + } + else FromExcel.dataGridViewForImport.Rows[i].Cells[IdxRow++].Value = "Descriptor"; } @@ -809,7 +732,6 @@ public void LoadingProcedureForCSVImport(FormForImportExcel FromExcel) int[] Pos = new int[2]; if (Mode == 1) { - if (CurrentDesc[ColWellPos] == "") goto NEXTLOOP; Pos = ConvertPosition(CurrentDesc[ColWellPos]); if (Pos == null) { @@ -1244,7 +1166,7 @@ public void LoadingProcedure(FormForImportExcel FromExcel) CSVsr.Close(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); MessageBox.Show("File loaded", "Process finished !", MessageBoxButtons.OK, MessageBoxIcon.Information); return; @@ -1454,7 +1376,7 @@ private bool DisplayDescriptorsToSave(string CurrentPathforCSV) FormToSave.dataGridView.Rows[RowIdx++].Cells[2].Value = TmpWell.Name; - FormToSave.dataGridView.Rows[RowIdx++].Cells[2].Value = TmpWell.GetClass(); + FormToSave.dataGridView.Rows[RowIdx++].Cells[2].Value = TmpWell.GetClassIdx(); if (TmpWell.LocusID == -1) FormToSave.dataGridView.Rows[RowIdx++].Cells[2].Value = ""; @@ -1549,7 +1471,7 @@ private void ExportToCSV(string PathName, DataGridView GridView) GridToSave.Rows[RowPos].Cells[ColPos++].Value = TmpWell.Name; if ((bool)GridView.Rows[RealPos++].Cells[1].Value) - GridToSave.Rows[RowPos].Cells[ColPos++].Value = TmpWell.GetClass(); + GridToSave.Rows[RowPos].Cells[ColPos++].Value = TmpWell.GetClassIdx(); if ((bool)GridView.Rows[RealPos++].Cells[1].Value) { @@ -1624,7 +1546,7 @@ private void ExportToCSV(string PathName, bool IsAddDescriptors, bool IsPlateMod if (TmpWell == null) CurrentLine += ","; else - CurrentLine += "," + TmpWell.GetClass(); + CurrentLine += "," + TmpWell.GetClassIdx(); } stream.WriteLine(CurrentLine); } @@ -1753,7 +1675,7 @@ private void ExportToCSV(string PathName, bool IsAddDescriptors, bool IsPlateMod if (TmpWell == null) continue; string CurrentLine = CurrentPlateToProcess.Name + ","; - int _Class = TmpWell.GetClass(); + int _Class = TmpWell.GetClassIdx(); int _Column = Col + 1; int _Row = Row + 1; @@ -1854,7 +1776,7 @@ private void LoadMTRAssay(OpenFileDialog CurrOpenFileDialog) comboBoxDescriptorToDisplay.SelectedIndex = 0; toolStripcomboBoxPlateList.SelectedIndex = 0; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, true); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); } #endregion @@ -1874,6 +1796,7 @@ private void univariateToolStripMenuItem_Click(object sender, EventArgs e) CompleteScreening.Rows = NumRow; CompleteScreening.Columns = NumCol; CompleteScreening.ListPlatesAvailable = new cExtendPlateList(); + GlobalInfo.CurrentScreen = CompleteScreening; } int NumPlate = (int)WindowGenerateScreening.numericUpDownPlateNumber.Value; @@ -1939,7 +1862,6 @@ private void univariateToolStripMenuItem_Click(object sender, EventArgs e) else { CurrentPlate = CompleteScreening.ListPlatesAvailable[IdxPlate]; - } if (WindowGenerateScreening.checkBoxStandardDeviation.Checked) @@ -1947,7 +1869,6 @@ private void univariateToolStripMenuItem_Click(object sender, EventArgs e) int IdxDesc = CompleteScreening.ListDescriptors.GetDescriptorIndex(NewDescType); - for (int X = 1; X <= NumCol; X++) for (int Y = 1; Y <= NumRow; Y++) { @@ -1963,8 +1884,7 @@ private void univariateToolStripMenuItem_Click(object sender, EventArgs e) if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) { - //LDesc.Add(Desc); - CurrentWell = new cWell(Desc, X, Y, CompleteScreening, CurrentPlate); + CurrentWell = new cWell(LDesc, X, Y, CompleteScreening, CurrentPlate); CurrentWell.Name = "Cpds"; CurrentPlate.AddWell(CurrentWell); } @@ -1977,7 +1897,7 @@ private void univariateToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentWell == null) continue; LDesc.Add(Desc); - CurrentWell.AddDescriptors(LDesc); + CurrentWell.AddDescriptors(LDesc); } } @@ -2161,13 +2081,14 @@ private void multivariateToolStripMenuItem_Click(object sender, EventArgs e) CompleteScreening.Rows = NumRow; CompleteScreening.Columns = NumCol; CompleteScreening.ListPlatesAvailable = new cExtendPlateList(); + GlobalInfo.CurrentScreen = CompleteScreening; for (int i = 0; i < NumDesc; i++) CompleteScreening.ListDescriptors.AddNew(new cDescriptorsType("Descriptor_" + i, true, 1, GlobalInfo)); // let's generate all the distributions List ListDistributions = new List(); - for (int i = 0; i < GlobalInfo.GetNumberofDefinedClass(); i++) + for (int i = 0; i < GlobalInfo.GetNumberofDefinedWellClass(); i++) { if ((bool)WindowMultivariateScreen.dataGridViewForCompounds.Rows[i].Cells[2].Value) { @@ -2296,263 +2217,13 @@ private void multivariateToolStripMenuItem_Click(object sender, EventArgs e) CompleteScreening.CurrentDisplayPlateIdx = 0; CompleteScreening.SetSelectionType(comboBoxClass.SelectedIndex - 1); - CompleteScreening.ListDescriptors.CurrentSelectedDescriptor = 0; + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx = 0; // comboBoxDescriptorToDisplay.SelectedIndex = 0; // toolStripcomboBoxPlateList.SelectedIndex = 0; // CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, true); UpdateUIAfterLoading(); } - - private void histogramBasedToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening != null) CompleteScreening.Close3DView(); - - FormForHistogramScreen WindowGenerateScreening = new FormForHistogramScreen(GlobalInfo); - if (WindowGenerateScreening.ShowDialog() != DialogResult.OK) return; - - int HistoSize = (int)WindowGenerateScreening.numericUpDownHistogramSize.Value; - - int NumRow = (int)WindowGenerateScreening.numericUpDownRows.Value; - int NumCol = (int)WindowGenerateScreening.numericUpDownColumns.Value; - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - { - CompleteScreening = new cScreening("Generated Histogram based Screen", GlobalInfo); - CompleteScreening.Rows = NumRow; - CompleteScreening.Columns = NumCol; - CompleteScreening.ListPlatesAvailable = new cExtendPlateList(); - } - - int NumPlate = (int)WindowGenerateScreening.numericUpDownPlateNumber.Value; - - - List NumPts = new List(); - NumPts.Add((int)WindowGenerateScreening.numericUpDownPopulation1NumberOfEvents.Value); - NumPts.Add((int)WindowGenerateScreening.numericUpDownPopulation2NumberOfEvents.Value); - - List MeanCpds = new List(); - MeanCpds.Add((double)WindowGenerateScreening.numericUpDownPopulation1Mean.Value); - MeanCpds.Add((double)WindowGenerateScreening.numericUpDownPopulation2Mean.Value); - - List StdevCpds = new List(); - StdevCpds.Add((double)WindowGenerateScreening.numericUpDownPopulation1Stdev.Value); - StdevCpds.Add((double)WindowGenerateScreening.numericUpDownPopulation2Stdev.Value); - - - - - //double MeanPos = (double)WindowGenerateScreening.numericUpDownPosCtrlMean.Value; - //double StdevPos = (double)WindowGenerateScreening.numericUpDownPosCtrlStdv.Value; - - //double MeanNeg = (double)WindowGenerateScreening.numericUpDownNegCtrlMean.Value; - //double StdevNeg = (double)WindowGenerateScreening.numericUpDownNegCtrlStdv.Value; - - cDescriptorsType NewDescType = null; - - // create the descriptor - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - { - CompleteScreening.ListDescriptors.Clean(); - NewDescType = new cDescriptorsType("Descriptor", true, HistoSize, GlobalInfo); - CompleteScreening.ListDescriptors.AddNew(NewDescType); - } - else - { - - NewDescType = new cDescriptorsType("New_Descriptor", true, HistoSize, GlobalInfo); - - int NIdxDesc = 0; - while (CompleteScreening.ListDescriptors.GetDescriptorIndex(NewDescType) != -1) - { - NewDescType = new cDescriptorsType("New_Descriptor" + NIdxDesc++, true, HistoSize, GlobalInfo); - - } - - CompleteScreening.ListDescriptors.AddNew(NewDescType); - } - - Random rand = new Random(); - - double StepForNoiseStandardDeviation = (double)GlobalInfo.OptionsWindow.numericUpDownGenerateScreenNoiseStdDev.Value; - - for (int IdxPlate = 0; IdxPlate < NumPlate; IdxPlate++) - { - cPlate CurrentPlate = null; - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - { - string PlateName = "Plate_" + IdxPlate; - CurrentPlate = new cPlate("Cpds", PlateName, CompleteScreening); - CompleteScreening.AddPlate(CurrentPlate); - } - else - { - CurrentPlate = CompleteScreening.ListPlatesAvailable[IdxPlate]; - - } - - - //StdevCpds = (double)WindowGenerateScreening.numericUpDownCpdsStdev.Value + StepForNoiseStandardDeviation * IdxPlate; - - int IdxDesc = CompleteScreening.ListDescriptors.GetDescriptorIndex(NewDescType); - - double u1; - double u2; - double randStdNormal; - - for (int X = 1; X <= NumCol; X++) - for (int Y = 1; Y <= NumRow; Y++) - { - List LDesc = new List(); - cExtendedList ListForPts = new cExtendedList(); - - for (int IdxPop = 0; IdxPop < NumPts.Count; IdxPop++) - { - - #region population average variability - double MeanVariability = 0; - - if (WindowGenerateScreening.AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value > 0) - { - u1 = rand.NextDouble(); - u2 = rand.NextDouble(); - randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - MeanVariability = (double)WindowGenerateScreening.AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value * randStdNormal; - } - - if (WindowGenerateScreening.AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked) - { - if (WindowGenerateScreening.AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked) - MeanVariability += 6 * (X - 1); - else - MeanVariability -= 6 * (X - 1); - } - - - - if (WindowGenerateScreening.AverageVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked) - { - if (WindowGenerateScreening.AverageVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked) - MeanVariability += 6 * (Y - 1); - else - MeanVariability -= 6 * (Y - 1); - } - - #endregion - - - #region population standard deviation variability - double StdevVariability = 0; - - if (WindowGenerateScreening.StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value > 0) - { - u1 = rand.NextDouble(); - u2 = rand.NextDouble(); - randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - StdevVariability = (double)WindowGenerateScreening.StDevVariabilityWindows[IdxPop].numericUpDownVariability.Value * randStdNormal; - } - - if (WindowGenerateScreening.StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked) - { - if (WindowGenerateScreening.StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheColumnsPositive.Checked) - StdevVariability += (X - 1); - else - StdevVariability -= (X - 1); - } - - if (WindowGenerateScreening.StDevVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked) - if (WindowGenerateScreening.StDevVariabilityWindows[IdxPop].radioButtonVariableAlongTheRowsPositive.Checked) - StdevVariability += (Y - 1); - else - StdevVariability -= (Y - 1); - - - #endregion - - - #region Number of events variability - int PopEvent = NumPts[IdxPop]; - int PopVariability = 0; - - if (WindowGenerateScreening.EventsNumberVariabilityWindows[IdxPop].numericUpDownVariability.Value > 0) - { - u1 = rand.NextDouble(); - u2 = rand.NextDouble(); - randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - PopVariability = (int)((int)(WindowGenerateScreening.AverageVariabilityWindows[IdxPop].numericUpDownVariability.Value) * randStdNormal); - } - - if (WindowGenerateScreening.EventsNumberVariabilityWindows[IdxPop].checkBoxVariableAlongTheColumns.Checked) - PopVariability += 500 * (X - 1); - - if (WindowGenerateScreening.EventsNumberVariabilityWindows[IdxPop].checkBoxVariableAlongTheRows.Checked) - PopVariability += 500 * (Y - 1); - #endregion - - - for (int IdxPt = 0; IdxPt < PopEvent + PopVariability; IdxPt++) - { - u1 = rand.NextDouble(); - u2 = rand.NextDouble(); - randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - double randNormal = (MeanCpds[IdxPop] + MeanVariability) + (StdevCpds[IdxPop] + StdevVariability) * randStdNormal; - if (randNormal < 0) randNormal = 0; - if (randNormal > HistoSize - 1) randNormal = HistoSize - 1; - ListForPts.Add(randNormal); - } - } - - - cDescriptor Desc = new cDescriptor(ListForPts, HistoSize, NewDescType, CompleteScreening); - cWell CurrentWell = null; - - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - { - CurrentWell = new cWell(LDesc, X, Y, CompleteScreening, CurrentPlate); - CurrentWell.Name = "Cpds"; - CurrentPlate.AddWell(CurrentWell); - } - else - CurrentWell = CurrentPlate.GetWell(X - 1, Y - 1, false); - - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - LDesc.Add(Desc); - else - { - LDesc.Add(Desc); - CurrentWell.AddDescriptors(LDesc); - } - } - } - - - CompleteScreening.ListDescriptors.UpDateDisplay(); - CompleteScreening.UpDatePlateListWithFullAvailablePlate(); - - for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) - CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); - - StartingUpDateUI(); - - if (!WindowGenerateScreening.checkBoxAddAsDescriptor.Checked) - { - this.toolStripcomboBoxPlateList.Items.Clear(); - - for (int IdxPlate = 0; IdxPlate < CompleteScreening.ListPlatesActive.Count; IdxPlate++) - { - string Name = CompleteScreening.ListPlatesActive.GetPlate(IdxPlate).Name; - this.toolStripcomboBoxPlateList.Items.Add(Name); - PlateListWindow.listBoxPlateNameToProcess.Items.Add(Name); - PlateListWindow.listBoxAvaliableListPlates.Items.Add(Name); - } - - - CompleteScreening.CurrentDisplayPlateIdx = 0; - CompleteScreening.SetSelectionType(comboBoxClass.SelectedIndex - 1); - - UpdateUIAfterLoading(); - } - - } #endregion @@ -2566,7 +2237,6 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) return; } - // CompleteScreening.LoadData(Path, (int)PlateDim.numericUpDownColumns.Value, (int)PlateDim.numericUpDownRows.Value); int StartColumn = 0; if (PlateDim.checkBoxIsOmitFirstColumn.Checked) StartColumn = 1; @@ -2575,8 +2245,6 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) int NumRow = (int)PlateDim.numericUpDownRows.Value; int NumCol = (int)PlateDim.numericUpDownColumns.Value; - - string[] ScreeningName = Path.Split('\\'); CompleteScreening = new cScreening(ScreeningName[ScreeningName.Length - 1], GlobalInfo); @@ -2584,9 +2252,9 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) CompleteScreening.Columns = NumCol; CompleteScreening.ListPlatesAvailable = new cExtendPlateList(); if (PlateDim.radioButtonDataHDDB.Checked) - CompleteScreening.GlobalInfo.CellByCellDataAccessMode = eCellByCellDataAccess.HD; + CompleteScreening.GlobalInfo.CellByCellDataAccess = eCellByCellDataAccess.HD; else - CompleteScreening.GlobalInfo.CellByCellDataAccessMode = eCellByCellDataAccess.MEMORY; + CompleteScreening.GlobalInfo.CellByCellDataAccess = eCellByCellDataAccess.MEMORY; cDescriptorsType NewDescType = null; @@ -2602,18 +2270,33 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) List ListWells = CurrentPlate.DBConnection.GetListTableNames(); List ListDescNames = CurrentPlate.DBConnection.GetDescriptorNames(0); - int NumDesc = ListDescNames.Count; - for (int IdxDesc = StartColumn; IdxDesc < NumDesc; IdxDesc++) + bool IsPhenotypeClassExist = CurrentPlate.DBConnection.CheckIfColumnExist(0,"Phenotype_Class"); + if (!IsPhenotypeClassExist) + { + if (MessageBox.Show("Create " + "Phenotype_Class" +" column in the current database ?", "Error DB: " + "Phenotype_Class" + " does not exist", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.Yes) + { + CurrentPlate.DBConnection.CreateNewColumn("Phenotype_Class", 0); + } + else + return; + } + + int TmpNumDesc = 0; + for (int IdxDesc = StartColumn; IdxDesc < ListDescNames.Count; IdxDesc++) { + if (ListDescNames[IdxDesc] == "Phenotype_Class") continue; NewDescType = new cDescriptorsType(ListDescNames[IdxDesc], true, HistoSize, true, GlobalInfo); CompleteScreening.ListDescriptors.AddNew(NewDescType); + TmpNumDesc++; } + int NumDesc = TmpNumDesc; cDescriptorsType DescTypeCellCount = null; if (PlateDim.checkBoxAddCellNumber.Checked) { DescTypeCellCount = new cDescriptorsType("Cell Count", true, 1, true, GlobalInfo); CompleteScreening.ListDescriptors.AddNew(DescTypeCellCount); + NumDesc++; } CurrentPlate.DBConnection.DB_CloseConnection(); @@ -2634,6 +2317,9 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) CompleteScreening.AddPlate(CurrentPlate); CurrentPlate.DBConnection = new cDBConnection(CurrentPlate, PlateName); + + + int IdxDesc = CompleteScreening.ListDescriptors.GetDescriptorIndex(NewDescType); ListWells = CurrentPlate.DBConnection.GetListTableNames(); @@ -2648,27 +2334,29 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) string[] ListS = ListWells[IdxWell].Split('_'); string[] Positions = ListS[ListS.Length - 1].Split('x'); - int Numcells = CurrentPlate.DBConnection.GetWellValues(ListWells[IdxWell], CompleteScreening.ListDescriptors[0]).Count; + // obsolete: can be optimized + List LCDT = new List(); + LCDT.Add( CompleteScreening.ListDescriptors[0]); + + + int Numcells = CurrentPlate.DBConnection.GetWellValues(ListWells[IdxWell], LCDT)[0].Count; if (Numcells == 0) continue; - List LDesc = new List(); + List LDesc = new List(); for (IdxDesc = StartColumn; IdxDesc < NumDesc; IdxDesc++) { - cExtendedList ListForPts = CurrentPlate.DBConnection.GetWellValues(ListWells[IdxWell], CompleteScreening.ListDescriptors[IdxDesc - StartColumn]); - // cDescriptor Desc = new cDescriptor(ListForPts.CreateHistogram(0, HistoSize - 1, HistoSize - 1)[1], 0, HistoSize - 1, CompleteScreening.ListDescriptors[IdxDesc], CompleteScreening); + LCDT = new List(); + LCDT.Add(CompleteScreening.ListDescriptors[IdxDesc - StartColumn]); + cExtendedTable ListForPts = CurrentPlate.DBConnection.GetWellValues(ListWells[IdxWell], LCDT ); + // cDescriptor Desc = new cDescriptor(ListForPts.CreateHistogram(0, HistoSize - 1, HistoSize - 1)[1], 0, HistoSize - 1, CompleteScreening.ListDescriptors[IdxDesc], CompleteScreening); // Desc = null; //if (ListForPts.Min() == ListForPts.Max()) // Desc = new cDescriptor(ListForPts.CreateHistogram(HistoSize)[1], ListForPts.Min(), ListForPts.Max(), CompleteScreening.ListDescriptors[IdxDesc - StartColumn], CompleteScreening); //else - // double[] Histo = ListForPts.CreateHistogram(HistoSize)[1]; - - cDescriptor Desc = new cDescriptor(ListForPts, HistoSize, CompleteScreening.ListDescriptors[IdxDesc - StartColumn], CompleteScreening); - - - + cDescriptor Desc = new cDescriptor(ListForPts[0], HistoSize, CompleteScreening.ListDescriptors[IdxDesc - StartColumn], CompleteScreening); LDesc.Add(Desc); } @@ -2715,7 +2403,7 @@ private void LoadCellByCellDB(FormForPlateDimensions PlateDim, string Path) UpdateUIAfterLoading(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } @@ -2937,7 +2625,7 @@ private void toolStripMenuItem3_Click(object sender, EventArgs e) UpdateUIAfterLoading(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } diff --git a/Normalization.cs b/SubHCSAnalyzer/Normalization.cs similarity index 85% rename from Normalization.cs rename to SubHCSAnalyzer/Normalization.cs index 663f39c..06487e4 100644 --- a/Normalization.cs +++ b/SubHCSAnalyzer/Normalization.cs @@ -11,6 +11,7 @@ using System.Windows.Forms; using weka.classifiers; using HCSAnalyzer.Classes; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; namespace HCSAnalyzer { @@ -51,7 +52,7 @@ private void richTextBoxInfoForNormalization_LinkClicked(object sender, LinkClic private void comboBoxNormalizationNegativeCtrl_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxDimReductionNeutralClass.Items[e.Index].ToString(), comboBoxDimReductionNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -61,7 +62,7 @@ private void comboBoxNormalizationNegativeCtrl_DrawItem(object sender, DrawItemE private void comboBoxNormalizationPositiveCtrl_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxDimReductionNeutralClass.Items[e.Index].ToString(), comboBoxDimReductionNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -119,6 +120,12 @@ private void StandardNormalization() // loop on all the desciptors for (int Desc = 0; Desc < NumDesc; Desc++) { + if (CompleteScreening.ListDescriptors[Desc].IsConnectedToDatabase == true) + { + GlobalInfo.ConsoleWriteLine("Cell by cell normalization not implemented yet. " + CompleteScreening.ListDescriptors[Desc].GetName() + " skipped"); + continue; + } + Neg.Clear(); if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; @@ -128,7 +135,7 @@ private void StandardNormalization() { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - if (TempWell.GetClass() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); + if (TempWell.GetClassIdx() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } double CurrentMean = Neg.Mean(); @@ -146,9 +153,10 @@ private void StandardNormalization() { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) + // for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) { - double Value = TempWell.ListDescriptors[Desc].GetHistovalue(i) - CurrentMean; + double Value = TempWell.ListDescriptors[Desc].GetValue() - CurrentMean; + TempWell.ListDescriptors[Desc].SetHistoValues(Value / CurrentStd); } @@ -198,6 +206,13 @@ private void NegativeBasedNormalization() // loop on all the desciptors for (int Desc = 0; Desc < NumDesc; Desc++) { + + if (CompleteScreening.ListDescriptors[Desc].IsConnectedToDatabase == true) + { + GlobalInfo.ConsoleWriteLine("Cell by cell normalization not implemented yet. " + CompleteScreening.ListDescriptors[Desc].GetName() + " skipped"); + continue; + } + Neg.Clear(); if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; @@ -207,7 +222,7 @@ private void NegativeBasedNormalization() { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - if (TempWell.GetClass() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); + if (TempWell.GetClassIdx() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } @@ -227,11 +242,14 @@ private void NegativeBasedNormalization() { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) + // for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) { - double Val = TempWell.ListDescriptors[Desc].GetHistovalue(i); + double Val = TempWell.ListDescriptors[Desc].GetValue(); Val /= CurrentMean; - TempWell.ListDescriptors[Desc].SetHistoValues(i,Val*100); + + TempWell.ListDescriptors[Desc].SetHistoValues(Val * 100); + + //TempWell.ListDescriptors[Desc].SetHistoValues(i,Val*100); } TempWell.ListDescriptors[Desc].UpDateDescriptorStatistics(); @@ -277,14 +295,19 @@ private void NegativePositiveBasedNormalization() { Neg.Clear(); if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + if (CompleteScreening.ListDescriptors[Desc].IsConnectedToDatabase == true) + { + GlobalInfo.ConsoleWriteLine("Cell by cell normalization not implemented yet. "+ CompleteScreening.ListDescriptors[Desc].GetName() + " skipped"); + continue; + } for (int row = 0; row < CompleteScreening.Rows; row++) for (int col = 0; col < CompleteScreening.Columns; col++) { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - if (TempWell.GetClass() == comboBoxNormalizationPositiveCtrl.SelectedIndex) Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); - if (TempWell.GetClass() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); + if (TempWell.GetClassIdx() == comboBoxNormalizationPositiveCtrl.SelectedIndex) Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); + if (TempWell.GetClassIdx() == comboBoxNormalizationNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } double CurrentMeanNeg = Neg.Mean(); @@ -302,11 +325,13 @@ private void NegativePositiveBasedNormalization() { TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; - for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) + //for (int i = 0; i < TempWell.ListDescriptors[Desc].GetAssociatedType().GetBinNumber(); i++) { - double CurrValue = TempWell.ListDescriptors[Desc].GetHistovalue(i); - TempWell.ListDescriptors[Desc].SetHistoValues(i, (CurrValue - CurrentMeanNeg) / Denominator); + double CurrValue = TempWell.ListDescriptors[Desc].GetValue(); + TempWell.ListDescriptors[Desc].SetHistoValues((CurrValue - CurrentMeanNeg) / Denominator); + //TempWell.ListDescriptors[Desc].Histogram.SetYvalues((CurrValue - CurrentMeanNeg) / Denominator,0); } + //TempWell.ListDescriptors[Desc].Histogram. TempWell.ListDescriptors[Desc].UpDateDescriptorStatistics(); } diff --git a/SystematicErrorCorrection.cs b/SubHCSAnalyzer/SystematicErrorCorrection.cs similarity index 97% rename from SystematicErrorCorrection.cs rename to SubHCSAnalyzer/SystematicErrorCorrection.cs index 5ea2d61..d4a9461 100644 --- a/SystematicErrorCorrection.cs +++ b/SubHCSAnalyzer/SystematicErrorCorrection.cs @@ -133,7 +133,7 @@ private void buttonCorrectionPlateByPlate_Click(object sender, EventArgs e) richTextBoxInformationForPlateCorrection.AppendText("\n--------------------------------\nProcess over !\n--------------------------------\n"); } - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); this.Cursor = Cursors.Default; } @@ -198,9 +198,9 @@ private void buttonRejectPlates_Click(object sender, EventArgs e) if (TempWell == null) continue; else { - if (TempWell.GetClass() == comboBoxRejectionPositiveCtrl.SelectedIndex) + if (TempWell.GetClassIdx() == comboBoxRejectionPositiveCtrl.SelectedIndex) Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); - if (TempWell.GetClass() == comboBoxRejectionNegativeCtrl.SelectedIndex) + if (TempWell.GetClassIdx() == comboBoxRejectionNegativeCtrl.SelectedIndex) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } } @@ -265,14 +265,14 @@ private void buttonRejectPlates_Click(object sender, EventArgs e) if(toolStripcomboBoxPlateList.Items.Count>0) toolStripcomboBoxPlateList.SelectedIndex = 0; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } private void comboBoxRejectionNegativeCtrl_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxDimReductionNeutralClass.Items[e.Index].ToString(), comboBoxDimReductionNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -282,7 +282,7 @@ private void comboBoxRejectionNegativeCtrl_DrawItem(object sender, DrawItemEvent private void comboBoxRejectionPositiveCtrl_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxDimReductionNeutralClass.Items[e.Index].ToString(), comboBoxDimReductionNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); diff --git a/TMP_ToBeRemoved/FormTMP.Designer.cs b/TMP_ToBeRemoved/FormTMP.Designer.cs new file mode 100644 index 0000000..95955c4 --- /dev/null +++ b/TMP_ToBeRemoved/FormTMP.Designer.cs @@ -0,0 +1,50 @@ +namespace HCSAnalyzer.TMP_ToBeRemoved +{ + partial class FormTMP + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormTMP)); + this.SuspendLayout(); + // + // FormTMP + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScroll = true; + this.ClientSize = new System.Drawing.Size(532, 261); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FormTMP"; + this.ResumeLayout(false); + + } + + #endregion + + } +} \ No newline at end of file diff --git a/TMP_ToBeRemoved/FormTMP.cs b/TMP_ToBeRemoved/FormTMP.cs new file mode 100644 index 0000000..845e37d --- /dev/null +++ b/TMP_ToBeRemoved/FormTMP.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace HCSAnalyzer.TMP_ToBeRemoved +{ + public partial class FormTMP : Form + { + public FormTMP() + { + InitializeComponent(); + } + } +} diff --git a/TMP_ToBeRemoved/FormTMP.resx b/TMP_ToBeRemoved/FormTMP.resx new file mode 100644 index 0000000..4a53d92 --- /dev/null +++ b/TMP_ToBeRemoved/FormTMP.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////Af///wH///8B////Af///wEKChoPAAAAA////wH///8B////Af// + /wH///8B////Af///wFDQaM5OjufVTY2mDs+OpoxUkaLRUE+nFs3Npg9Pz/KdystvV9AP6JVPj2iTUxK + pUktLokrOTmfM////wH///8BTE7HlU5R0tdAQ86dP0LQh1BMtbFRUs/fQEPOnzo9wXtBRM6tW17Zo0tO + u4VNT9HXT1HGoUFE0JkAAAAD////AXFy1VtdXtWHXF/abWNi0Zd/a5+BZ2HBoVVY3JdQUstvWl3bXW1l + s5l2cMeTb3DYh05Q1FNkZ9ydTU67H////wH///8B////Af///wH///8BoGMyRZ9jMk98bKlLaVBmA59k + NRufYjJRoGMyQf///wH///8B////Af///wH///8B////Af///wH///8B////AZ1iMhWcYTBfm2AwaZxh + MWWbYDBpnGEwY55jMhf///8B////Af///wH///8B////ATAwn1c1NqQ/////ATIypHcyM5cfn2Y3GaBm + NpOmazq7sXVDm7d6SCEvLmIfOjmpiywtqZcgIXk9////Af///wEvM8ihQEPVc////wE0N9Dba1KEZ5xh + MOWbYTD/pWo4/Z9kM/+iZzXrVEipzTU506dnatyDOT3U6RYXOgf///8BOz/OoUpLzLtGRqyHQ0bW7ZVh + R/OfYzH5oWY1T695SAmwc0Bdn2Mx/ZxnReNRUKN1TEy/tUBE2uMzM4ED////AUhL1aFmaee1c3bpeWVa + vOujZTD/o2Uyqf///wH///8B////AaVoNYl5XInVT1Hg105Q1Y1FRJdb////Af///wFVWN2fZGbkc/// + /wFzXpzZp2cy/6doM4H///8B////Af///wH///8BZmnmiWFj18teX9DDWVzluf///wH///8Bg4bgL4CD + 3yH///8Bo3p9cbp4Sv+4d0qF////Af///wH///8B////AVVYwQWkputLgILsU1NVzQ3///8B////Af// + /wH///8B////AbV4Sxu9fVL9vHxSw////wH///8B////AcqMX43VmGptonBBA////wH///8B////Af// + /wH///8B////Af///wH///8Bv4BXocCBWP/PkWah2ZtvV7+CWJ3AgVj/voBWs////wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWQvOkGefzJBo+8aIYf/Eh2D/wINcu7p/VRn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AdKjdhHgpnsvyo9kG////wH///8B////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B2IVLA9iFSwPYhksD////Af// + /wH///8BBwgTEQsLHCsAAAAL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkAAAAHAAAACQAAAAUAAAAH////AU0vGg2eZzoNcEoqEXFK + KxEWEA4JAAAABQAAAAkyM7tlTUze8yEipIEAAAADAAAABwAAAAkAAAAJAAAABQAAAAMAAAAJAAAABf// + /wEAAAAJAAAAA////wH///8B////Af///wEuLW8rS0m3rzw9nps+PaupLy+LSz09qZMaG0MLPz2pqUc4 + YktOSayrREKipzw7qakuL4RFPj2rpSYnXg0vMbl5MzbW6xISLhE9PaSRR0ausURDrbE8PKNzRUKNY1RS + u7UyNJuLFBU3Fz4+rqknKHEb////Af///wH///8B////ATk8x306PcvdREe2pT1B2OkxM7JfPkLX2Scp + Zg88QNn3Qj6nmzs90fFNSZqfPUHd/TQ2m0s9Qdr1Hh9LDzU4wbc+Qt//NjijV1RY2qVfYuL5YWXKnUhL + vHE6PNT3NjmglUpNxtUuMIdLPUHb+zI0lCn///8B////Af///wH///8BPT+dL3ByzcdpatbnS07e5zg6 + tl9MUNvfFhY5G0dK3/lWRXxrcG6+yWxrz+VPUuL7NzibSUlM4PUnKGYvQ0bZ9z9CyKlLTtCzHR9UG2Jl + 389ER8G9LS+ERVNV5f9tbdfRYmLe8UdJvXFNUOT7Ky5+QQAAAAf///8B////Af///wFQULpDenrc52Zm + yslNUN7PQkXBW2dq6ftvbsPBUlTk+2pRfGt6edrvbGe3zU9S4u09P6c9VFfk9UlKt4NTVd3LQUO4MV5h + 5/VTU66ldXTQ14OF9P9QUsKBcnXr3Wdnw8NSVN7vPT+pM15h6PtsbdXdTE2yV////wH///8B////Af// + /wF2eNZBcnTgYUlMxh9NT8IbXV/MQXh62lNlWa1JomQwQ4lqgGmHdauLaFaXQUNErzdgYun1UFK4QVpc + yy////8BXmDPT2xcnGeAa5l9gWuafXxhhU1cWbode37hXU1QzSdCRKsFXF7PT25w1E9QUs8n////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AZ5lMwWgYzJFoGMyTaBjMk2gZTNBVVCrKXR2 + 4q00NIMH////Af///wGgaToLoGMySaBjMk2gYzJNoWUzP51mKgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZ9kMymfYTFZn2ExWZ9i + MVmfYzRDoWc5E6RvRgOkcEgDn2Y7FZ9jM0mfYTFZn2ExWZ9iMVmgZTUj////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bomw2A55i + MkedYTBjnWEwY51hMGOdYTBhnmIxWZ1iMVudYTBjnWEwY51hMGOdYTBjnmIySaRoOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BnGY3B5xhMkmaYDBvmmAwb5pgMG+aYDBvmmAwb5pgMG+aYDBvmmAwb5xiMlWgZjYL////Af// + /wH///8BAAAAA////wH///8B////Af///wH///8B////Af///wEAAAANAAAALwAAACcAAAAD////Af// + /wEAAAAhAAAAMQAAABX///8BnGY6A5xiMyWaYTJXmWAwcZlgMXuZYDF7mWAwc5phMV+bYTMxomY6Bf// + /wEAAAAJAAAAJwEBBTsFBQ5BAAABMwAAABkAAAAD////Af///wH///8B////ATAxkjs8PMrnQUHIyQYG + DgX///8BAAAAAzc4uKNAQM3nPD20Zf///wH///8Bomk6O6BnNqOkajnlqm49+7B0Qvu4e0jrxYZRscmK + Vk+jb0UDAAAACTc1cmVMSsPTQUHT9zo71fszNMntKSugrw4PKi3///8B////Af///wH///8BMTSdQSsv + 0f8+QdjhCAgSBf///wEAAAADLTDAtTM32f89QcVxoW5ACZ1kNJuaYDD9mmAw/5pgMP+aYDD/mmAw/5pg + MP+cYTH/pmo4/61xP7FBNmZLOjvS9Ssv0f8+Qtrhb3Lmy21x6PUwNNX/NTm7sQAAAAn///8B////Af// + /wE0Np5BMjXV/0RH2+EICBEF////AQAAAAMyNcS1Oj7d/0VGxHOfZTOtnGEw/5xhMP+cYTD/nmMx/6tu + O/m3eUT5qm06/51iMP+cYTD/nWIw/4VbXvVER9z/OTzQtz0/oQcAAAADPT+dSTs/2/1ESN71ICFTEf// + /wH///8B////ATY4oEE5PNj/SEvZ5QAAAS8AAAAtAAAALTU4vL9BReD/dlqB055iMf+eYjD/nmIw/59k + MtekajlPqnVEEbR8SxPKilRZqGs5555iMf+eYjD/nmIx/5Z8krk7PZ1DAAAAKRAQI0dPTZiXPD/Z/0NH + 3vMzM4EL////Af///wH///8BOTugQUBD3P9QUuL7VFTO4VRTzuFUU87hSkzY9UpM3f+aZEb/oGMx/6Bj + Mf+hZDLjo2o6F////wH///8B////Af///wGmazsxoWQy+aBjMf+gYzH/mGAz1VtYmpdhX8rVXl7f+UlM + 4P9ARN3/QUXRmf///wH///8B////Af///wE7PaJBSErg/2Vo7P10d+rvdHfq73R36u9naun7YlSz/6Jk + MP+iZDH/omQx/6NnNXX///8B////Af///wH///8B////Af///wGjZjSnpGYy/6RnNveKY3L/T0/e/01Q + 5v9VWOr/UVTi2URHx30iI1sN////Af///wH///8B////AT0/pEFOUeT/W17k4RkZQAc1NZIDIyNcBUhL + 0LV5XIz/pGUx/6RlMf+kZTH/o2s6Lf///wH///8B////Af///wH///8B////AahsOjOtcD1PTkmkW09S + 5f9PUuHvUFLVcUFCrCUsLGA7S0mEg0E/eVsAAAAD////Af///wH///8BQEGlQVVY6P9hZObhBwcRBf// + /wEAAAADTlDStYhidv+mZjL/pmYy/6ZnM/2lcEEL////Af///wH///8B////Af///wH///8B////Af// + /wFKTMVNWFvr/1lb2NsZGjpXFBQoTVlZwr9YW+r/XF7ir////wH///8B////Af///wFERqs/X2Lu/2ls + 6eEHBxQF////AQAAAANVV9ezkGdz/6hoMv+oaDL/qGgz96V0RQX///8B////Af///wH///8B////Af// + /wH///8B////AURGrwuDhu7PeHvz/2hp7v10c+79ZGbw/1te6fdQUs07////Af///wH///8B////AUxO + uyGPkeiXgIPggf///wH///8B////AXF02WWuf2/XuHVH/7h1R/+2dUb7o3ZEBf///wH///8B////Af// + /wH///8B////Af///wH///8B////AVVYwRGkpeZ9pafvsYuN7rdydOmTU1XNM////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Abl5TIe8ek7/vHpO/7x6Tv+pc0Yb////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bt3lMV718Uf+9fFH/vXxR/7Z5 + TVH///8B////Af///wH///8B////Af///wHMlGU12qd2O6x4Swv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGtc0cTvX1T8759 + VP++fVT/u31Su6BtQgP///8B////Af///wH///8BpHVFA71+U8fQj2P/2Zpt9dKWaLeicEEF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wG7fVOVv4BX/7+AV//AgVf/zIxhlbaBVAv///8B////Aat0SAe7flONv4BX/7+AV/+/gFf/vH5Uq/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbJ4TRPChFrfwYNa/8CCWv/HiF//2p5x6d+jdbHTlGirwYRa48CCWv/Agln/wIJZ/7+C + WPe2e1Av////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AcGFWSfNj2bdxohh/8GEXf/BhF3/woVd/8KEXf/BhF3/wYRd/8GE + Xf/Ag1z5un9VXf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AceNYBHeoneN3KJ369SYcP/LjWb/yItk/8iL + ZP/HimP9wIVcv7d9VDn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wG5h1oJ1qd6O+Ot + gVvcoHVh0ZVqTbiAVR3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AdiFSwPYhUsD2IVLA9iFSwPhhFED////Af///wH///8B////AQIC + BgkMDR87CgoYPQAAABf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bq182B7NvPgm2c0AJqGg7C6hoOwu6e1AH////Af// + /wH///8B////ASkrfh9KSNfxOznU8R8flJEBAQML////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAZAAACMQAAACkAAAAlAAAALQAAAA8AAAApAAAAIQAAAAMAAAAXIRQKOWJAJR9YOSMhJxkPPSoa + DjsiFw4pAAAALwAAABMAAAAjAAAAKTAzjB0+P8t7TE7g4Swt2vkgIWI1AAAAAwAAACEAAAAxAAAAMQAA + ADEAAAAxAAAAFQAAAAsAAAAnAQEENQAAACcAAAAJAAAABwAAACsAAAAh////Af///wH///8B////Af// + /wH///8B////AQkJFxFOTLGxVFLW605PxNc5OazHSUjF3SwsbSdEQ8HXQ0O8rQAAAAM2N6R1TErL5Uc7 + eVtNRpOPVlLR6VRUzOM1NaLDS0nL4Tg4mEM/P7azSEfC1SEhUhEAAAAFLS+xoTQ34/8xNKuNAAAABz4+ + tatUU8rjUVDJ409OyeNRT8zjODmmbzo4e2VcWcjXZGPc7T9AvtUfIWVXICJZGUZFxNtCQ7ejAwEBA/// + /wH///8B////Af///wH///8B////ATY3mz82Odn/NDfC0VpcxJc7Ptj9QkXY4ScnXhsyNs/1Q0fVxwAA + AAMxNLOHPkLj/0U9hXU3Oc/1NTjJ61lVq5NER9XxP0Pf+y4veyUwM8PNQ0fd8SYmXRMMDR4VNTjI5zc7 + 3P9DRtLZCgsYE0NGzaNna+7/ZWnb92pu2NNobOHLNjmodz0/0O0yNc3tTVC9l1xg4vVCRczTJyhoIzQ3 + 0vlDRs+5AwICA////wH///8B////Af///wH///8B////AT0+qSdnaur3UlTO3zc3jZM3OsnvS07c2SYm + XRs6PdP1SUzXxwAAAAM2OLaHR0ro/1FEh29ZW9rjZGbd8UI9jqs4ObTbSUzi+ScnYB02OcfNS07h8SUl + WRMzNZBhPkDe/zs+xedLTuj9LS6BTT5AqRVjZuTVUFTk+y4wjIEAAAEPNTedSz1A3v9TUsfXV1OopVZU + scFQTqqxKCtsLzs/1/lKTdS9BgYMA////wH///8B////Af///wH///8B////AQAAAQc2N39lc3XDvXt9 + 3+VgYuP/UVTf2yYmXRlFSNj1UlXV0wAAABc4OrKTT1Lq/1hGgW9OOVFpbGmsw3x81eFrbeT7UFPl+yws + cR89P8rNUlXk8RsbQRs/Qb23RUjd+z0/q1dMT+b9REe7oQAAABMlJ2k5bG/k6VJW4fknKXFrNTecU01Q + 5v9nat3laWzXv19h2+1MT+L3MjWGMUZJ3flTV9XRAAECIQAAABH///8B////Af///wH///8B////ATc5 + ig9qaNHfVVXF0VFPi5FPUdv3UVPczSsraRdMT931a27r+URElJtYWMnXUFPo/2dPe2doYr7FY2HP6VVK + d6VWVcrpUVTj8ystaw9DRs7NWVzm8SQlXDtKTNv3TE7Xxzg5iAdIS9fXWFvg6zg4f3dcWauvXly9z4OE + 9f9VWN/zMjOFSWJk6e9YWtjjTkyMlVhY2/FIS9XJMDF6G01Q4PljZu37XFqzuUJCl2kAAAAD////Af// + /wH///8B////Af///wFtb9V3m53s7YiJ8fddX+fpR0rKWTg5jQ9madzjXmDWy5CR6+N1d+73Uk/Gu5ph + PENxXJJ5nJzl6Y2O7/lnaejzSUvMiQcHDgNKTNLNYWPo8URFrHNzdefvSkzIb////wFNT8qDd3rq70lL + vceDhObzhojn84eI5/OAg+rxRke0R2Nmz0+dn+zjgoPw91JU389GSL8vPT6eEWhr3+lcXtbZj5Hv9VVX + 1aX///8B////Af///wH///8B////Af///wH///8BOjmpDz9Arx0/QqgN////Af///wE5PZsLOj2cBzk8 + qAtAQq0bmmM6G6FjMUWhZDFFmGA6SYVZVVePXkhNoGs8DwAAAANPUtXNaGrq7ywtbxc3O5gLQEKjA/// + /wE9QaAFNzuZC45eSyeXXzlJl185SZdfOUmYYTtHoGY5M6l2QAc5O6YLP0GuGUFCowX///8B////ATk8 + mgs8P50HPT6tF0JDpgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnmM0CaBjMkWgZDJLoGQyS6BkMkugZDJLoGc2MX9iQwNlaNrJeXzl7TQ0 + gw3///8B////Af///wH///8Bom0/B6BkM0GgZDJLoGQyS6BkMkugZDJLoWYzPZxkKgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaBlMzGfYjFTn2IxU59iMVOfYjFToGMyUaNn + OCVAPZIPNjeXEf///wH///8B////Af///wGpckMFoGY2NZ9iMVOfYjFTn2IxU59iMVOfYjFToWY1Jf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaBlNg2fYjNRn2ExW59h + MVufYTFbn2ExW59iMlmfZTY5omg7E6VtRgWecUcDpnBIBZ9nPhWfYzVBn2EyWZ9hMVufYTFbn2ExW59h + MVufYzNPoms8Cf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGeZDQjnWExX51hMGGdYTBhnWEwYZ1hMGGdYTBhnWIwX55jMlWeYzJPnmMyVZ1iMF+dYTBhnWEwYZ1h + MGGdYTBhnWEwYZ1hMF+gZTYl////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BnWM0L5xhMGWcYTBpnGEwaZxhMGmcYTBpnGEwaZxhMGmcYTBpnGEwaZxh + MGmcYTBpnGEwaZxhMGmcYTBpnGEwZ55kMzunazID////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wEAAAADAAAAA////wH///8B////AZ1jNCmaYDFlmmAwcZpgMHGaYDBxmmAwcZpf + MHGaYDBxmmAwcZpgMHGaYDBxml8wcZpgMHGaYDFtnWQ1O6JlOAX///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAXAAAAHwAA + AB0AAAAL////Af///wH///8B////AQAAABEAAAAfAAAAHwAAABMAAAAD////Af///wGfZTgRnGEzRZpg + MW2ZYDB3mWAweZlgMHmZYDB5mWAweZlgMHmZYDB3mmAwc5thM1WeZDcdrV4xA////wH///8BAAAABQAA + ABEAAAAhAAAALQAAADEAAAArAAAAIQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////AQEB + AwktLGpnMjBthTMxcX8fH1Ar////Af///wH///8BAAAAAygnX0cyMW6DMjBtgyopYU8AAAAF////Af// + /wH///8B////AaJmPBGiaztXqG4+ma5zQrW1eEa/unxKubt+TKO1eUhro20+IZtjPQP///8B////Af// + /wEAAAAJAAAAKxQULFlAPXiNTEmcpUhGpK09O5ilKChshQoKGlEAAAAlAAAAB////wH///8B////Af// + /wH///8B////AQUFDQk1N8XZOTna/0RF5v8yM6JZ////Af///wH///8BAAAAAzEzs5E4Odr/Pz/g/z5A + x6UAAAAF////Af///wGjbD8NoWg5d6BmNtehZjb9oWY2/6FmNf+iZzb/pmo5/61xP/+9fkr/yIlU6cyN + V5W2fU0h////AQAAAAUDAwgtTEqdo1lW2/U9Pdr/LS/U/ygr0v8pLNP/LjDV/zEzx+0lJ3yNAQECIQAA + AAP///8B////Af///wH///8B////AQUFDQkvMsHZKi7Q/z9D5f8zNaJZ////Af///wH///8BAAAAAy4x + sZEqLtD/Njrc/z5ByKUAAAAF////AaFpOkOdYzPdmmAw/5pgMP+aYDD/ml8v/5pfL/+aYDD/ml8v/5pg + MP+aYDD/nWMy/6drOf+1d0TvsndGYwcEAxM8PKCbOzzZ/ykt0P8sMNP/SEzo/3J27/+Hi/L/U1fk/ysv + 0f80ONb9Jyl9cQAAAAn///8B////Af///wH///8B////AQUFDQkyNcPZLjLT/0RH5/81N6JZ////Af// + /wH///8BAAAAAzE0s5EuMtP/Oz7f/0FEyaUFBAIFomk5XZxiMfmbYC//m2Av/5tgMP+bYC//m2Ew/5xh + MP+cYjH/nGIx/5thMP+bYC//m2Av/5tgMP+cYTD/o2c2/YhbQpk4O9D1LjLT/zA01P82Ocm5Pj+5RTs8 + sC1JS8JReX3k0UNH5P81Odn/REfS1QgIFBP///8B////Af///wH///8B////AQUFDQk2OcXZMzbV/0lM + 6v83OKNZ////Af///wH///8BAAAAAzQ2tZEzNtX/QEPh/0VHyqWcZjdJnmMx+ZxhMP+cYTD/nGEw/5xh + MP+cYTD/oGUz/65xPfm+f0rxxYVP+bd5RP+jZzX/nGEw/5xhMP+cYTD/nWEw/51jNP9gVLP/S0/i/zxA + 1N09Pp4P////AQAAAAMAAAAJJSZqRTo91/01ONf/TFDk9SYnZB3///8B////Af///wH///8B////AQUF + DQk5PMfZODvY/01Q6/8wMoxnAAAAGwAAABsAAAAbAAAAHTM2q5k4O9j/REjj/1FOvrefZDPlnmIw/55i + MP+eYjD/nmIw/55iMf+gZjXNp248V6p1Qx2pdUcRtn1MIc+PWWO7fEjdomY0/55iMP+eYjD/nmIw/55i + MP+hbk39iovfv0tNx3UAAAANAAAAGwAAACsAAAFBNDNzgz9B2v04PNn/Sk3j9TMzghX///8B////Af// + /wH///8B////AQUFDQk8QMjZPEDa/1FV7f83OIijKilWeSopVnkqKVZ5KilWeTk7pb88QNr/SEzm/4Fg + gfufYzD/n2Mw/59jMP+fYzD/n2Mx/6JnNpmhckMJ////Af///wH///8B////Af///wGqckIVqGs6x6Bj + Mf+fYzD/n2Mw/59jMP+fYzH/lF8zaQAAAC8CAgdJKytQdWJem6VwbMjTYGDj+zxA2v89Qdv/REfVyTEx + eAP///8B////Af///wH///8B////AQUFDQlAQ8rZQUTd/0xP5v9ZWuf/Wlrn/1pa5/9aWuf/Wlrn/1ZX + 5f9BRN3/UVHZ/51lQP+gYzH/oGQw/6BkMf+gZDH/omc1wZ9wQwX///8B////Af///wH///8B////Af// + /wH///8BpWs8H6JlM/GgZDH/oGQx/6BkMf+gZDH/lF8222dipa1zcNnramjp/01P4/9BRd3/QUXd/0JG + 3v9BRdn3QUS/R////wH///8B////Af///wH///8B////AQUFDQlERszZRknf/11g7P96ffL/en3y/3p9 + 8v96ffL/en3y/3l88v9PUuT/aFaq/6JkMP+hZDD/oWQw/6FkMf+iZDH/o2s6R////wH///8B////Af// + /wH///8B////Af///wH///8B////AaNnNpGhZDH/omQx/6NlMv+maDX/nWhN/1hV2v9GSeD/SEvh/01Q + 5v9UV+3/VFfr/UpN2MtDRb1FBgYTA////wH///8B////Af///wH///8B////AQUFDQlHSs/ZS07i/2Fk + 8/9YWsmdY2bVa2Nm1mtjZtZrY2XUbVRXzr9LTuL/gl53/6NkMP+jZDD/o2Qw/6NkMP+kZjPlonJACf// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRsOzmoaTX7qm0526RpOZlpWqfdTk/f/0pN + 4v9QU+j/Wl3r81td5MFPUtJ9MjOISwYGDy8AAAApAAAAFwAAAAP///8B////Af///wH///8B////AQUF + DQlKTdDZT1Ll/2Rn9P9AQqlZ////Af///wH///8BAAAAA0RHvpFPUuX/k2NZ/6RlMf+kZTH/pGUx/6Rl + Mf+laDS3////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQgWpcUEvpXJFBRob + QxNOUNrzUFPl/1RX6P1ER72LOjuYGwsLGAUAAAAPNzd4Z1tYoKdWVJafRkWKYQAAAAP///8B////Af// + /wH///8B////AQUFDQlOUNLZVFfn/2ls9f9CQ6pZ////Af///wH///8BAAAAA0dJv5FUV+b/n2ZC/6Zm + Mv+lZjH/pmYy/6ZmMv+maTaR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ASwtbg9RVN7zVVjp/2Nm6vcTEzBZAAAANQAAADMCAwdFUVLI01ha6v9fYvD/V1rWl/// + /wH///8B////Af///wH///8B////AQUFDQlRU9TZWFvp/21w9/9ERatZ////Af///wH///8BAAAAA0pM + wJFbXOT/o2c8/6ZnMv+mZzH/pmcy/6ZnMf+naTaB////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////ATAxcwNdX9+7Zmny/11g7/9aW9nrXVyzu2torrOAfNHbZ2jt/1da + 6f9aXev/Sky+Rf///wH///8B////Af///wH///8B////AQgIEwdWWNfXZGfx/3V4+f9ISbJV////Af// + /wH///8BAAAAA09Rx41kZef/pWk8/6hoMv+oaDL/qGgy/6hoMv+oazd3////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFPUMItnZ/x65OW+f9oa/L/YGPv/2Nl + 8P9hY+//YWTw/15h7f9TVdOfODiMA////wH///8B////Af///wH///8B////Af///wFoa9W3m57q35CS + 6t9OUMBB////Af///wH///8B////AVVXzHGVluffsnVL/bZzRP+2c0T/tnNE/7ZzRP+yc0R7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVVjBJ5uc + 4qWys+/pqqz1+ZeZ9fuDhvD1bG7oyVNWz2tDRKQH////Af///wH///8B////Af///wH///8B////Af// + /wEwOYsDKTqAAy46ggP///8B////Af///wH///8B////Af///wE4PHoFuHhM47t5Tf+7eU3/u3lN/7t5 + Tf+1eEuL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEwMZkHPj+vGUFDrR09P6cNNzeIA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuXlMvbx6 + Tv+8ek7/vHpO/7x6Tv+4eUyv////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bt3lNk718Uf+9fFH/vXxR/718Uf+6e0/fp3FDB////wH///8B////Af///wH///8B////Af// + /wH///8B////Aax2Rwmxfk4T////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bs3dLTb59Uv+9fVL/vX1S/719Uv+9fFL9sXdLP////wH///8B////Af// + /wH///8B////Af///wH///8B////AbZ5TV/cn3Dz5Kl5yeStfI/WonJRu4hZGf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqXBEDbx8UuW+flT/vn5U/75+VP++flT/un1Ru6Bt + QgX///8B////Af///wH///8B////Af///wH///8BpHVFBbt8Uce/f1X/xYRZ/8+MYP/bmm3/zpNl46Jw + Qgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Abh7UIO/gFf/v4BX/7+A + V/+/gFf/wIFY/8OFWpWicUIH////Af///wH///8B////Af///wGkcEMDuHxQh7+AV/+/gFf/v4BX/7+A + V/+/gFf/un1Sm////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aat0 + SRO9gFbhwIFY/8CBWP/AgVj/wIFY/82MYv/eoHLH1qR0UbJ/UBmndEYLqnNGE7h9UUe8f1W7wIFY/8CB + WP/AgVj/wIFY/8CBWP+/gVf7sHdKLf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wG2e1FFxYdd+cKEW//Ag1r/wINa/8GDWv/Ki2H/3Z5y/+SnevffoHTt0pJn88WG + Xf/Bg1r/wINa/8CDWv/Ag1r/wINa/8CDWv+4fVKT////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BwYVZVc2PZvfFh2D/wYRc/8GEXP/BhFz/wYRc/8KF + Xf/DhV3/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/7uAV72pc0QJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcSIXUHbnHLb15hv/8iK + Yv/Dhl//woVe/8GFXv/ChV7/wYVe/8GFXv/ChV7/woVe/8KFXv/BhV39un9Wn6t1SQv///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGueUwN2qV4c+WugtXkq4D92p51/9GTa//Mj2j/y45n/8uOZ//Nj2j/yItk+cCFXLuzfFBD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJtQAXElGcv2qx/Y+OvgoXhpnuT255zjdWXbX3DiV9VsXtQHaBu + RAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcAAAALAAAACQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bx3Q+A9iFSwPYhUsD2IVLA9iF + SwPYhUsD2IZLA////wH///8B////Af///wH///8B////AQAAAAUJCRgzDxAmVQkJFkcAAAAjAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Aa9q + OweydkAJtHhACbJ2QAmuckAJrnJACbV2QwnjmYYD////Af///wH///8B////Af///wEHCBMHNzW7uUlE + 3PMsKsnpICGIkwICBRv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAsAAAATAAAADwAAAAkAAAAPAAAADwAAAAcAAAALAAAAEQAA + AAv///8BAAAAAxMLBQ9UNB0dgFQwFbJxQQ90Sy0XTjQdH1E0Hh9wSi0VFxMQDwAAABEAAAAJAAAABwAA + ABEAAAANHB5KBzAyxMttbuXvU1Tr/yQl2PskJHNdAAAABf///wEAAAALAAAAEQAAABEAAAARAAAAEQAA + ABEAAAAPAAAABf///wEAAAAHAAAAEQAAABMAAAANAAAABf///wEAAAADAAAADwAAAA8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAR0PECxTIiFRbxUWNV0DAwg/EhIvXRQU + NFkKChoXFBQyPxESL2EQEi07AAAAAwYGDQ0WFTBVIRsxaUUuLzVgPSkjJRkZTyolSXcpIj9xIBURTRIS + LFUSEzFfEhMtKQ0OISMSEzBfFBQzUwcHEQ1ERqMPNjiWIS8yy90wM+b/LjCztwEBAg8AAAAFEhIvOxES + LmEQEi1jEBItYxASLWMQEi1jEhMxXQwNIBsAAAATAwQLPRYXPWUkI1NzFBQyWQEBAikAAAAHBwcRDxMU + MlMSEzFdDg4iH////wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAk7Oo+DZF/f91hW + 6v9dXt/7NTiq0UxL2vtOTdT3MjJ7Hz09u7NWU+P9QULAsQAAAAMpK2kbQ0PK7VRT4/1FPpF3QDRWW2Fc + 0eVaV+f/X1/n/T9At91DQ8nxU1Hg/T4+qmE3OKVpT03b/UxM0uklJV0X////AQkKGBUwMrrPLzLc/z1B + 2vUaG0MvAAAABT0+uatZVt/9Xlzg/VtY3/1YVt/9WFbf/VRS4P0yNJFVLSxpX2dizd1kYOn/cW/u/0lL + 2PktL56zDAweJScqbyFJSNP1U1Lh/TIzkU3///8B////Af///wH///8B////Af///wH///8B////Af// + /wEcHkYROjzL6TE01/82OcTVXF7Op1RY3/c1Odz/P0LR2xERJg0xM7i1Oz/i/zw/xbUAAAADKixtGy4y + xO9DR+j/QzyNez89s7cyNtf/MjXI8VdVvaVhY9jlMjbY/0JF4PsyM4UxNDeoazA01/9FSNvrJiddFwAA + AAMmJ2dFNDfP+TU52/9GSuv/MDGOewAAAAc6PcGdYGTs/2xw6/90d+P7cnbl+XF15/dZXeL1MTOMX0JD + yd8zNtj/NjrL41lczLdsb+n7Sk7n/zY4pHUoKm4jLjLL+UZK5/8xM5JP////Af///wH///8B////Af// + /wH///8B////Af///wH///8BNjd/DTs+0PFMUO7/LjCKnwUFDkMwM6axPkLi/0VHz80GBg8JNTi7tUNH + 5v8/Qse1AAAAAyosbRs0N8fvSk7s/0lAjn0+Pry/SU3q/z49stMuIB9nNi9jiTY62f9KTeH5KytuJzc6 + qWs3O9v/Sk3d6yYnXhcAAAALNzmmmzk93P86Pc39RUnn/0BCxMkICBIVQEKpHV1g3tlfY+//Oz7I7SQm + X2UqLGcjP0CXGTI1kFc3Otb9PEDY/R0fVW8KCyJNMDKRqTM1mbMrLXxrJSdnJTQ3zvlNUOv/MzWWUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFOT8iNmpzy+3h56P1cXdTnSEnG50NG + 5P9JS9PPBgYRCTk8vrVJTen/Q0bGtwAAAAUpK2sbOTvK71BT7/9OQ45/W02QaYqM6vWGiO3/Y2PZ8VJQ + veE8P9v/UFPj9yoqZyU5O6prPkHe/09S3+smJ1wZERIsIT9ByeVBROH/PT+xpz9C2vtSVeb5JidmRQAA + AAM/QrMxaWzo6V1h7v89QMThFRY3RwAAAA04OqlvPUDc/2pq7f9+fOXzfnvl83585fNtauDzUlLGwykr + byU5PdH5VVnw/zU2mFkAAAAD////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgSJygq + bXlZW7Sren3V1YSF5vdSVej/TVDUzQYGEAk8Pr+1Wl7u/0dKw8cAAAAdGhtEMT5B0PNWWfD/UkWNg2c9 + G0M7LEZ/UUyUtXV0xtGEhd/zW17l/1VY5vkvL3kpPD2sa0RH4f9UV+DrISFPHTEygmNER939R0rc+Ts8 + nCtBRM/XWFvx/zk8oY8AAAAXAAAAIS8xf11zd+r5XmLu/zw/tssLCxo3ODulY0RH4P9gZOv9VFbAtVZZ + xqtSVczfSk3l/0ZJz7stL3cjP0LU+WVo9/8yNZGFAAAAJQAAABkAAAAD////Af///wH///8B////Af// + /wH///8BABcXA1dWt599edztPT6gsx4eQWdHSLPJT1Lq/01Q0sMFBQ0FQELBtWFk8f9iZeD1KSpqgzc3 + cYlLTd39Vlnu/1xLi3tiUo2De3bR61dUut06LDyJSEF7s0pN5P9UV+T1MTR8FT1ArGtKTuX/WVzh6xgX + OydERry7S07m/0hLzsE6On8FQkTBiVVY7v9RVNPdICBLU0VCgpNFQoGVT06ry4aI9P9gY+7/P0GyuS4v + ejdUV+T1Y2b0/zU2ip8nJ1B1WVjR5UpN5P9CRb57Li93IURH1/lrb/v/TE7H31FOjJ0+PYZ1AAAAB/// + /wH///8B////Af///wH///8B////Af///wFGSMFplZf0/YaI7/+Jhu35e3ry/09S5/9HScZ/AgIFA0dJ + x7F4e/X/YmTf+5CQ8v2RjvD9WVzs/01O1vF+V15Td1RpWXl75fWXmfP/g4Hr+4uI8v1TVur/SkzSxSgr + WAVAQq1rUVTo/15h4usjJVk3XF7c82hr7/9ERrxv////AT9BpTdcX+b9dnnx/Tw+oq17e/D/kpL2/5OS + 9f+Rkvb/lZj3/2dq5/cyM3whWVzPg6ut9/2Ehe/9h4Xu+15f7P9IS9TXQEKnFTY4ix1XWt73bnHw/3d5 + 6/+Ojvb/WFrV0xsdQQv///8B////Af///wH///8B////Af///wH///8BQECgA1NWxFWHid+xgYPixWNm + 4LVKTMhvQkOqB////wFNUMJraWzWo0hKumFoatGFhIbhw1da2K1tVYBXpGQwP6RlLz92V3RngHrEt4yK + 1tFwbdLNV1K9n0RFqh3///8BQkOva1da7P9jZuTrOjyWS2Bj1KNeYdGfQkOoHf///wE7O5EDVVjIlWVo + 1qFHSLOLbWjBtXNtwbdzbcG3c23Bt3Rvw7VjYMKnZFKCEVdOkAVWV8hhi43js21w4rtPUtOBQUSuGf// + /wFCRKsPWl3OnV1gz51VV8B5foDiv1FS0ZFARaMH////Af///wH///8B////Af///wH///8B////Af// + /wH///8BOjOVAz09lAU6OpID////Af///wH///8B////Af///wH///8B////ATo9lAU/QpQDoGU0H6Fj + MUWhZDFFoWQxRaNkL0WhYzFFoWMxRaNmMjumcUMJ////AURGsWtdYO7/aGrm6ycnYRf///8B////Af// + /wH///8B////Af///wH///8BpWc3GaNlL0OjZC5Fo2QuRaNkLkWkZS5FpGUwQ6JnNTmncz8J////ATY6 + hQM9PpAD////Af///wH///8B////Af///wH///8B////ATo8lAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ1jNA2gZDJFoWQyS6FkMkuhZDJLoWQyS6FkMkugZDJJoWo6I////wFLTb1lio32/3d6 + 6OkyMn4T////Af///wH///8B////Af///wH///8BpHQ9BaBkNTmhZDJLoWQyS6FkMkuhZDJLoWQyS6Fk + MkuiZzQ7nGQpBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGobywDoWQ0NZ9jMVGfYzFRn2MxUZ9jMVGfYzFRn2MxUZ9l + NEelbDwTSEqzJ1VWw2tQUr5dQECiA////wH///8B////Af///wH///8BsH1OA59mOSWfYzJPn2MxUZ9j + MVGfYzFRn2MxUZ9jMVGfYzFPpGg2Jf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNrMxefYjJRoGMyVaBj + MlWgYzJVoGMyVaBjMlWgYzJVoGQ0SaJtPxethGUD////Af///wH///8B////Af///wH///8Bn3VUA6Jp + OSOfZDNRoGMyVaBjMlWgYzJVoGMyVaBjMlWgYzJVn2IzTaRwOA3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGnZjQDnmM2NZ5gMVufYDFbn2AxW59gMVufYDFbn2AxW59hMVufYzNVn2Y3NaRpPBWlbUcHonJFBaJx + TAWlb0YHn2hAF59lODufYTJZn2AxW59gMVufYDFbn2AxW59gMVufYDFbnmExW6BnNy////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaJsNQ2eYjJNnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ1h + MGGeYjFbn2MyUZ9lM0meYzNLn2MyUZ1iMV2dYTBhnWEwYZ1hMGGdYTBhnWEwYZ1hMGGdYTBhnWEwYZ5j + M02jaDoN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BoGU6F55hMlWcYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1hMGWdYTBnnWEwZ51hMGWdYTBlnWEwZZ1hMGWdYTBlnWEwZZ1h + MGWdYTBlnWEwZZ1hMV2gZjcb////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGcZjcZnGEyWZpgMGubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5xhMmGfZjYn////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAD////Af///wH///8B////AaFmNxOcYjJNmWAvb5pgMHGaYDBzmmAwc5pgMHOaYDBzmmAwc5pg + MHOaYDBzmmAwc5pgMHOaYDBzmmAwc5pgMHOaYDBzmmAwcZxhMmGeZjgjqFU2A////wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAAAwAAAAMAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAsAAAAVAAAAFwAAABUAAAAPAAAAA////wH///8B////Af// + /wH///8BAAAACQAAABUAAAAXAAAAFQAAAA8AAAAD////Af///wH///8BnWY6B51jNi2bYTJdmmAxc5lg + MHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB3mWAwd5lgMHeZYDB1m2AyaZxiNUOhZjoR////Af// + /wH///8B////AQAAAAMAAAAJAAAAEwAAAB0AAAAjAAAAJwAAACUAAAAfAAAAFQAAAAsAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAAhAAAAQwAAAEsAAABHAAAALQAA + AAn///8B////Af///wH///8BAAAAAwAAAB8AAABDAAAASwAAAEkAAAAzAAAAC////wH///8B////Af// + /wH///8Bn2k7CZ5iNyebYzRLmmEyY5hfMW+YXzJ5mWAxgZlhMoOYXzF9mF8xc5lgMWuaYTNXnWU1N5xl + OROndDMD////Af///wH///8B////AQAAAAcAAAAZAAAANQAAAEcAAAJPBAQLWQkKGmEFBg5bAQEDUQAA + AEkAAAA3AAAAHQAAAAn///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFMzSLY1FO + wM1VUcDPVVHBzUFAqZcEBAsJ////Af///wH///8B////AQAAAAUuLoJVUk/AzVVRwM9VUcDPREOsowMD + BQ3///8B////Af///wH///8B////Af///wGjbj8np24+c6xyQLGvc0LjtHdG87p8Sfm/gU35xYZS98mL + VuvQkFvH0pNeh8CGVEGhbkAH////Af///wH///8B////AQAAAAcAAAAjBQUOSzw6do1jXbbDYl3R6VtX + 2vNTUdz3TErY9UZFzus8PLLJKClxjwcHEU8AAAAnAAAACf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABTEzoX0oK9L/KizS/zY53/87PcfDCAgSCf///wH///8B////Af///wEAAAAFLjCYayks + 0f8qLNL/NDfd/zw+zdUKCg4N////Af///wH///8BpXFFA6JrPTehaDmzn2U0855kM/+eYzP/nWMy/51j + Mv+eYzL/nmQz/6BmNf+jaDf/qm48/7l7SP/KilT7zo9Yz8CEUmejb0UH////AQAAAAMAAAAbFhc2WWBc + ws9aV+T9NDbX/ycq0P8lKdD/JSjQ/yQoz/8lKM//JyvR/y4x1P0xM7fbGRpJZQAAAB0AAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAUyNaJ9KS3Q/ykt0P87P+L/PUDIwwgIEgn///8B////Af// + /wH///8BAAAABS8ymGsqLtD/KS3Q/zk94P8/Q8/VCgoODf///wH///8BpG1AD6BoOJOcYjH5mmAv/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+bYTD/n2Qz/6hsOv+4eUb/un1Kvalz + RCcAAAAJEBApP05Nxts4Otn/KS3P/ykt0P8vM9b/Sk7p/3J28v+Dh/L/aGvr/zU52v8pLdD/LjLV/zQ4 + wuUSEzJDAAAAC////wH///8B////Af///wH///8B////Af///wEAAAAFNDaifS0x0v8tMdL/P0Pk/0BD + ycMICBIJ////Af///wH///8B////AQAAAAUxM5prLTHS/yww0v89QeL/QkXP1QoKDg3///8Bo29AH55l + NcubYTD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/nGIx/6RoN/+scD7lhlgzSTg5nps2Odf/LTHR/y0x0f8uMtP/Oz7T5UlM0aVSVc+NY2XUo4yP + 5NuQlPf/Oj7d/y4y0/9BReX/NDanoQAAARP///8B////Af///wH///8B////Af///wH///8BAAAABTU3 + o30wNNT/MDPU/0NG5v9DRcrDCAgSCf///wH///8B////Af///wEAAAAFMTObazE01P8wM9T/QUTk/0RH + 0NUKCg8No24/H6BlNNWcYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/nGEw/55jMf+hZjX/o2c2/6Fm + NP+eYzH/nGEw/5thMP+bYTD/m2Ew/5thMP+cYTD/nmMx/6FnNutJQ7btMDTU/zA01P80N9f/ODvFwT9C + pxn///8B////Af///wE4OJMPUFPLtVBU7f8yNtX/P0Pi/0lM1uETFDId////Af///wH///8B////Af// + /wH///8B////AQAAAAU3OaR9NDfW/zQ31v9HSuj/RUfLwwcHEQv///8B////Af///wH///8BAAAABTI0 + m2s1ONb/NDfW/0VI5f9HSdHVVzsnF6BnNcOdYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nWIw/6Jn + NP+vcj73v4BK78qJUu/OjVX5woJM/61wPP+gZDL/nWIw/5xhMP+cYTD/nGEw/51iMP+dYjD/iV5e/11g + 4/9RVOX/PkLZ9T0+pSn///8B////AQAAAAMAAAAHAAAAEx8fVEs4O9L7NDfW/zs/3f9PU+T1KittJ/// + /wH///8B////Af///wH///8B////Af///wEAAAAFODqlfTg72P83Otf/SUzp/0ZIyMUDAwYZAAAAEwAA + ABEAAAARAAAAEQAAABUvMpFzODvX/zg71/9IS+f/SUzS1ZliNo+eYjH/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nmIx/aJoN8+obz5hq3VDK6l0RResd0gXt35NL86PWXXKiVPbrnA9/6BkMv+dYjD/nWIw/51i + MP+dYjD/nWIw/55iMf+chJz1jJDo701QzsEcHDUHAAAACwAAABUAAAAfAAAALwAAAEEmJmB9QELZ/Tc7 + 1/89QN3/TVDj8zMzgyH///8B////Af///wH///8B////Af///wH///8BAAAABTg7pX06Ptr/Oj7Z/0xQ + 6v9ER7/PAAACSQAAAEcAAABHAAAARwAAAEcAAABJKCp3jTs/2f86Ptn/Sk/o/19Xuu2fZDL3n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/oGQy9aNrO22keEYH////Af///wH///8B////Af///wH///8BpXBDEbF1 + Q5+laTb/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/oGU042RJWR0WFTMbAAAAJwAAADkAAABHBgYRWSMi + R3VdWpepb2zf8T9C3P86Ptn/QETf/0VI1tszNH8L////Af///wH///8B////Af///wH///8B////AQAA + AAU6PKZ9PkLb/z5C2/9PU+v/YGDZ72JetcFiXrXBYl61wWJetcFiXrXBYl61wV9dwNdBRdz/PkLb/05S + 6v+JZXr/oGMw/6BjMf+gYzH/oGMx/6BjMf+gYzH/oWQy+6NqOlv///8B////Af///wH///8B////Af// + /wH///8B////Af///wGncUIHp2s6oaFkMv+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+EVi99AAABRRER + JmFEQ3aRdG+3xX562Ot6dun7X17o/0FF3f89Qdv/PUHb/0FF3/9BRMOH////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAFOz2mfUFF3v9BRd3/R0vj/0lL4f9JTOH/SUzh/0lM4f9JTOH/SUzh/0lM + 4f9JTOH/Q0fe/0FF3f9ZVdL/nmY9/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6NpOJeZgEwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVtPxmiZjTloGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/kl873XBrsb2CfuLzcW7s/1FT5f9DR9//QUXd/0FF3f9CRt7/Q0ff/0JG3v9BRM3NQkSoE/// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABT0/p31GSeD/Rkjf/1FU6P9kZ+7/ZGju/2Ro + 7v9kaO7/ZGju/2Ro7v9kaO7/ZWju/1te6v9GSeD/blmi/6FkMP+hZDH/oWQx/6FkMf+hZDH/oWQx/6Jm + M/OkbT4l////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpGk5f6Jk + Mf+hZDH/omQx/6JkMf+kZjL/pmc0/6VrPv9jXdb/R0rg/0ZJ3/9GSeD/SEvi/0xP5v9SVev/VFju/01P + 4fdFSMqnQEGqGf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAU+QKh9SUzi/0lM + 4f9dYPH/goTs94WH5eGGiOffhojn34aI59+GiOffhYjm34GE5O1dYOb/SUzi/4phaf+iZDD/omQx/6Jk + Mf+iZDH/omQx/6JkMf+kaDW7onRBA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNtPiekZjP3pGYy/6dpNP+qazj9oGg/44Nmkv1cVMP/SUzf/0lM4f9NUOb/Wl3x/2Jl + 9v9dYOz9VFbd1UdJwpU0NYtBBgYQEQAAAA8AAAAH////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFP0GpfUxP5P9MT+P/X2Ly/1RW0MMbGkINNTWQBTU1kgU1NZIFNTWSBSYmYgc7PaFtTE/j/01Q + 4/+dZUP/pGUx/6RlMf+kZTH/pGUx/6RlMf+kZTH/pGo4cf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqGw5u61wPMGscT9zkmE5L0JCpolQUub/TE/j/01Q + 5P9QU+f/VVjk7VFU16lISsBhQkOpIxERKgsAAAAvAAAASQAAAEcAAAA/AAAAIQAAAAX///8B////Af// + /wH///8B////Af///wH///8BAAAABUBCqn1QU+X/T1Ll/2Jl9P9WWdHDBwcSCf///wH///8B////Af// + /wEAAAAFOz2ga1BT5f9YVdX/pGc1/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6NtO0X///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNwQg2jdkgF////AQAA + AAdISsOxUFPm/1FU5v9ZXO7/RknCvzEzgCcLCxsFAAAABQAAAAkAAAAfRUWWk2hlucVlYrC9YmCss0RD + k10AAAAD////Af///wH///8B////Af///wH///8B////AQAAAAVBQ6p9U1bn/1NW5/9laPX/WVvSwwcH + EQn///8B////Af///wH///8BAAAABTw+oWtTVub/ZVvC/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zn + M/2lcUEd////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAEDSk3Jr1NW6P9VWOn/a272/y4vd4cAAAA5AAAAKwAAACkAAAAzCQkXT1RV + 1OlZW+r/W13s/2hq9v9LTsF9////Af///wH///8B////Af///wH///8B////Af///wEAAAAFQkSqfVZZ + 6f9WWen/aGv2/1td0sMHBxEJ////Af///wH///8B////AQAAAAU9P6FrVlno/25ftf+mZzD/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+maDT7o2w/C////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUpNxYFeYfD/WFvr/2Nm9P9SVdHnLy9tjRUV + LmkNDR5hKChNe3NvuMlkZe7/Vlno/1da6v9dX+39Q0WrQf///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABURFq31aXev/Wl3r/2xv9/9eX9PDBwYRCf///wH///8B////Af///wEAAAAFP0Gia1pd + 6v9yYrL/qGcx/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2g186hzRgf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFERq8ndHfs73d6 + +P9cX+7/W17s/2pq8P90cun7g4Dp+Y2K8P1xcfL/Wl3r/1lc6v9aXez/UlTUwTU1fQX///8B////Af// + /wH///8B////Af///wH///8B////AQAAAANISrN5YGPu/2hr9P90d/r/YWPWvwgJGAf///8B////Af// + /wH///8BAAAAA0RGrGVfYu3/fGy3/6loMf+paDL/qWgy/6loMv+paDL/qWgy/6lqNe2idkQH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVdYxlmvsfP1r7H9/3l89/9kZ/H/YGPv/19i7v9gY+//YmXw/2Nm8v9hZPD/V1nc30ZI + sSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTlC+cZCS8P+rrvT/p6n1/2Zo + 2LsfIFkD////Af///wH///8B////Af///wFJTLpdiozu/6qcw/+zcT//tHJB/7RyQf+0ckH/tHJB/7Ry + Qf+yckHxpHdEB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlnCQ5SW4cvAwfP9ysz+/7y//v+oq/3/mp39/4eK + +v9rberzVVfSp0ZIsCH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUJE + qBFAQ60vPkKtLz5CrS9DRa0d////Af///wH///8B////Af///wH///8BREWqCz9DrS+CYG1dvHlN/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/uHhL+aN1RQv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEuJYADPUCsJVJU + wVdbXc1xWlzLd1JUx2VISrZHP0CnD////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3FCJ7t5Tf28ek7/vHpO/7x6Tv+8ek7/vHpO/7p5Tf2mckYh////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AaByRwW6eU3xvXtP/717T/+9e0//vXtP/717T/+9e0//q3NFRf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BuHlNzb18UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/7R3S3v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZ5uQQP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbZ4 + TI29fVL/vX1S/719Uv+9fVL/vX1S/719Uv+4ek/FonNBBf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AahxRRPRmGi94K17k9CdbVetekwjnV8/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGudEg/vX1S/b59U/++fVP/vn1T/759U/++fVP/vH1S+653Sjf///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGyd0tXwoFW/dmWaf/mpnf/665++eat + fd3jrXyhzJloY6JuPgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3BBC7p8UdO+flT/vn5U/75+VP++flT/vn5U/75+ + VP+5fFG9oG1CB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wGkdUUJunxRyb5+ + VP+/f1X/woFX/8eFWv/Oi2D/1JJm/8WJXNujcUQL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGzeE1vv4BW/79/ + Vv+/f1b/v39W/79/Vv+/f1b/wYJY/7+CV5mmcEYH////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIFtXpOi7+AVv+/f1b/v39W/79/Vv+/f1b/v39W/7+AVv+3e1CN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bp3JGDbt+VNnAgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/NjGL91ZZps7eCVSn///8B////Af// + /wH///8B////Af///wGrdEgbuHxRp7+AV/3AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb1qnRGKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGyeU1LwYNZ98CCWf/Agln/wIJZ/8CCWf/Agln/xIVb/9WU + af/nq3z15K+Ar9emdnPNmWpTyI9hTcSHW2HBhFihwIJY68CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/uH1Snf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn2U1A7t/VInIiWD9w4Vc/8GD + Wv/Bg1r/wYNa/8GDWv/ChFz/y4xi/9eWbP/jo3f/5KR3/9+ecv/QkGb/xIZd/8GDW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/vIBW4ap1Rx3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGncUIFwoZakc6PZv/FiGD/wYRd/8GEXP/BhFz/wYRc/8GEXP/BhFz/w4Vd/8OGXv/DhV3/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/voJZ9bB4Szv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZlpOAPEiF2B2Jhv9c6QaP/HiWH/woVe/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/vYFZ47J6T0P///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AciOYT3eonXT5qh+/9aX + bv/LjWb/xYhh/8OGX//ChV7/woVe/8KFXv/ChV7/woVe/8KGX//Dhl//xIdg/8OGX//Chl79un9Wua11 + SSf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bm2g7Cc2ZbFvms4a76rWI9+mwhf/go3n/15hw/9GTbP/OkWr/zpFq/86Raf/Qkmr/zpFp/8iL + ZPO/hVy3sHlNR59rPAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bnmo+A7uJXCHLm29Z3a6BjeSwg63kq37B3qJ3x9ue + c7nWmW6ry5BlhbuCV1eveU4doG5EA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVw3AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAkAAAAPAAAAEwAAABUAAAARAAAACwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHAAAAGQAAAC8AAAA7AAAAOwAAADcAAAArAAAAGwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaNfKwPaf0gF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+ASQXfgEkF34BJBd+A + SQXfgEoF9oxkA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAsMDB0tEBEqUxYXN20aGT5zEBAqZQoLF1UBAQE/AAAAJQAAAA8AAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqksqBbRgRQe2YUYHtmFGB7Zh + Rge2YUYHtmFGB7ZhRge2YUYHtmFGB7ZhRge2YUYHtmFGB61sRgfumIkF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAgIGCy8whXNST8PbXFXU51VP1OtFQsjlMjGdxSIi + YYUFBQtBAAAAHwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZlgLwOyZzcHrH89CauAPAmziDwJs4g8CbOIPAmziDwJrIE8Cap+PAmqfjwJqn48Cap+ + PAmrfzwJxYNFCdeYfwX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wENDiENLS+kmykl2f1BPeX/NTLi/yAd3f8cG9n/IyPF9ScneZEFBQozAAAADwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABQAAAAP///8BAAAAAwAAAAMAAAAFAAAABQAAAAUAAAAD////Af// + /wEAAAADAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADXycUB5lRLA+XWzQRoGE3D7Fn + QA2+akQNwW5EDbJpQA2dYDYPklcwEYNPLxOFUC4Tk1cyEZ5gNg+sdEANgmhnBwUFBQUAAAAFAAAABQAA + AAP///8B////AQAAAAMAAAADAAAABQAAAAUAAAAD////ASMkWAkwMbCxKive/3p79v+lpvn/dXbx/yMj + 2/8bHNv/JifE7yYmZ28AAAAbAAAABf///wH///8B////AQAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAAA////wH///8B////Af///wEAAAADAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAFAAAAAwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAAA8AAAAZAAAAHwAAACEAAAAdAAAAFwAA + AA8AAAAPAAAAGQAAAB0AAAAdAAAAGQAAAA8AAAAHAAAACwAAABcAAAAdAAAAHQAAABcAAAANAAAAA/// + /wH///8BAAAABwAAABUTDQYfNSMTKUAsGidXPCIfiGE2FbR7RBGdbjsTbU0uGU80ICM5KhgrNCYVLzYn + Fi0/KhgpVDkiIVw/KxkaFw8VAAAAGwAAAB0AAAAdAAAAFQAAAAkAAAAHAAAAEQAAABsAAAAdAAAAGwAA + ABUAAAAJOz6bBzg8s6syNMTPPD3H1U5P2elsbfL/R0jw/ygp5P8nKNv/LS6gvQwMGi8AAAAL////Af// + /wEAAAADAAAACwAAABkAAAAdAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHQAA + ABkAAAAPAAAAA////wEAAAADAAAACQAAABEAAAAbAAAAIQAAACMAAAAhAAAAGwAAABMAAAALAAAAA/// + /wH///8B////AQAAAAkAAAAVAAAAHQAAAB0AAAAZAAAAEQAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcAAAAZAAAALwAAAD8AAAFFAAACRwAAAEMAAAA7AAAALQAAAC0AAAA7AAAARQAAAEUAAAA3AAAAHQAA + AA0AAAAdAAAANwAAAEUAAABFAAAANwAAAB0AAAAH////AQAAAAMAAAATAAAALwoGAUcXDwdRIBMLSzUg + ETdwRy8fnWdBF2dDKh87JRczJRYORRwRC08bEQhVHBAHUyASCk0oGQ5DLBsRNQoGAzUAAAA/AAAARQAA + AEEAAAAtAAAAEQAAAA8AAAApAAAAPwAAAEcAAABDAAAALwAAABMYGD8DQkOoHUdJnx1FSJwfNjijVTEy + w+s0Nuj/Ky3h/zQ37P8uMMTxISFSVQAAABMAAAAD////AQAAAAcAAAAbAAAANwAAAEUAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABFAAAAOwAAACEAAAAHAAAABQAAAA8AAAAhAAAANQAA + AEEAAABHAQEESQAAAUcAAABBAAAANQAAACUAAAARAAAABf///wEAAAADAAAAFQAAADEAAABDAAAARQAA + AD0AAAAlAAAACf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAAGQAAAjcQEi5fHB1QfS4ucpM0NHmdKClkjxYX + NGsBAgRPCAgUUxwcRnUbHEl/GxxJeyMiWGkZGT8nAAABDxkZPTUgIlNvGhxJfRscSX0eIE9rEBIvLwAA + AAf///8BAAAAAwoKFxsfH0pdHh1KgSIfRYcnI0qBNSlEV146LCVvSDIhOyQZNyAUClEeGCxzKCVckTo3 + d6c1MWufKiVLhx4WHGkUCwZVFxg2ZxscSnsaHEl9HR5OdyIjVVMGBg0RAAABDxocQkceHk53GhxHfxwc + S3siIlNdCwwaGwAAAAP///8B////Af///wEWFzUNNDaXjygr0/8pLN3/Oj3u/zM13P0uMIaZAQEDHQAA + AAf///8BAAAACRETLisfIFJtGh1JfRocR38aHEd/GhxHfxocR38aHEd/GhxHfxocR38aHEd/GhxHfxsc + SH0eIE5xFxg8OwAAAQsAAAARAAAAKQAAAkMJChxdGx1QgScoZ402NnqfMjF1myYnX4kUFC9nAwIFRQAA + ACsAAAARAAAAAwAAAAUNDSAhHiBOYRsdS3saHEh/HiBQdxobP0MAAAAN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AA0FBQwxLS5rg2ljxuOHfuf9fXXz/2Re7v9JR+L/OjrE7TIzjbUtMHWhWVbU925o4/trZeL7VFLL+T09 + mU8FBQ4JNjaTa1NQz/dtZ+P7bWfi+1NQ0PczNI5nAAAABf///wEAAAADKSpmMUFBtddmYN/7bmfi+2Je + 3ftFQ6u3XT0rLVM2HS8sHyNVSkWNr3x01euGfe//c2zw/1ZT6v9AP9b5OTmx3y4saZ85O6DRZmHe+21o + 4vtlYd37RES30ykpaRMaGj0VPz+ttWRf2fttZ9z7aGLc+0NEtdMlJmArAAAAA////wH///8BAAAABQEB + AxcuMHyBLzDM/SUo1f82OOX/QUTu/zI1st0UFC83AAAADQAAAAMAAAAHMzWEX1NSy/VsZt37bGbc+2xm + 3PttZ9z7bWfc+21n3PttZ9z7bWfc+21n3PttZ9z7bWbc+1tY1Pk5O5+RAwMKDwAAACUODiRPOTd2mXBq + w+GIf+X9gHjw/21m7/9ZVe3/SUfg/Ts9wOsvMYuvExQtWQAAACkAAAALAAAABSotdzlQT8jpbWfj+21o + 4/taWNb7NziaiwYGBg3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAEyorbGlUU8ztYVzr/z9A4P8xNNr/T1Ls/4OG + 7/9tb+X/PT/S/TY5ufMxM9T/Ozzf/0FD5/84ObvnLS1pHQAAAQkzM5NvLzLK+zY32/9HSOz/Oz7Z/TQ2 + k20AAAAF////Af///wEqLW8zMjS23zM02f8+PuL/RUfq/zs7rcFXOCIzQysZPUNAk61lYOb5U1Ho/zY3 + 2/85POH/Zmnw/3+C7P9ZW+D/NTfF+zY5xf00Ndr/QUHm/zk72/04OaKVIiJCBSAgSBc0NrPBLzLX/zs7 + 3/9JS/D/ODu91ycnYC0AAAAD////Af///wEAAAAJERIrLTY4pcMuMNb/LTHY/zM33v9ITPP/Oj3P/SYn + ZGMBAQIXAAAABQAAAAU3OZBhLTDM+zo63f9SU+T/VVbm/0tM4v9JSuL/R0ji/0RF4f9EReH/REXh/0RF + 4f9JSen/QEPm/zc6pJkCAgYXFBY4S0tKq8F6c+r7aWXt/0JD4v9GSOv/bG/x/5KU7f9tb+P/NDfa/zE0 + 0PsxNKHHFxc4TwAAABUAAAAJLS9/PTI0xfE0Ntv/RUbp/0JE4v8zNZ6PDQYGDf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMHBxIXPj+vvURE4P8uMdT/LDDU/ywv0v9FSNjxYWTe53d65/eBhPD/OTza/ysu0f85PeD/Q0fp/zY4 + sL8gIEMTAAAABzQ0k28uMcj7KS3R/0lN8f8+Qdn9NTeTawAAAAX///8B////ASosbzMzNrbfKCzQ/zo+ + 4v9ITOz/PT2swVE1HjdDN11hRkbN8zo73P8rL9L/Ky/T/zM30v1SVNvram3f7YOG6vtfY+b/MDTU/ysv + 0v9DR+v/Oz7T9zU3jmcHBw0DICBIFzY5sr8pLdD/Mzfb/0xQ8/85PL3XJyhgLQAAAAP///8BAAAAAwAA + ABEkJVxTOj3C7Swv0/81Od3/Mzfa/0VJ6/9DR+b/NDaVpwsLGSUAAAAJ////AT0+nFswNMv7RUrf/2ds + 6v+OkvL/nKD2/5qf9v+YnPf/kpb3/5CU9/+Pk/f/j5P4/4SI+f9LTuj/OTynlwYGDiE4OZWjUlHf+0JC + 3/8sMNP/LDDV/0JG3/1YXOLxe3/o+6+z9/9eYuv/OT3f/zk90/s1N5ijBgYJFQAAAAkuL309MzfE8Scr + z/9ESOv/Q0fi/zU2no8IBgYN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////ASstaSU5O8DpLjHU/zI22P82Otz/NTe98TEy + iHUrLIFBNzmlfUxPyd1LT+f/MTXW/0FF5/9ITOv/ODqsrRAQJg8AAAAHNDWTbzE0yvsuMtT/TVLz/0FE + 2v00N5NrAAAABf///wH///8BKixvMzQ4t98sMNL/P0Pl/0tP7v8+PqvBWj4fN0U/i4szNtP9LTHT/zY6 + 3P8yNtP/Ojmhx0U2Y1tIO3VfRUOjo1JU2/c9QeH/MjbX/0tP8v8+QdHzMTGBVQMDBQUgIEgXNzqzvy0x + 0/84PN7/T1P0/zs+vtcnKGEtAAAAA////wEAAAAHAQEDHTQ1jZM6PNH9MDTW/zo+4P8xNdf/PkLk/1BU + 9v86PLTZGRtAQQAAAA8AAAADP0GiOUFEzelydvb/YGTx/0FE4v9FSeH/Sk7R/U9SzfVRVNHzUVTT8VJV + 1e9RVdXtUVTV7UJFzus6PKSBIiRYQUFDwuE4Otr/LzPV/zE11/8zNsTvNzmmnzI0kmc2OaCLREfM8Vtf + 8/9lavj/UVXw/zs/xOsxMnAvAAABCS4vfD01OcbxKi7S/0lN7v9GSuP/NTeejwYGBg3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BNziEJzc6wu0wNNT/QETk/0dL6v8zNZrBBQYORwAAADUCAgYpLzF9eTU5zf0zN9j/R0vr/0pN + 6v84OqWdCwsbCwAAAAk1NpRvNDfM+zE01f9RVfT/Q0fb/TM1lGsAAAAF////Af///wEqLG8zNjm33zAz + 1P9DRuf/TlLv/0A/rMNoQSI1SEKUjzI20/0zN9j/S07u/z1A0PszK1GJLx4KVTskD0tBKiBPOzqgxTU5 + 2f84PNz/UVX0/0BDzvMuLnlPAQEDBSAgSBc5PLS/MDTU/zs/3/9TV/X/PD+/1ycnYS0AAAAD////AQAA + AA0TFTA1Oj2tyzc62f84PNz/Oz/b/zM2z/84PNz/Vlr4/0BE1P0qK3JvAQEBGQAAAAX///8BP0Gqa05S + 2e+AhPv/X2Pw/zs/4P85PMz9NTaPvyAhTmMqLGdHPT+TMT9CnC9AQ50vQkObLSkpah0zNo9/PD7V+TI1 + 1v88QOD/ODvW/zEzi6MICBE5AAAAMwICBjM1NpGlQUTV+0RHzvE/QsHjPD6xzS4vck8EBAgNLjB+PTc7 + x/EuMdP/TFDv/0pO5f83OJ6PBgYGDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEzM2wLPT+92UdK5/9YW/T/U1b0/z1A + ve0kJFyJDg4kYwAAAE8ODiNbODvB9zI21v9MT+7/TVDr/zk7opsKChgLAAAACTU2lG82Os37NDjY/1RY + 9v9GSd39MzSUawAAAAX///8B////ASosbzM3OrnfMzfW/0ZK6f9RVfH/QUCsw25BIjdTSIdzPUDU+09T + 7f9YXPf/Rkjk/zs5kMcrJECJJxoQcSQUA2c1NHWrNDfV/zo93P9VWfb/QkTN8SsrbEUAAAAFICBIFzo9 + tL8zN9f/P0Pi/1db+P8/QcDXKClhLQAAAAMAAAADAAAAFy4wfHVBQs33NTjY/0JF5f88P8/9PD66+Tg8 + 2v9NUe7/T1Lu/zc4pLkODiIrAAAAC////wFLS6EHP0Cwf1VZ3feHi/3/W1/w/0BD5P88P9L5MTSJqQUF + CUMAAAAjAAAACwAAAAMAAAADAAAAETc6pK02OdX9Nzva/0VJ6P84PMP7GRxMew4QMWcOEDFnDhAxZxYY + QnUgI1iNGhxGgRMVOHUSEzdfEBAtMQEBAxEsL3s/ODzI8TE11f9QU/H/TVDp/zc5ppkPDyEP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUBAdQM/P7B/XV/j962x/f+Qkvf/T1Hj/0pK1vVJScHdQ0SlvzU1gak7PcH5NjjX/05R + 7/9QU+3/OjynnwsLHAsAAAAHNjeVbzk8z/s3O9r/WFv4/0lM3v0zNZFtAAAAB////wH///8BKixvMzk8 + ut82Odf/SUzr/1RX8v9DQazDckcmOX1YUDtFRsDZgob2/7O1+/9wcu//SUve/UxL0vNJSLDXQj6Kvz08 + js02OdX/PD/d/1hb9v9ER87xKipnQQAAAAUgIEgXOz60vzY52P9CReP/WV34/0FDwdcpKWEtAAAAAwAA + AAkFBg4lOj2jsz9B2v85Pdv/RUjn/z0/wOE9P6rBOj3V/UVJ5/9cX/n/QUTD5yUmX1cAAAARAAAAA/// + /wE/QaQTQEO5l15h5/2Kjv3/WFvu/0JF5P8+Qc73LzGAnQMDCD0AAAAdAAAACQAAAAMAAAAPOjywyTc6 + 1/8+Qd//TE/t/2Rh3P9uas/pbmnP5W5pz+duac/nbmnP525pzuVwa8/ncWzP52ZizeU6PZWJDRAkDy0w + fD07P8nxNTjX/1RX8v9RVev/OTunnRERJRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAzs7iRVGR7indHbe87S2 + 9f+srvT/l5nw/3d47f9nZu7/X1/j+0xM2/84O9n/UlXw/1RX7v86PKifCwscCwAAAAc3N5VvPD7Q+zs+ + 2/9cX/n/TE/f/TI0jHEAAAALAAAAAwAAAAMqLG01Oz273zk82f9MT+v/V1rz/0RCrMVzSCk7mmErLVxM + emNVVcfblZjt/bu99/+kpvH/hYft/21v7v9mZer9W1re+z9B3P8/Qt//W173/0ZJ0fEtLnFHAQEBBSAg + SBc8P7W/Oj3Z/0VI5f9dYPn/QkTC1ygpYS0AAAADAAAADxwdSUlCRL/fP0Hd/0JF4v9FSOL/PkCvqTo7 + mk8+QMzxQETh/11h+f9MT9/9MjSKjQEBAx0AAAAF////AQAAAAM9P6IbQUO9qWxw7/2Hivv/VVjs/0RI + 5P8+QsPxKSpqiQQECjsAAAAbAAAACQAAAA09P7fXOTzY/0RH4/9rbvT/i4v3/42M+f+NjPn/jYz5/42M + +f+NjPn/jY35/3Jx8P9gYPD/Wlvx/zs+op8aHTwLLjB+PT1AyvE5PNr/W1/3/1ZZ7f85O6ehDQ0ZGQAA + AAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHAAAAExsbQC8uMIB7QkSswWBj0OuChOf3mJvv+7Cy9v+nqfb/jIzw/09S + 3/9UV/H/V1rv/zo8qJ8LCxwLAAAABzc4lW89QND7Q0fg/2Vo+/9QU+H9MDKGfwAAABcAAAAJAAAACyYo + ZD09P7/jPD/a/09T7P9aXfP/RUOrxXRJKj+ETyg3Zj0aQ0g0SmtBPIyzUVK4321v1feLjer5o6bz/6+x + 9/+am/P/d3jq/0ZJ4f9eYfj/SEvU8zAwfE8BAQMFICBIFz5Atr89QNv/SEvm/19j+f9CRcPXJyhhLQAA + AAcAAAAZMDJ+f0dJ1/k/Qt3/Sk3o/0NG1f89PqVjOzyWIT5Av89BReD/VVjw/1pd8f88P67HEBEoMwAA + AA8AAAALAAAADQAAAA0rLW0lQ0a7xXl98/2Fifr/VFjs/0dK5P89QLnnHR5ObwEBAjUAAAAZAAAADTxA + tMU9QNn/SUzm/2xv+/9mauj/Z2vk+Whs5vdobOb3aGzm92dr4/lkZ+X/SUzf/01R7P9OUen/Oz2hhx0g + QQkvMX09P0LL8TxA3P9kZ/n/XmHy/zs/rbsMDR0tAAAAFQAAABMAAAATAAAACQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkAAAAfAAAAOwAA + AkkLDCVhGRo/ZyIka2EzNZmZRUi4w11gy+N6fOb/TlHf/1da8v9ZXO//PD+omwsLGwsAAAAHNziVb0BC + 0ftHS+P/eX39/1hc5/8yM4ufAAAANQAAACMAAAAlHyBRVz9Cxu0/Q93/Ulbt/1xe8/9HQ6zFeEgsQXZF + JD9LKwxVNBwFZywaDnMxIzGHOys9fT80cpFDQJy/UlK42Wxt1fNqbeb/R0rh/2Bj+P9KTtPzMTF/SwEB + AwMiIkwVP0G3v0BD3P9LT+j/Y2b5/0VHw9coJ2AtAAAADQoLGS1AQazDR0ne/0RH4f9OUuv/QUTE6To7 + kSUjI08FP0KtjUNH3P9NUOn/ZGf6/0lMy+siI1dZAAAAHQAAACMAAAAxAAAANwAAADUgIExXSErB5YKG + 9v+Jjfv/VVjt/0lN5f89P7LZGBk6YwAAAC0AAAARPUCvp0FE2v1KTeX/aW37/0ZJzfspKnGDJihuYSkr + d1smKW5jLS95j0FEyvVBRN7/UFTt/0lM3f87PqJlGRk2BzAxfj1CRMzxP0Pd/2pt+f9pbfn/QEO42wwN + H00AAAA5AAAANwAAADEAAAAZAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAwMBTc4h1lSUZurY1+tz3p2x+VAQZ2/CQkYVwEBBEcDAwpFGx1HdURG + x/lER+D/WVz0/1da7f8+P6SPEBAlBQAAAAc4OZZvQkXT+0lM5f+BhP3/c3f0/z9BsdkQEiljAAAASQAA + AEsgIVZ7RUfP90JG3/9VWO//W17y/0pGrcGFUi0/fVE7RVZMhp9fWZnLcGq04Whkvus4MV2lMx0FbTYf + BmkzIBVzOziBw0ZJ4P9JTOT/YGT5/0lN0O8yNIA5AQEDAyAgSBdAQre/Q0bf/09S6v9mafr/R0nD1ycl + XS8AAAAVJyllX0pMz/NGSOH/TE/n/05R6f9BQ66nPT2HC////wE9P6FFQ0fP9UpN5v9jZvj/WFvo/TY4 + kZ8BAgQvBAQLPQMDDlUCAgxdAgIMXwMDDVshIVeJSk3D64qN+f+Lj/v/Vlnu/0xP5P9AQbHRGxtBVQAA + ABs9PqRlSUzc91FU7f9oa/v/U1ji/ywtdJkBAQRNAAAASQEBA000NoapUlPi+0dJ4v9QVOz/REbK9Tk6 + kCcFBQoFMDF9PURGzfFDRuD/aGz6/3R4/P9NUNX3JilplwMDDFsLDCxnICBMawkIEi0AAAAL////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAPz8DRkesg25s + 4fmRi/f/gX34/05Q2vs6O5K3KChahy8vYotNTZa5Wlrl/UhK4v9YW/L/VFbo/T5Aon8ZHEEDAAAABzk5 + lm9FR9X7TE/m/29y+/98f/n/VFbd+0BCrdMsLmmRMTJmkV5css9eXuf/RUjf/1VY7v9TVuj/Tkmlr5Zd + LjuEVklHWFa/34iD8f+Oifj/amny/0dHuOk+N2mvPTNToUc/Zq9eW7jnUFHn/0xP5v9cYPb/SUvO5TM2 + fBv///8BHiBIF0FFuL9GSeH/UlXs/2pt+/9JSsTXIyJXMwMDCCE5O5OfT1Hi/UhL4v9TV+7/S07a/T0+ + n2M0MWsD////ATg5kBVDRb/VS07m/1te8v9mafj/REe/2w0OIEU8PY2bX121y2Ngtc1jX7XNYV+1zWFf + tM1dXL3taWnf/5qc/P+Hivj/WFvv/0xP3/0+P6i/GxtDLTw9mS1JTMvfbG/5/3J1/f9cX/X/SkvI6zc4 + hKctLmWPREKDq3Zx1fNcXOz/SUzi/0lM4v9DRbvDNDR/CwAAAAUxMn49RknO8UZJ4v9oa/v/am35/2Bi + 7f9NTsztXlq1zYR+xeFfXsXhJidlWQAAAA8AAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQqUzSUvO43h69v+KjPf/XV/s/15d6Pt6duXzlY7o86Ga + 8ftiYu7/Sk3j/09S6f9LTdjzPj+jUf///wEAAAAHOzyaa0hL1/tRVOj/bG/7/2Fk6f98fvL/dnfy/3Fu + 5vWSi+b1k43y/V1e7P9JTOP/TlHn/0tN1PdbTIyFomMuOaZkLDlSSZmXWVvk+4uO+P96ffX/VFbp/2lm + 5PmGgOH1nJTn+ZOM9P9PUeb/TE/l/1BT6P9FR8O7MDRqC////wEdHkgXQ0a4v0lM4v9VWO3/bXD7/0pM + xdchIVI1Dg4kLUhKvtdOUOX/UFPn/1da8P9HSsftMziAG////wH///8BMzR9BUBDq4lLTuH/Vlnt/25x + +/9TVtr3JylldUFEsM1ubO3/f3v1/4B89f+AffX/gH31/4F98/+AfPP/enn2/5GS+P96ffb/YmX0/01Q + 0fEwMHRBLS1zBURGtnNucejztrj+/4yP9v9aXO7/YWHn+4J95PWfluz7fXn0/01Q5f9KTeP/R0rU60BC + qE3///8BAAAAAzM2hTtIS9DxSkzj/21w+/9aXez/bG/x/21v8f94dfT/iYX5/2Fi5/03OpaJAwMGEQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURE + mQVERraJeXvm99na/P/Jyvf/lpjw/42N8v+IiPX/f4D0/2ls9/9XWu7/TU/h/UZIwbE9PJsL////AQAA + AAM/QKZlT1LZ+5OW8/+Qk/3/T1HR+Vtdz/Ooqvj/rq/3/52d9v+DhfP/a271/1VY7P9MT+L/TUq2zYBY + VlGmYy47qGIxO3dVY1tUU77Zp6rz/+Hi/P+sr/L/kJHx/42M9P+EhPX/eXr2/2Jl9v9QU+j/Sk3T8URF + smslJUcD////AR0dSBdERrm/TVDk/1lc7v9wc/z/S07F1yMkVzMzNX9JV1ja93+C7/+ZnPj/YGPt/0RF + uK8oKHQH////Af///wH///8BPT+eT0pN1fmFh/T/pqn+/29y8v8/QaSrQEO1yWNm5/+doPX/pKf3/6Sn + 9/+kqPf/paj3/6Wo9/+mqff/oaT2/6mt+P+Vmf3/VVfY8TY3hjv///8BQEKfD0tNvpWJjOr53+D8/7+/ + 9f+XmfH/hof0/3d59f9dYPL/T1Lm/0pN1fFER7V9RESQBf///wH///8BOz2aM0xO0+9+ge//mp3+/1lc + 3f1WWND7rbD5/7S29f+FiPj/bW/2/0hKwcUwM3IX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUBAoA1ERbNnXmLRz5GT6f2ytPT/rrH4/5OW + 9v99gPT/Y2bs/09R1+VGSL6dQkOqHf///wH///8B////AUJErltVWNT5d3rk/3N15P9PUcjfP0CmY1FT + xrmHiuf9srX0/5aZ9/9sb/H/UFPb9U1LtbN+WV5VqGctPaZmMz+mZjM/q2krPXlVZV1WUKu5cnTZ86Om + 8f+2ufb/o6b3/4aJ9P90d/L/VVjh/UpNyNdCRa1pQECiCf///wH///8BHR1IF0VHur9QU+b/XF/w/3N2 + /P9NT8jXKitrNURHr51dXt//dnnk/3V45P9XWtX3QUKnX////wH///8B////Af///wE7O5EJR0q92Wxv + 4f93euP/aWzi/0hKvtNER7XVZmng/3l75P94e+T/eHvk/3h75P94e+T/eHvk/3h75P95fOT/eHzl/3F1 + 5f9TVc/pQECfKf///wH///8BQ0GfEUJDtHdlZtnfm53w/7S29v+Tlvb/bG/y/1ZZ4/NKTc7BQkSwV0BA + ogf///8B////Af///wFDRK0tUFLO73J15P91eOT/VVfR8UNFrq1qbNbrr7H1/4WI9f9aXef7TE7KyUBF + oxv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo7nAM9P58ZP0CuTURDunVGR76JRUe6i0VHu3tER7ZdQUOlLUBCoQ3///8B////Af// + /wH///8BREanFz9CpkM8QKRFPUClRUBCpTk7QaAJOTueDT9CrlFERbp9Rki8jUZIuH1DRKpFkGI9Hadn + LjmhYzBBoWMwQaFjMEGhYzBBo2MuQZ1hMkNxUWdlYk6JgVpOn5tYTaOnV0yeo1xOmJVmUH51bVVvM29j + fQX///8B////Af///wEdHUgXR0i7v1NW6P9fYvD/d3r9/09RyNcoKmcvPkCgLz5CpEU8QKRFPECkRT9C + pUFHSK0R////Af///wH///8B////Af///wFAQ6Y5PUCkRTxApEU+QaVFQkOnPVJKlEdlT3dnaE5wb2hN + cG9oTXBvaE1wb2hNcG9oTXBvaE5wb2pQcm1nT3ZpY1B8Y2NPf0+XaVgVpHpVCb6WPgP///8BOzyZBTw+ + oiVCRLZVRUe9eUVIu4lFR7ljQ0WtRUNFsg1AO54D////Af///wH///8B////AUBEpw1AQ6ZBPECkRTxA + pEVAQ6ZBQUOjFz8/pDVFRr11Rke6hUVGs1lDQqQhQESmA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOjOVBTw8 + kwk9PpYJPz+UBSIiiAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATo9lgc6PJMJP0KUB////wGebTEPoGQ0NaJjMUOgZDFFoGQxRaBkMUWgZDFFoWQwRaRl + K0OkZStDoWIvRZ9iMUWfYjFFomMvRaZmLUGjajEroHg5Cf///wH///8B////AR0dSBdISry/Vljq/2Jl + 8v96ff3/UVPJ1ygoYi0AAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wHMd1MDqGYzIaVoLD2lZipBpWUqQ6VlKkOlZSpDpWUqQ6VlKkOlZCpDpmYrQaZm + K0GmZys/qGYvO6VqNzehbDwrp3pBEf///wH///8B////Af///wE5PIoFPj+TCTs7gAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATU1kQU9QJYH////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFf + NAmhYzQtoWQxQ6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6Fl + Nzuma0EVyIl/A////wH///8BHh5JF0lMvb9YW+v/ZGfy/3x//f9SVMrXKSlmKwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AapwQA2hZDU1oWMyRaJk + MkeiZDJHomQyR6JkMkeiZDJHomQyR6JkMkeiZDJHomQyR6FkMkehZDJHomUyR59kMzulbToT////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Blnw3A6FkNyGgZDJBoWQxSaJkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLoGMzRaFoOSmceksJ////Af///wEnJ10RS07AvVxf + 7P9+gfb/g4b+/1RWzNUtLXInAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGbdkIDomI5H59kM0OhZDFJomQxS6JkMUuiZDFLomQxS6JkMUuiZDFLomQxS6Jk + MUuiZDFLomQxS6FkMUuhZDJJpmk0M6JrKQ3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BlGExEZ1jMTugYjJLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6Bk + M0ugZDNLoGY2P6N1Qhmvj4gD////ATs7iQ1PUsa7iYz3/8fJ/v+hpP7/WVvR0zk5kh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZyPA+jZjg3n2MzS6Bk + M0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BkM0ugZDNLoGQzS6BmM0efazgljlMpB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGmaDEHomQ1K6BhMkufYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fZDJLnmc3N5xuPxH///8BQkKXBUhL + tolXWcjFWFrHw1dayMVLTbmRQUGjDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGaak4JoGc5KaBjM0mfYzFPn2MxT59jMU+fYzFPn2MxT59jMU+fYzFPn2MxT59j + MU+fYzFPn2MxT59jMU+fYzFPoWQ0QaR2PBeidjsD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGNFgOiaDUZomU1Q59iMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGgZjVLomk3MbtyTAv///8BOz2eDTY2lRM1NZUTMzWVEzs8nQ3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BsHtOBZ5pPSGfZDZDn2MyUZ9j + MlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9jMlGfYzJRn2MyUZ9iM0+kZjY1tXIwC/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaJyMguhajYznmExUZ9j + MVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWhZTNNomM3L6R0 + SA2kgFYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AbGASAehbDwfoWc2Q59kMlOgYzFVoGMxVaBjMVWgYzFVoGMxVaBjMVWgYzFVoGMxVaBj + MVWgYzFVoGMxVaBjMVWgYjFVn2I0S6JsOSGvgB8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BwoISA6NpMhugYzNJn2EyVaBjM1egYzNXoGMzV6BjM1egYzNXoGMzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMyV6BjM1egZDVPoGk6NaVyQhWtf1wF////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGedVEJo2g9JaBnNUWfZDNVn2MzV6Bj + M1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV6BjM1egYzNXoGMzV59iM1WdYzc9qnk5Df// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bq2Y0CZ9l + OS+fYTJTnmAxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9i + MVmfYzJXn2c3RZ5rOimjcEoRrnBFBaBeSwP///8B////Af///wH///8B////Af///wH///8B////Abea + bgOXb0oJom5DF59mOzOgYzRPnmExWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9gMVmfYDFZn2AxWZ9g + MVmfYDFZn2AxWZ9gMVmfYDFZoGQzT6FrOyOvXkQD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bm2U9E55kNkGdYDFZn2AyXZ9gMl2fYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYjJbn2M0U59kNkOjZzsto208G6hr + QhGfcU8LpnJEB5xzRgedbEcHp3VRB6VySAmlbUMToGlAH59kPTOeZDdJn2M0V59gMl2eYDJdn2AyXZ9g + Ml2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdn2AyXZ9gMl2fYDJdnmAyXZ5hMlmfZTc9n3g6D/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGlehwFn2c2I51hMk+dYjFdnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+dYjFfnmIxXZ1jMlmgZjZPn2U3R6BmOD2iaTo5n2k6M55mOTOgZzo7oGc5PZ9l + NkebZTRTnmMyWZ1iMV2dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51iMV+dYjFfnWIxX51i + MV+dYjFfnWIxX51iMV+eYjFdoGQzTaJnOyOXaCgD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGsezwJnWQ0L55jM1WdYTBhnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OcYC5jnWAuY51h + L2OeYS9hnmEvYZ1iL1+fYjBdnWIvX51iL1+eYS9hnmAvYZ1gL2OdYC5jnWAvY51gL2OdYC9jnWAvY51g + L2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvY51gL2OdYC9jnWAvYZ1iMVmfZjgzq2w8C/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGdZzwNn2U3N59hMludYTFjnWExZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1hMWWdYTFlnWIxZZ1i + MWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1iMWWdYjFlnWIxZZ1i + MWWdYjFlnWIxZZxiMWWeYjJhnmU2QahlPRH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlZUARnmU1O51h + MV2cYTBnnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51g + L2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYC9nnWAvZ51gL2edYS9nnmExY59hM02faDQZp3ggA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AYVaPQOUaDgRnmY2PZxhMV+bYDFpm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tgMWubYDFrm2Axa5tg + MWubYDFrmmAwa5xhMWWfYjNPnm47Ia9/OQP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZNr + KQOdZTkTnWU1PZtgMV2aYDFrm2AwbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtg + MW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2bYDFtm2AxbZtgMW2aYTJpn2U1T6BpOSWcYjcF////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGpbDgPnmU2M5tiMlmaYDFtmWAwcZlg + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlf + L3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlfL3GZXy9xmV8vcZlg + L3GaYDBxnGAwa55kNk+cZzkjqFU2B////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAADAAAAAwAA + AAMAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wGkYDwHn2Q3I55jM02ZYDFpmV8vcZtgMXOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaXzBzml8wc5pf + MHOaXzBzml8wc5pfMHOaXzBzml8wc5pfMHOaYDFzmV8ycZxiM2WfZjlDo2s7F7ByQgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAA + AAcAAAAHAAAABQAAAAUAAAADAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAHAAAACQAAAAsAAAALAAAACwAAAAsAAAALAAAACQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAACwAA + AAsAAAALAAAACwAAAAkAAAAHAAAAA////wH///8B////Af///wH///8B////Af///wGQTUMDn2o6E6Bl + ODebYjRbnGAwbZpgMHOZXzB1ml8wdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpf + L3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WaXy91ml8vdZpfL3WZXzF1ml8xc5pg + MmubYTVTnmc8LatkNQ2rXi0D////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAJAAAACwAAAA8AAAARAAAAFQAAABcAAAAXAAAAGQAAABcAAAAVAAAAEwAAAA8AAAANAAAACQAA + AAcAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAACwAAABUAAAAdAAAAIQAA + ACMAAAAjAAAAIQAAAB8AAAAbAAAAEQAAAAcAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAATAAAAHQAAACEAAAAjAAAAIwAAACEAAAAfAAAAGwAAABMAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8Bol8xCZ5iOh2cYzU9nGIzWZtgMmuZYDF1mV8wd5lg + MHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlhMHmZYTB5mWEweZlh + MHmZYTB5mWEweZlgMHmZYDB3mWAxdZthMmmcYjNVoGM3N6FnORelaz0F////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAcAAAANAAAAEwAAABkAAAAhAAAAJwAAAC0AAAAxAAAAMwAA + ADUAAAA1AAAANQAAADEAAAAtAAAAKQAAACMAAAAdAAAAFQAAAA8AAAAHAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAATAAAAJwAAADcAAAA9AAAAPwAAAD8AAAA/AAAAOwAAADEAAAAdAAAACwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFAAAADwAAACUAAAA3AAAAPQAA + AD8AAAA/AAAAPwAAAD0AAAA1AAAAIwAAAA8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AZhpMgmhaT4boGU4NZ1jNU+bYjNjmWEwb5lfMXWZXzB5l18xe5deMHuYXzB7mF8we5hf + MHuYXzB7mF8we5hfMHuYXzB7mF8we5hfMHuXXzF7l18xe5hfMHmYXzF1mmAxbZphM2GcZDRNnGU4MZxo + OhemdTIH////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAUAAAALAAAAEwAA + AB8AAAArAAAANwAAAD8AAABFAAAASQAAAE0AAABPAAAAUQAAAFEAAABPAAAATQAAAEsAAABHAAAAQQAA + ADkAAAAvAAAAIwAAABcAAAANAAAABwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwAAABkAAAA1AAABSQAA + AFMAAABVAAAAVwAAAFUAAABPAAABQQAAACcAAAAPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcAAAAVAAAAMQAAAUkAAABTAAAAVwAAAFcAAABXAAAAUwAAAEcAAAAvAAAAEQAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGXWD0Folw7D6Fo + PCGaaTg1mmU1SZxjMleZYTJhmF8xZZhfM3OZXzN9mWExhZtjNIubYzSNmmIyh5hhMoWYXzN9mF8ycZhg + MGOZYDJfnWEzV5xjNUWcZjgxomk/HaV4OQ2iUUUD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAADwAAABsAAAAtAAAAPQAAAEkAAABRAAABVQEBA1cBAQVZAwMJXwoK + H2kQEi5xDxErcQsNH2kICBNlAwMHXQEBA1cAAAFXAAAAUwAAAEsAAABBAAAAMQAAACEAAAARAAAABwAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJCgoYHS4ucnM1NYGbNTR7oTUzeqE1M3qhNTR7oTU1fZ83OISVJSZZSQIC + BQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwICBRkwMHFnNzeCmTU0 + fKE1M3qhNTN6oTQ0e6E0NHyhODeAlSsqX1cAAAATAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BqnNECaRvQy+kbj9NqXFBiapyQ7Oyd0bdtnpJ57p+ + TOu/gU7vw4ZR88iJVPXKi1Xxy4xX782NWu3KjFnlxIhVy8CDUae6f097qHBFRZRiOhmIVSID////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAA8AAAAhAAAANQAA + AEcAAABPCAkaYRUYRH03N3qjVVOhx2JevOFnYsnlaWXQ621n2e9mYtbvYFzS61lWzelPTsDhQkGmzzIz + ha0fIlCFCgwdZQAAAFMAAABLAAAAOwAAACcAAAATAAAABwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkbHEEnQEG11VxX + 5vtqZOz7aWTs+2lk7PtpZOz7amTu+1RS4vs2NpKDCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHCwsRGTc4qr1fWub7aWTs+2lk7PtpZOz7aWTs+2pk7ftcWeT7OTqnpQcH + DRUAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGfXVAFoW8/J6Nt + P3OmbT6vqG4+5a1xP/Wwc0H7sHNB/a5yQP+vc0H/sHRC/7J1Q/+ydUP/tHdE/7h6R/+9fkr/wYJN/8eH + Uv/Qj1j/15Ze/d6bZPnin2fx1pVg0cWKV6O5gE5bom5AG////wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAUAAAAPAAAAIQAAADkAAABLDxAqZTw7gaVpZMDbhXzd84R77/tvaO/9Xlns/1RP + 6P9KR+T/QD/h/z083/89PN//Pz7h/0NC5f9EQ+X/R0bk/UdH0vU/QLbdMDB/qRUVMWsBAQJPAAAAPQAA + ACcAAAATAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc0N7PVKSzT/y0v1f8uMNb/LjDW/y8w1/8+P+b/PUDj/zU1 + k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcMDBEZMjSpvSot + 0f8tL9b/LjDW/y4w1v8uMNb/Oz3k/0BD5f8zNKepDAwSFQAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wGkcUgPo25BRaRrPZuhaTjXo2o496JoNv+gZjX/oGY1/6BmNf+gZjX/n2U0/59l + NP+gZjX/oWc1/6FmNf+hZzb/o2k3/6VqOP+mazn/qG07/6xwPv+wdEH/t3pG/8KET//Qj1j/25lh/d6c + Y/PRklvHuX9Pe6lyRjGbbEAJ////Af///wH///8B////Af///wEAAAADAAAACwAAAB0AAAA1BAUMTSIj + UntiXrnZhHzp+XJs8P9OTOX/Nzja/yst1P8mKdH/JSfQ/yQnz/8jJs//IybO/yMmzv8jJs7/JCfP/yQo + 0P8mKtH/LS/W/zM02f85O9X7Njez4SgqcpcLDBpXAAAAOwAAACEAAAANAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzU3 + stUmKtD/JSnP/yUpz/8lKc//Ki3U/0JG7P8/QuP/NTWThwoKFw8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwwMERkzNaq9KCvP/yUpz/8lKc//JSnP/ygr0v9AQ+r/Q0bn/zQ2 + qKkMDBIVAAAABf///wH///8B////Af///wH///8B////Af///wGlcUUFpGtAKaFqPJ+iaDjrn2Q0/51i + Mf+bYTH/nGEx/5thMf+bYTH/nGEx/5thMf+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/m2Ex/5th + Mf+cYTL/nWMy/59lNP+jZzb/p2s6/6xwPv+zdkL/voBL/8+OVv/WlFz7zIxX37V9TYWkcEUV////Af// + /wH///8BAAAAAwAAAAcAAAAVAAAALQUGD0kuMXOVamXS7XRt8P9GReH/LjDV/ycq0P8lKc//JSnP/yUp + z/8mKtD/JirQ/yYq0f8nK9H/JivR/yYq0P8mKtD/JSnP/yUpz/8kKc7/JSjP/ygs0v8uMdf/NDfF8y4w + i7ENDSFTAAAAMQAAABcAAAAH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnNjmy1Skt0P8oLM//KCzP/ykt0P8vM9b/RUnt/0FF + 4/81NpOHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTQ3 + qr0qLs//KCzP/ygsz/8oLND/LTHV/0NH6/9FSef/NTeoqQwMEhUAAAAF////Af///wH///8B////Af// + /wH///8BonNGE6JsPnmhZzblnWIx/ZpgL/+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYTD/nWMy/6Fm + Nf+nazn/rHA+/7R2Q//BgU3/yopU+72ATcGmcUVFnWlAA////wEAAAADAAAACwAAACEBAQQ/LC1sjV9c + 0vNaV+z/LzLV/ykt0P8oLM//KCzP/ygsz/8oLND/Ki7S/y8z2P80ON3/PkLk/0pN6f9GSuf/QETk/zg8 + 4P8wNNj/LDDT/ygs0P8oLM//KC3Q/you0v8xNdn/MzfK+y4xhKkCAgQ/AAAAIwAAAA0AAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCc3OrPVKy/R/you0P8qLtD/Ky7Q/zE11/9HS+7/Qkbk/zU3k4cKChcPAAAABf///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcMDBEZNTervSww0P8qLtD/Ki7Q/you0P8vM9X/Rkrs/0dL + 6P81OKmpDAwSFQAAAAX///8B////Af///wH///8BmWVEA6RtQDmiaTrDnmQz/5pgMP+aYC//mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5lgMP+aYDD/mmAw/5phMP+eZDP/omc2/6ZqOP+tcD7/untH/76A + S++rc0SBnm9CFQAAAAUAAAATAAAALSQkW29RUMvtTU3n/y4x0/8qLdD/KS3P/yktz/8pLdD/Ki7Q/y4y + 1f87P+H/VVn1/3B0/P+UmP7/rrL+/8DE/v/Gyv7/tbj8/4KG+P9OUuv/Mzfa/yww0/8pLdD/Ky/R/zI2 + 2f84PN7/NjnH9SYpaX0BAQQvAAAAEwAAAAf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzc6s9UsMdL/LDDR/yww0f8sMNL/MjbY/0lN + 7/9ESOX/NjeThwoKFw8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwwM + ERk1N6u9LjHR/yww0v8sMNH/LDDS/zA01v9HS+z/SEzp/zY5qakMDBIVAAAABf///wH///8B////AaJ+ + VQWhbT9ln2Y225xiMf2aYC//mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pgMP+aYDD/mmAw/5pg + MP+aYDD/mmAw/5pgMP+bYDD/nGEx/6BlNP+laTf/rXE+/7N2Q/WsckOljF46IwAAABkHBxE9QUGow0dI + 3/0vM9T/LDDR/yww0f8sMNH/LDDR/yww0f8uMtT/NTnb/0NH5P9JTOD7UVXb6VZa1+NZXNrjZmne7Xl8 + 5Pmho/L/y8/8/6+z/f9kaPL/ODzd/y0x0v8sMNH/MDTV/z1B4v9AROT/Nzqv0xISLkMAAAAbAAAACQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnODu01S4y0/8tMdL/LTHS/y4y0/80ONn/S0/w/0ZK5v83N5OHCgoXDwAAAAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAHDAwRGTY4rL0vM9L/LTHS/y0x0v8tMdL/MjbX/0lN + 7f9KTun/NzmpqQwMEhUAAAAF////Af///wGlb0EJo24/aZ9mNeucYTD/mmAv/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5pgMP+aYDD/m2Ew/51j + Mf+gZTP/pmk3/6tvPPumbT61UjUhNSkra3VFRtH1NTfX/y0x0v8tMdL/LTHS/y4y0v8uMtL/LjLT/zE1 + 1P83O8jrPD+7qT4/sGk9PalDOzynNzw8qjc7Pa1JPT6uX0NEv5NcX9DdlJfv/Zmd/P9PU+z/NDjZ/y4y + 0/8vM9T/OT3e/01R8f8+Qtf9KCpybwICAx8AAAALAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc5O7TVLzPU/y4y0/8uMtP/LzPT/zY6 + 2v9NUfH/SEvn/zc3k4cKChcPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAcMDBEZNjmtvTE00/8uMtP/LjLT/y8z0/80ONn/S0/u/0tP6v84OampDAwSFQAAAAX///8Bp29BCaNr + PXGhZzXznGEw/5thL/+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+cYTD/nGIx/5xiMf+cYjH/nGIx/5xiMf+cYTD/m2Ew/5thMP+bYTD/m2Ew/5th + MP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5thMP+bYTD/m2Ew/5xhMP+eYjH/omY0/6hsOfuVYjexQj+ZuTw+ + 2f0wM9T/LzPT/y8z0/8vM9P/MDTU/zE11v8xNdX/Oz6/3T5BqU9DQ6AP////Af///wH///8B////Af// + /wH///8BQ0ORBzs7njFDRr7Jb3Pv/Wlt+v9AROT/MjbW/zA01P82Otr/S0/v/01Q7v83OqGzDxAlJwAA + AAsAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJzo8tdUyNdX/MTTU/zE01P8xNNT/ODvb/09S8v9KTOj/NzeThwoKFw8AAAAF////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABwwMERk3Oa29MzbU/zE01P8xNNT/MjXV/zc6 + 2v9NUO//TlDr/zg6qqkMDBIVAAAABah3RQejbT9poWY185xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+dYjH/nmMy/6NmNP+majj/p2s5/6ls + Ov+pbTv/qGw6/6ZqN/+iZjT/nmMy/51hMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+cYTD/nGEw/5xhMP+eYjH/oGUz/6NnNf1wVof7NTjW/zE11P8xNdT/MTXU/zI21v81Odn/Nzva/zk8 + xOlAQp5B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABTU3izU9QL3VTlLs/0hM + 6v8zN9b/MTXV/zU52P9FSej/Wl/4/z5AvtUeH081AAAACwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnOz221TQ31v8zNtX/MzbV/zM2 + 1f86Pdz/UVTz/0xO6P83N5OHCgoXDwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAHCQoRGTc6rr00N9X/MzbV/zM21f8zNtX/OTzb/09S8P9PUuv/OTqqqQwMEhUAAAAFom09UaJo + NuudYjD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xh + MP+dYjD/nmMx/6FlM/+lajb/rW88/7Z3Qv+9fkj/woFL/8KCTP/BgUv/vH1I/7N1Qf+tcD3/qGw5/6Jm + NP+eYzH/nWIw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/5xhMP+cYTD/nGEw/51iMP+dYjD/nmMx/51m + PP9UR6n/NDnZ/zc72/84PNv/Nzva/z5C4P87PtT7PkCrfSIiSQP///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAcAAAAPAQEDGzExhns4PM75NzvZ/zM31f8zN9X/NTnX/0FF5P9cYPv/QEPI5Sst + cEMAAAAJAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCc8PrbVNjnX/zU41v81ONb/NTjW/zw/3f9TVvP/TVDo/zY4k4cJCRURAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAcGBhEbODquvTY51v81ONb/NTjW/zU4 + 1v87Pdv/UVTw/1FU7P86O6upCwsRE5xoPC+haDjRnmMx/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/55jMf+iZjT/qW06/7BzP/u6fEbnwoNN4cmJ + U9vQjljb2JZd4d+cYe3fnWP925dd/82MU/+9fkf/r3E9/6ZpNv+fZDL/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nmMv/5RpYv+HheL/gob2/3d69f9dYOv/Q0fl/zxA + yNs6Opcj////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAAFQAAAB8AAAAxICBVZzs+ + yvU1ONj/NTjW/zU41v82Odj/QEPi/1tf+v9DRs/xMjOBSQAAAAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJzw/ttU4O9j/NjnX/zY5 + 1/83Otf/PUDe/1RX9P9PUen/NjeQiQcHDxUAAAANAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAADQUHDh84O6y/ODvX/zY51/82Odf/NzrX/zw/3P9SVfH/UlXs/zo7q6kuHxoZomo6v59k + Mv2dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+fYzH/o2c2+ahtPNOqckCPq3RDaap3RD+pdEUxqHVGJ6p1SCeud0g1sHhIS72DUHPPkFqz2ZZf49qW + XfnEgkz/rnA9/6NnNf+fZDL/nmIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51iMP+dYjD/nWIw/51i + MP+dYjD/n2Uz/7OUkP+6vPX/v8L8/7e7+/9bXuj/Oz69qT09egsAAAADAAAABQAAAAUAAAAJAAAADQAA + ABEAAAAVAAAAHQAAACUAAAAvAAAAOwAAAEckJWKDP0LO9zc62f82Otf/NjrX/zg72f9AQ+H/WVz4/0NG + 0O80NYhFAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnPT+21Tk82f84O9j/ODvY/zg72P8/Qt7/Vln0/1BT6f8zNYiRBAQIJQAA + AB8AAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAfAwMJLTc7qsM6Pdj/ODvY/zg7 + 2P85PNj/PkHd/1RX8v9UV+3/Ojyrq49eOG+hZTT5nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/oWU0+6NrOtOlbkFxpW9AIaqBRQX///8B////Af// + /wH///8B////Af///wH///8B////AYZbMQ2sdkYtu4BMg8eHUvG9fEj/qmw6/6NmNf+fYzL/nmIx/55i + Mf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYjH/nmIx/55iMf+eYTD/mGND+2NYqtdRVdHXXF/U509S + ze0/Qq9tICAuBwAAAAsAAAAPAAAAEwAAABsAAAAhAAAAKQAAADEAAAA5AAAAQQAAAEsAAABRCwwdYUND + o8VQUOP/OT3Z/zg82P84PNj/OT3Z/0JG4v9VWfX/QkTM4zY3iDUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCc9QLfVOj7a/zk9 + 2f85Pdn/OT3Z/0BD4P9XW/X/UVXq/y4yfpsCAgQ/AAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAOwAA + ADsAAAA7AAAAOwAAAD0CAgZFNzqlyTo+2P85Pdn/OT3Z/zo+2f8+Q97/VVny/1RY7v9LRJ2/nmY24Z9j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6Jo + N+2kbj57pHhGGf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGVaTsDpnBDPbN5Rr+0dUH9p2o3/6FlM/+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+gZDH9oGk9oU1Ghxc7OYwbPDuPHx0dPxMAAAAVAAAAHQAAACUAAAAvAAAAOQAA + AD8AAABHAAAATQAAAFMAAABVAAABWRobTIFeW6rNd3Ts+0tN5P85Pdn/OT3Z/zk92f86Ptr/RUjk/01R + 7f8/QsTJNTaFHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJz5Bt9U8QNv/Oz/Z/zs/2f87P9r/QUXh/1hc9f9TV+r/LS13pQEB + A1UAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQAAAFUAAABVAAAAVQEBBFk2OKLNPEDZ/zs/ + 2v87P9n/Oz/a/0BE3/9WWvP/Wlzo/39da/ehZDH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59j + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/6BjMf+iaDfVo3BAR593Rwn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpXBBF6xyQaerbjv7o2Y0/6Bk + Mf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+fYzH/n2Mx/59jMf+iZzbrnGQ9MwIB + AA0AAAAXAAAAIwAAADEAAAA7AAAARQAAAE0AAABTAAAAVQICCFsRETFvIB9Rg0pHhatsaLPXl5De846H + 8/9UVuj/PEDb/zs/2f87P9n/Oz/a/z1B2/9ESOP/Rkrk/z5AsaE0NHwJ////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnP0G31T1B + 3P89Qdr/PUHa/z1B2/9DR+H/Wl71/1VZ6/88PI/DLi1hiy0sYo0tLGKNLSxijS0sYo0tLGKNLSxijS0s + Yo0tLGKNLSxijS0sYo0tLGGLLSxijT5Aq9s+Qtn/PUHa/z1B2v89Qdv/Qkff/1hc9P9pY9T/mmRD/6Bj + MP+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+hYzH/o2c326Jt + Pj+geEoD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bp3FCG6lvP6emaTf7oWQy/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6FkMv2cZTqdEw0IIQAAADMAAABBAAAASwAAAFEBAQRXCwwjZyEh + S39GRYGlXVqjx4R+yeWYkOHzmpLw+4yF9P9oZ+7/Sk3j/z9C3P89Qdr/PUHa/z1B2v89Qdv/P0Pd/0RI + 4v9DRtL7P0GmSSwsYwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCc/QrfVP0Pd/z5C2/8+Qtv/P0Pc/0VJ4v9cX/X/bGz0/314 + 4/uAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3gHrl94B65feAeuX3eXXl/UtO + 3/8+Qtv/PkLb/z9D3P9ESOD/Wl70/4JpnP+gZDL/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bj + Mf+gYzH/oGMx/6BjMf+gYzH/oGMx/6NnNu2ibD5Pl4VGA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpW5CI6Vq + OcOjZjP/oGQx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6BjMf+gYzH/oGMx/6Bm + N+cxIRRNAAAASwEBBFcKCx5jKitZh0pJja93c7nXk4za8Z6W7vuVj/b/fXnz/2Vk7f9SU+b/Rkjh/0FE + 3f8+Qtv/PkLb/z5C2/8+Qtv/PkLb/z5C2/9ARN3/Qkbe/0FEv8c/QI4T////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0BD + uNVBRd7/QETc/0BE3P9ARNz/Rkri/1FU7P9PUeX/UFLl/1BS5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS + 5f9QUuX/UFLl/1BS5f9QUuX/UFLl/1BS5f9RUuX/SUvi/0FF3f9ARNz/QUXd/0VK4v9hX+H/l2pd/6Bk + L/+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+iZjP7pWw9h5mA + TAX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BpW0/VaNnNfWgZDH/oGQx/6BkMf+gZDH/oGQx/6Bk + Mf+gZDH/oGQx/6BkMf+gZDH/oGQx/6BkMf+gZDH/omYz/18/JIcOECppNzd2oXl1uNmhmeX3pJv0/42H + 9/9savD/VFXo/0hK4v9DRt//QUXd/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0BE3P9ARNz/QETc/0FF + 3f9BRcrtQkSoSUpKlgP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAkcHEAnQUO41UNG3/9CRt7/Qkbe/0JG3v9DR9//Qkbe/0JF + 3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG3v9CRt7/Qkbe/0JG + 3v9CRt7/Qkbe/0JG3v9DRt7/R0vk/3hiov+gZjb/oWQw/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/oWQx/6NpOcOlc0MV////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGpbkMJo2o7paJlMv2hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6Fk + Mf+hZDD/j2Va8YeAze+on/X9iYT3/2Rj7v9OUOb/Rkjh/0NH3v9CRt7/Qkbd/0FG3f9CRt7/Qkbe/0JG + 3v9DR97/Q0ff/0RI4P9FSeH/Rkri/0ZK4v9ESN//QkXL6UBBq1////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwc + QCdCRLjVRUjg/0VH3v9FR97/RUff/0dK4f9IS+P/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM + 4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hM4/9ITOP/SEzj/0hL4/9JTOP/Rkjg/0VI3/9JTOX/iGN5/6Fk + MP+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+hZDH/oWQx/6FkMf+jZjT7o2w8aaSI + TwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGlbUJJo2c18aFkMf+hZDH/oWQx/6Fk + Mf+hZDH/oWQx/6FkMf+hZDH/omUx/6JlMv+jZTL/omUy/6JlMf+kcE7/hXjY/1xb6/9LTeP/RUng/0VI + 3/9ER97/RUjf/0VI3/9FSN//RUjf/0ZJ4P9HSuH/SEvi/0pN4/9MUOf/UVTr/1FU6/9NUOj/SEvc/0RG + x9VBQq1XOTmeB////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0NFudVHSuH/Rknf/0ZJ3/9HSuD/TVDm/2hr + 9P+Ag/j/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE+P+BhPj/gYT4/4GE + +P+BhPj/fYD4/1xf7P9HSuD/R0rg/1JR2P+WZVL/omQv/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6Jk + Mf+iZDH/omQx/6JkMf+iZDH/omQx/6NpONWlckEl////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AaZtSAekaTm9o2Uy/6JkMf+iZDH/omQx/6JkMf+iZDH/o2Uy/6NlMv+lZjP/pWcz/6do + Nf+qajX/q2w3/6JqRP9kVrP/R0rh/0ZJ3/9GSd//Rkng/0dK4P9HSuH/SEvi/0pN4/9MT+b/TlHp/1NW + 7P9ZXPH/XF/1/11h9/9XWvH/TE/h/UdKz+VDRrqTQkOrNTo9igX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAkcHEAnQ0a61UlM4v9IS+H/SEvh/0hL4f9OUef/bXD5/6Sn/f+usfv/rrH7/66x+/+usfv/rrH7/66x + +/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+usfv/rrH7/66x+/+Qk/P/UVTj/0hL4P9IS+L/Z1iz/59l + Ov+iZDD/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+iZDH/omQx/6JkMf+jZTH/pGs7n6Bx + Pgf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaNqPGOlZzT3omQx/6Jk + Mf+kZjL/pGYy/6VmMv+mZzP/qGk1/6prN/+rbTn9qG5D/5xtZf99YY7/YlW3/0xM2P9HSuD/R0rg/0dK + 4P9JTOL/Sk3j/01Q5v9SVer/WFvw/2Fk9v9navr/Z2r7/2Fk9/9ZW+39UVPd9UdKyNtBQ7KRPDyaOyws + aQsAAAAHAAAABwAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdER7rVSk3j/0pN4v9KTeL/Sk3i/1BT + 6P9navn/YmXw/0xNw9tOUMfDT1HKwU9Sy79PUsu/T1LLv09Sy79PUsu/T1LLv09Sy79PUsu/T1HLv05R + ycFNT8XFTE7M8UtO4f9JTOH/Sk3i/0pN4/9/YIT/o2Yx/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6Nl + Mf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6RnM/+ibj1N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BpHFCNaRoNuekZTH/pWcz/6doNP+pajX/rG03/65vOv+sbzz1pGo7yX9b + V8VtY7/3WVjj/0hM5f9ITOP/SUzh/0lM4f9JTOH/S07j/05R5v9VWO3/YmX4/2ls/P9pbPz/ZGf2/1lb + 5v9NUNP3SErEw0RFtZE6OphbJydgKwoKGB0AAAAbAAAAGwAAABkAAAAXAAAAFQAAAA8AAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAJHBxAJ0VHu9VMT+T/S07i/0tO4v9MT+P/UlXp/2ls+v9iZe//ODiTiR4eSBcvL3YNNTWNCzU1 + kgs1NZILNTWSCzU1kgs1NZILNTWSCzU1kgs1NY4LLCxsDRcXOiFAQ7LBTE/i/0tO4/9LTuP/TE/j/49j + Zf+kZTD/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+jZTH/o2Ux/6NlMf+kZTH/pWk236Ny + Px3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGoaEMFpms4sahp + NP+tbTf/r3A8/65xPd+scT+3pW4/dYtbODMpHiYzRUa0wVdY6f9LTuP/S07i/0tO4v9LTuL/S07j/0xP + 5P9RVOn/Wl3y/19i9v9aXez/UVTa8UtNystHSLqbQ0SvX0FBoCk4OIkNCgoZBwAAARsAAAAxAAAAPQAA + AD8AAAA9AAAAOQAAADcAAAAxAAAAJQAAABMAAAAH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnRUi81U1Q5f9NUOP/TVDj/01Q + 5P9UV+v/a277/2Rm8P83OJWHCAgWDwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFBgcRGUFEs71NUOP/TVDk/01Q5P9OUeH/nGdI/6RlMP+kZTH/pGUx/6RlMf+kZTH/pGUx/6Rl + Mf+kZTH/pGUx/6RlMf+kZTH/pGUx/6VmMf+kajm5oHdCD////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGlbj1prXE+061yQKOqckJfpnNEKaVxQxF2UzIHAAAACyQk + WkVNT83nUVPn/01Q5P9NUOT/TVDk/05R5f9OUeX/T1Lm/1JV6P9OUdjzSkzHwUZHu3VERK87QkKmGT4+ + mgk7O40D////AQAAAAUAAAAVAAAALQAAAEMAAABRAAAAVQAAAFMAAABTAAAATwAAAEcAAAAzAAAAGQAA + AAn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAACRwcQCdGSLzVT1Lm/05R5P9OUeT/T1Ll/1ZZ7P9tcPv/ZWjw/zc6locICBcPAAAABf// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZQkSzvU9S5P9OUeT/TlHl/1lV + 0v+iaD7/pWYw/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH/pmcx/6Nr + OpWdcTwF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaFv + Qg+kcUIlonNHC6qIVQP///8B////AQAAAAMAAAANMTF/Y09Q2PVPUub/T1Ll/09S5f9QU+b/U1bq/1VY + 7P9OUd/9RknBzz5ApF07PZgbLi5xBQAAAAMAAAADAAAAAwAAAAMAAAAFAAAADQAAACETFDFJNDRzizQ0 + a48vMGaRKipahyMiSn8fH0Z5HBxEax0eSU0ICBUbAAAAB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHBxAJ0dJvNVRVOf/UFPl/1BT + 5f9RVOX/V1rs/29y+/9navD/OTqWhwgIFQ8AAAAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAABwYGERlDRbO9UVTl/1BT5f9QU+b/aVu4/6RnN/+lZjD/pWYx/6VmMf+lZjH/pWYx/6Vm + Mf+lZjH/pWYx/6VmMf+lZjH/pWYx/6VmMf+lZjH9o289daJ3QQP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAk5O5JzUlTg+1JV5v9RVOb/UVTm/1NW6P9bXvD/YGP0/0lLxOUhI1ZJAQEEFQAAAA0AAAAJAAAABwAA + AAcAAAAHAAAACQAAAA8AAAAbAAAAMS4udIFratvziITq+YeC5vmHguT3hYDg9YSA3vOBfdvxXVzE3ycn + aysAAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAkcHEAnSEq91VNW5/9SVeb/UlXm/1JV5v9ZXO3/cXT8/2ls8f86OpaHCAgVDwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAHBgYRGURFtL1TVeb/UlXm/1JV + 5/9zX6X/pmYy/6ZmMf+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6Zo + NP2lckJP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAQEDBzw+mnNRVeD7UlXn/1JV5/9TVuf/Vlnr/2dq + 9/9navP/Pj+juQEBA0MAAAAxAAAAJQAAAB0AAAAZAAAAGQAAABsAAAAfAAAAJwAAADUAAABHP0GgvVpb + 6f1cXuz/X2Dt/2Jj7/9kZfD/aWnz/3R1+/9TVtDnLTJ4JwAAAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAACRwcQCdISr3VVVjo/1RX + 5/9UV+f/VFfn/1pd7v9ydfz/a23x/zo6locICBUPAAAABf///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAcGBhEZQ0W0vVRX5v9UV+f/U1fo/3tilf+nZzD/pmYx/6ZmMv+mZjL/pmYy/6Zm + Mv+mZjL/pmYy/6ZmMv+mZjL/pmYy/6ZmMv+mZjL/pmk1+6RuPyX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADOTuVW1BT2/dVWOn/VFfo/1RX6P9YW+z/bXD5/3Bz9v8/QaPFBQUNWQAAAEsAAABDAAAAOwAA + ADcAAAA3AAAAOQAAAD0AAABFAAAATRgZQHVXV87tWlzt/1RW5/9TV+j/U1fo/1RX6P9dYPD/aGv5/0tN + xs8uK3cZ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAJHBxAJ0lLvdVWWen/VVjo/1VY6P9WWej/XWDv/3N2/P9sbvL/OjqWhwgI + FQ8AAAAF////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAABwYGERlERrS9Vlnn/1VY + 6P9WWef/gmOK/6dnL/+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6Zn + Mv+majb5oW0/F////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAM6PJQ/T1LV7Vpd7v9ZXOz/Vlnp/1hb + 6/9jZvT/bHD6/1NW1/c0NYOtCwscZQAAAVcAAABTAAAAUQAAAFEAAABRAAAAVQEBBFkSEjNvW1mr0XJy + 8P1YWuv/VVjo/1VY6P9VWOj/V1rq/19i8v9eYe//RUiznzIjawn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAkcHEAnSUu91Vda + 6v9XWun/V1rp/1da6f9eYfD/dHf8/21w8v86OpaHCAgVDwAAAAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAAHBgYRGUVHtL1XWuj/V1rp/1ha5f+HZYD/p2cv/6ZnMv+mZzL/pmcy/6Zn + Mv+mZzL/pmcy/6ZnMv+mZzL/pmcy/6ZnMv+mZzL/p2cy/6ZpN/embD8R////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////ATY2fQ9LTsXJYmXz/2Nm9P9bXu3/WFvr/1pd7f9jZvX/YGLx/1lb3vtLTLDRODqApygo + V4ccHD95FBUycRgYN3MwMWKPSkmHrYWAxuWgmfH9bW7z/1ha6v9WWen/Vlnp/1da6f9aXez/X2Ly/1ZZ + 3/VBRKVZKChfA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAACRwcQCdKTL3VWl3r/1lc6v9ZXOr/Wl3q/2Bj8f93ev3/b3Lz/zo6 + locICBUPAAAABf///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAcGBhEZRke0vVlc + 6P9ZXOr/Wl3m/4hmf/+oZy//p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dnMv+nZzL/p2cy/6dn + Mv+nZzL/pmk366pzRA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUVHsntnaen3gYT9/2pt + 9/9eYfD/WV3r/1te7P9bXu3/XF/u/29v9v9+e/D9f3zk94F92/WGgtjzlY/c86eg5vmyq/H9npr7/2tr + 8/9bXuz/WFvq/1hb6v9YW+r/WVzq/1te7P9aXer/TE7EwzU1fRH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAJHR1BJUtN + vtVcX+z/W17r/1te6/9cX+z/YmXy/3l8/f9xdPP/OzuWhQgHFA8AAAAF////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAABwcHEhlHSbW9W13q/1te6/9dX+f/imd7/6loMP+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+nazjjpnNID////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BPkCiHVNUy8mPkvn/oKP+/3N2+v9hZPL/W17t/1pd6/9aXev/W13s/19h + 7v9kZvH/bGz0/3Z29/96efj/dHP2/2lp8/9gYe//W13r/1pd6/9aXev/Wl3r/1pd6/9bXuz/XF/s/1NW + 1/FDRKhT////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAcgIEkhTE+/1V5h7f9dYOz/XmHt/2Bj7/9kZ/P/en39/3N1 + 8/87PZiDCAkYDQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAFCAgUFUhK + t7tdYOv/XF/s/2Bh5/+Oanj/qWgw/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6hoMv+oaDL/qGgy/6ho + Mv+oaDL/qGgy/6drONuidkQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BRESsN2Jk + 1de3uvz/0dP+/5mc/f9ydfr/ZGfz/19i7/9dYOz/XF/s/1xg7P9dX+z/XGDs/11g7P9dYOz/XWDs/11g + 7P9dYO3/XmHt/15h7f9eYe7/X2Lu/15h7v9XWt31SEq2f0FClgv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAykp + XRtOUMHTX2Lu/2Zp8P9xdPj/c3b6/3R3+v9/gv7/dHb0/z4/oX0PECsHAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMMDSAPSk27t15h7P9laO//cnT0/5NyiP+qaTH/qmkz/6pp + M/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qmkz/6ppM/+qaTP/qWw526J2RA3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFAQJcFR0iwUWZo1dnCxPn/6ur+/8rL/v+gov7/goX7/3Bz + +P9oa/T/ZGfy/2Jl8f9hZPD/YmXw/2Jl8f9jZvL/ZWjz/2hr9P9pbPX/am33/2Zp9f9hZO//V1rb90pL + u5M/QKAR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTl/E09RxM96fPP/t7r7/8TG///Exv//w8b//7W4 + //97ffT/QUOodxocUQX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ARka + QAdLTb+1cHPv/7G0+v/Exfz/tZWU/65tN/+wbjr/sG46/7BuOv+wbjr/sG46/7BuOv+wbjr/sG46/7Bu + Ov+wbjr/sG46/7BuOv+tbz7bonZEDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE1N48FPj+lNV9izcOen+752dn7/+zt/v/j5P//yMr+/7Cz/v+go/7/lpn9/4uO+/+Mjvz/jY/8/4qN + /P+Kjf3/jI/+/4GD/v9ydPn/YWPr/VRX0uFHSrNvQUOgE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wE9P5cRUFG/z3x+6f+Tler/k5Xq/5OV6v+Tler/kZPr/3J05v9CRax1MzOIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BNTqMBUlNu7N1d+b9kpTr/5KU6f+fgZP/uHVF/7h2 + R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uHZH/7h2R/+4dkf/uXZI/7J0Rummd0QP////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BOz6hFUVItHVdX8zBfX/c97Cx + 8//Q0f7/4OH+/+Hj/v/Z2/7/zc/+/7/B/v+wsv7/oqT+/5OV/v90dvD/YWPg/VNVzNFHSLOHQkOrNSMl + WwP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUREiANCRKk/QUSuWz9Crls/Qq5bP0KuWz9C + rls/Qq1dQ0auXURErBf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BREWqJ0FFrlk+Qq5bPUCtW45mZKe9ekz/vHlM/7x5TP+8eUz/vHlM/7x5TP+8eUz/vHlM/7x5 + TP+8eUz/vHlM/7x5TP+8eUz/tHZJ76N0RhH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AS4lgAk1OqIpQESxaUtMuJVaXMq1XmDQx2Bi1NFgYtPXWlzOzVZY + zsNSU8azTE69p0VGrm1AQqovOTmcDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEvOokDKTqAAyk6gAMpOoADKTqAAyw7gQM2NogD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BKzuHAyk6gwM1N3gDqnNHb7x6 + Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+8eU3/vHlN/7x5Tf+0d0r5o3ZEF/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEsLIgDLS2XBTg5rA05NaYVOjyiGz0+pB86P6AZPT6iEzs8pgs7PqEHNTWIA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGncUNfunlN/bx6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6 + Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7d3S/uldEcv////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AaZx + QTe5eUz3vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/vHpO/7x6Tv+8ek7/uXlN/ahx + RlOSaEgD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bo3JGD7h4TO+9e0//vXtP/717T/+9e0//vXtP/717 + T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0/9qXJEc5tzOgP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGRckkDsnZI2b57T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/717T/+9e0//vXtP/718 + T/+sdEebonZFBf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdEe5vnxQ/718UP+9fFD/vXxQ/718 + UP+9fFD/vXxQ/718UP+9fFD/vXxQ/718UP+9fFD/vXxQ/7J2S7eqcUQN////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Aa50R3+9fVD7vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718Uf+9fFH/vXxR/718 + Uf+9fFH/t3lN8alzRjP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bn25BCZltQAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bp3BCUbp7T/W9fVL/vX1S/719 + Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+9fVL/vX1S/719Uv+7fFH/rXRHaZloNAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaZ1Qw24gFGJwI1bg7J/UU2seU4ZrHZIC55t + QAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGmcUAZuHlO1b99U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/799U/+xdkqvpHVDDf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BqXBGPcSHWuvxuYj/9L+N+eGufO/XpXXHyJVmibF9T2GldEUrnmBACf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGwdUihvnxS/b59 + U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/7l7T+2pdEc/////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGudUmBvn1S+8yJXv/hnG//7Kh5//Oz + g//2vIr99b+N++q2hOvbp3fVy5lqo8OMXmeud0o7oG4/Gf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AatyR127fFH3vn1T/759U/++fVP/vn1T/759U/++fVP/vn1T/759 + U/++fVP/vn1T/759U/++fVP/vX5T/7J4TJebaz4J////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpG5AC7V5TdG+flT/v39V/8mHXP/QjGD/1ZFk/9uXav/jnnD/6ad4//Kzg//zuIf987yK+ey6 + iOvdqnjRu4lZnaJuPhv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bpm9BI7Z5 + TtO/flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/vn5U/75+VP++flT/unxR56x0 + SEv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRuRAOrc0dfvX5T975+VP++flT/vn5U/8CA + Vv/Dglf/x4Va/8uIXf/PjGH/1JBk/9qWaf/inW//5qR1/9ygcf/BiFrVonFCIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wG6dzMDr3VJgb9/VPu/f1X/v39V/79/Vf+/f1X/v39V/79/ + Vf+/f1X/v39V/79/Vf+/f1X/v39V/79/Vf/AgFX/tntOw6BuQhv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BpHVFH7R5TdPAf1X/v39V/79/Vf+/f1X/vn9V/75/Vf+/f1X/v39V/8GAVv/Eglj/xoVa/8eG + W//Cglf/v35V/7B1SZWldE0H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGtckcpuXtQ579/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/ + Vv/EhFn9tntQtaNrQQ////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaVwQQ2wd0qhv39V/79/Vv+/f1b/v39W/79/ + Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+/f1b/v39W/79/Vv+9flT/rHdHRZN0NAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AaRvRQ2vdUqjv4BW/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/8KDWf/LimD9u35VpaZwRhn///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGmbkIPr3dKhb1/VPe/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+AV/+/gFf/v4BX/7+A + V/+/gFf/v4BX/7Z6T9mkckER////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AahyRi24fFLlwIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wYFY/8iIXv/Vk2j7xYldubB6TDuiaUAF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bp3FHKbJ4TJ2+f1X1wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP++gFb7rHRHe5VzMgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpnJFBax0SYW/gFf7wIFY/8CB + WP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/xYVc/9KQZf/loHP/25xu27yG + WX2mdEkjl2c8Bf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGjZ0ADpnBEEax0 + SVm3e1DXwIFX/cCBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CBWP/AgVj/wIFY/8CB + WP/AgVj/wIFY/7l8Utmnc0Il////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BoGpEE7Z7UNnBg1r/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/DhFv/yopg/9SSaP/ppnn/8rWG/dqod9vAi16FrHhLP55rPRNgQRAFUDchA/// + /wH///8B////Af///wGgRDYDp3JEJ6t0SG+3fFC5v4JX98GDWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf+/gVf9sXhMiZhmIgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BqXRHQbyA + VuPEhVz/wYNa/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/ChFr/yIhf/9GQ + Zv/dnHD/8bKD//nCkv/wvYz53q187dakdMnOm2yxzZdpl8qRZI/HjF6fxolcrcSHW9PGiF3xyIle/cWH + XP/Bgln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CCWf/Agln/wIJZ/8CC + Wf/Agln/wIJZ/7Z7UM+ldEYh////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGfZTUFsHdMf8SGXPfHiF//xIVc/8KEW//Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Cg1v/xode/82OZP/WlWr/3pxw/+akeP/vsIL/9LaH//K0 + hv/ysoP9761//emmef3enHD90ZBm/8iJYP/Ehl3/woRb/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GD + Wv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv/Bg1r/wYNa/8GDWv+8gFX1q3VIXaJuOgP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGib0IRtn1Rl8uMYfvJi2L/xYde/8OFXf/BhFv/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//BhFv/woVc/8aIXv/Li2H/z49l/9STaP/XlWv/1pVr/9aVav/Uk2n/0ZFn/8uMY//Fh17/woVc/8GE + XP/Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GDW//Bg1v/wYNb/8GD + W//Bg1v/v4JY+7B4TJmkcUIR////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGncUITuX9SndCRZv3MjmX/x4ph/8WH + X//ChV3/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/ChVz/xIZd/8WH + Xv/GiF//x4hf/8aIXv/Fh17/w4Vd/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GE + XP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEXP/BhFz/wYRc/8GEW/+zek2xpXJDG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGcbDYLuH5RodWVa/3QkWn/yoxk/8aJYf/ChV7/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/tHtR16V0QiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGZaTgJuH5SkdSU + avfZmHD/z5Bp/8qMZP/GiGH/w4Zf/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GE + Xf/BhF3/wYRd/8GEXf/BhF3/wYRd/8GEXf/BhF3/wINb/bV8UsGnc0cr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGeajsPt35TbdSVatvlo3n/2ppx/9GSav/Nj2f/yYpj/8SG + X//ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/76C + WvezeVCdqXRHIf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGSZT0FsXtNOdOWaavqqn756qp//+Cgdv/Xl27/0JBo/8mMZP/FiGH/w4Zf/8KFXv/ChV7/woVe/8KF + Xv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KFXv/ChV7/woVe/8KF + Xv/Dhl//woVe/8KFXv/ChV7/woVf/8KFXf+7gFbprnZLfahzRBX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bn3BCDb2FWHnXn3Hd77eK+/Gz + if/kpHr/25ty/9WWbv/PkWn/yY1l/8aKY//EiGH/w4dg/8KGX//Chl//woZf/8KGX//Chl//woZf/8KG + X//Chl//woZf/8KGX//Dhl//w4dg/8SIYf/EiGH/xYlh/8WIYf/EiGD/xIhh/8SIYP++hFr1tHtRwalz + SD2XYzIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BSCYAA59sPh25hVh33Kl82/LBk/34wpb/8bWJ/+enff/ennX/2Jlx/9SV + bf/Qkmv/zI9o/8qNZv/JjGb/yYxm/8iLZf/Hi2T/yIxl/8iMZf/IjGX/yIxl/8mMZv/KjWb/yYxl/8mM + Zf/JjGb/yo5n/8qNZv/AhVz5tHxQu6l0R1OfazwL////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYpc + LQOreEcXuIdZUc6dbqHgtYbh8MOV+fnIm//3wZX/8baL/+usgv/lpXz/3593/9ucdP/ZmnL/1Zdw/9SW + b//Ulm//1ZZv/9SWb//UlW7/1ZZu/9aXb//Wl2//0ZNr/8uOZvm/hVvXtXxSmah2SEmhdUEN////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BpHBEC613SSfCk2VbxZVnm9Sl + ebnluYvZ6ryP8e69kPnwuo398baL/fCziP3sroP96aqA/eeofv3kpXr94aJ4/d6edPnXmnDpy5Bl1cGH + XL+2f1SPs3xRU6ZzSCOhb0QH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wF7PQoFpXVKDap5SyeueUtFw5BiU8eWZ23Kl2mDzZhqg8qT + Zo/Ij2KTxo5hfcKKXW2+h1pjuYJVVax2STmqdUchpXdEDZJcKwX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTSwAA2pBAAP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Web References/jp.genome.soap/Definition1.datasource b/Web References/jp.genome.soap/Definition1.datasource deleted file mode 100644 index 0fcdf59..0000000 --- a/Web References/jp.genome.soap/Definition1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.Definition, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/KEGG_v6.wsdl b/Web References/jp.genome.soap/KEGG_v6.wsdl deleted file mode 100644 index 0b0eacb..0000000 --- a/Web References/jp.genome.soap/KEGG_v6.wsdl +++ /dev/null @@ -1,1579 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Web References/jp.genome.soap/LinkDBRelation1.datasource b/Web References/jp.genome.soap/LinkDBRelation1.datasource deleted file mode 100644 index 3092c84..0000000 --- a/Web References/jp.genome.soap/LinkDBRelation1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.LinkDBRelation, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/MotifResult1.datasource b/Web References/jp.genome.soap/MotifResult1.datasource deleted file mode 100644 index 2d16248..0000000 --- a/Web References/jp.genome.soap/MotifResult1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.MotifResult, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/PathwayElement1.datasource b/Web References/jp.genome.soap/PathwayElement1.datasource deleted file mode 100644 index e5d8d47..0000000 --- a/Web References/jp.genome.soap/PathwayElement1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.PathwayElement, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/PathwayElementRelation1.datasource b/Web References/jp.genome.soap/PathwayElementRelation1.datasource deleted file mode 100644 index 5868cbd..0000000 --- a/Web References/jp.genome.soap/PathwayElementRelation1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.PathwayElementRelation, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/Reference.cs b/Web References/jp.genome.soap/Reference.cs deleted file mode 100644 index 7bc84c5..0000000 --- a/Web References/jp.genome.soap/Reference.cs +++ /dev/null @@ -1,5186 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.239 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// -// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.239. -// -#pragma warning disable 1591 - -namespace HCSAnalyzer.jp.genome.soap { - using System; - using System.Web.Services; - using System.Diagnostics; - using System.Web.Services.Protocols; - using System.ComponentModel; - using System.Xml.Serialization; - - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="KEGGBinding", Namespace="SOAP/KEGG")] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(StructureAlignment))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(Subtype))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(PathwayElementRelation))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(PathwayElement))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(MotifResult))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(SSDBRelation))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(LinkDBRelation))] - [System.Xml.Serialization.SoapIncludeAttribute(typeof(Definition))] - public partial class KEGG : System.Web.Services.Protocols.SoapHttpClientProtocol { - - private System.Threading.SendOrPostCallback list_databasesOperationCompleted; - - private System.Threading.SendOrPostCallback list_organismsOperationCompleted; - - private System.Threading.SendOrPostCallback list_pathwaysOperationCompleted; - - private System.Threading.SendOrPostCallback list_ko_classesOperationCompleted; - - private System.Threading.SendOrPostCallback binfoOperationCompleted; - - private System.Threading.SendOrPostCallback bgetOperationCompleted; - - private System.Threading.SendOrPostCallback bfindOperationCompleted; - - private System.Threading.SendOrPostCallback btitOperationCompleted; - - private System.Threading.SendOrPostCallback bconvOperationCompleted; - - private System.Threading.SendOrPostCallback get_linkdb_by_entryOperationCompleted; - - private System.Threading.SendOrPostCallback get_best_neighbors_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_best_best_neighbors_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_reverse_best_neighbors_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_paralogs_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_motifs_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_motifsOperationCompleted; - - private System.Threading.SendOrPostCallback get_ko_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_ko_by_ko_classOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_koOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_ko_classOperationCompleted; - - private System.Threading.SendOrPostCallback get_elements_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_element_relations_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback color_pathway_by_elementsOperationCompleted; - - private System.Threading.SendOrPostCallback get_html_of_colored_pathway_by_elementsOperationCompleted; - - private System.Threading.SendOrPostCallback mark_pathway_by_objectsOperationCompleted; - - private System.Threading.SendOrPostCallback color_pathway_by_objectsOperationCompleted; - - private System.Threading.SendOrPostCallback get_html_of_marked_pathway_by_objectsOperationCompleted; - - private System.Threading.SendOrPostCallback get_html_of_colored_pathway_by_objectsOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_enzymes_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_reactions_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_genesOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_enzymesOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_reactionsOperationCompleted; - - private System.Threading.SendOrPostCallback get_linked_pathwaysOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_enzymeOperationCompleted; - - private System.Threading.SendOrPostCallback get_enzymes_by_geneOperationCompleted; - - private System.Threading.SendOrPostCallback get_enzymes_by_reactionOperationCompleted; - - private System.Threading.SendOrPostCallback get_reactions_by_enzymeOperationCompleted; - - private System.Threading.SendOrPostCallback get_genes_by_organismOperationCompleted; - - private System.Threading.SendOrPostCallback get_number_of_genes_by_organismOperationCompleted; - - private System.Threading.SendOrPostCallback get_reactions_by_glycanOperationCompleted; - - private System.Threading.SendOrPostCallback get_reactions_by_compoundOperationCompleted; - - private System.Threading.SendOrPostCallback get_enzymes_by_glycanOperationCompleted; - - private System.Threading.SendOrPostCallback get_enzymes_by_compoundOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_compoundsOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_glycansOperationCompleted; - - private System.Threading.SendOrPostCallback get_compounds_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_glycans_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_compounds_by_reactionOperationCompleted; - - private System.Threading.SendOrPostCallback get_glycans_by_reactionOperationCompleted; - - private System.Threading.SendOrPostCallback get_compounds_by_enzymeOperationCompleted; - - private System.Threading.SendOrPostCallback get_glycans_by_enzymeOperationCompleted; - - private System.Threading.SendOrPostCallback convert_mol_to_kcfOperationCompleted; - - private System.Threading.SendOrPostCallback get_kos_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_kosOperationCompleted; - - private System.Threading.SendOrPostCallback search_compounds_by_nameOperationCompleted; - - private System.Threading.SendOrPostCallback search_glycans_by_nameOperationCompleted; - - private System.Threading.SendOrPostCallback search_compounds_by_compositionOperationCompleted; - - private System.Threading.SendOrPostCallback search_compounds_by_massOperationCompleted; - - private System.Threading.SendOrPostCallback search_glycans_by_massOperationCompleted; - - private System.Threading.SendOrPostCallback search_glycans_by_compositionOperationCompleted; - - private System.Threading.SendOrPostCallback search_compounds_by_subcompOperationCompleted; - - private System.Threading.SendOrPostCallback search_glycans_by_kcamOperationCompleted; - - private System.Threading.SendOrPostCallback get_linkdb_between_databasesOperationCompleted; - - private System.Threading.SendOrPostCallback search_drugs_by_nameOperationCompleted; - - private System.Threading.SendOrPostCallback search_drugs_by_compositionOperationCompleted; - - private System.Threading.SendOrPostCallback search_drugs_by_massOperationCompleted; - - private System.Threading.SendOrPostCallback search_drugs_by_subcompOperationCompleted; - - private System.Threading.SendOrPostCallback get_references_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_drugs_by_pathwayOperationCompleted; - - private System.Threading.SendOrPostCallback get_pathways_by_drugsOperationCompleted; - - private bool useDefaultCredentialsSetExplicitly; - - /// - public KEGG() { - this.Url = global::HCSAnalyzer.Properties.Settings.Default.HCSAnalyzer_jp_genome_soap_KEGG; - if ((this.IsLocalFileSystemWebService(this.Url) == true)) { - this.UseDefaultCredentials = true; - this.useDefaultCredentialsSetExplicitly = false; - } - else { - this.useDefaultCredentialsSetExplicitly = true; - } - } - - public new string Url { - get { - return base.Url; - } - set { - if ((((this.IsLocalFileSystemWebService(base.Url) == true) - && (this.useDefaultCredentialsSetExplicitly == false)) - && (this.IsLocalFileSystemWebService(value) == false))) { - base.UseDefaultCredentials = false; - } - base.Url = value; - } - } - - public new bool UseDefaultCredentials { - get { - return base.UseDefaultCredentials; - } - set { - base.UseDefaultCredentials = value; - this.useDefaultCredentialsSetExplicitly = true; - } - } - - /// - public event list_databasesCompletedEventHandler list_databasesCompleted; - - /// - public event list_organismsCompletedEventHandler list_organismsCompleted; - - /// - public event list_pathwaysCompletedEventHandler list_pathwaysCompleted; - - /// - public event list_ko_classesCompletedEventHandler list_ko_classesCompleted; - - /// - public event binfoCompletedEventHandler binfoCompleted; - - /// - public event bgetCompletedEventHandler bgetCompleted; - - /// - public event bfindCompletedEventHandler bfindCompleted; - - /// - public event btitCompletedEventHandler btitCompleted; - - /// - public event bconvCompletedEventHandler bconvCompleted; - - /// - public event get_linkdb_by_entryCompletedEventHandler get_linkdb_by_entryCompleted; - - /// - public event get_best_neighbors_by_geneCompletedEventHandler get_best_neighbors_by_geneCompleted; - - /// - public event get_best_best_neighbors_by_geneCompletedEventHandler get_best_best_neighbors_by_geneCompleted; - - /// - public event get_reverse_best_neighbors_by_geneCompletedEventHandler get_reverse_best_neighbors_by_geneCompleted; - - /// - public event get_paralogs_by_geneCompletedEventHandler get_paralogs_by_geneCompleted; - - /// - public event get_motifs_by_geneCompletedEventHandler get_motifs_by_geneCompleted; - - /// - public event get_genes_by_motifsCompletedEventHandler get_genes_by_motifsCompleted; - - /// - public event get_ko_by_geneCompletedEventHandler get_ko_by_geneCompleted; - - /// - public event get_ko_by_ko_classCompletedEventHandler get_ko_by_ko_classCompleted; - - /// - public event get_genes_by_koCompletedEventHandler get_genes_by_koCompleted; - - /// - public event get_genes_by_ko_classCompletedEventHandler get_genes_by_ko_classCompleted; - - /// - public event get_elements_by_pathwayCompletedEventHandler get_elements_by_pathwayCompleted; - - /// - public event get_element_relations_by_pathwayCompletedEventHandler get_element_relations_by_pathwayCompleted; - - /// - public event color_pathway_by_elementsCompletedEventHandler color_pathway_by_elementsCompleted; - - /// - public event get_html_of_colored_pathway_by_elementsCompletedEventHandler get_html_of_colored_pathway_by_elementsCompleted; - - /// - public event mark_pathway_by_objectsCompletedEventHandler mark_pathway_by_objectsCompleted; - - /// - public event color_pathway_by_objectsCompletedEventHandler color_pathway_by_objectsCompleted; - - /// - public event get_html_of_marked_pathway_by_objectsCompletedEventHandler get_html_of_marked_pathway_by_objectsCompleted; - - /// - public event get_html_of_colored_pathway_by_objectsCompletedEventHandler get_html_of_colored_pathway_by_objectsCompleted; - - /// - public event get_genes_by_pathwayCompletedEventHandler get_genes_by_pathwayCompleted; - - /// - public event get_enzymes_by_pathwayCompletedEventHandler get_enzymes_by_pathwayCompleted; - - /// - public event get_reactions_by_pathwayCompletedEventHandler get_reactions_by_pathwayCompleted; - - /// - public event get_pathways_by_genesCompletedEventHandler get_pathways_by_genesCompleted; - - /// - public event get_pathways_by_enzymesCompletedEventHandler get_pathways_by_enzymesCompleted; - - /// - public event get_pathways_by_reactionsCompletedEventHandler get_pathways_by_reactionsCompleted; - - /// - public event get_linked_pathwaysCompletedEventHandler get_linked_pathwaysCompleted; - - /// - public event get_genes_by_enzymeCompletedEventHandler get_genes_by_enzymeCompleted; - - /// - public event get_enzymes_by_geneCompletedEventHandler get_enzymes_by_geneCompleted; - - /// - public event get_enzymes_by_reactionCompletedEventHandler get_enzymes_by_reactionCompleted; - - /// - public event get_reactions_by_enzymeCompletedEventHandler get_reactions_by_enzymeCompleted; - - /// - public event get_genes_by_organismCompletedEventHandler get_genes_by_organismCompleted; - - /// - public event get_number_of_genes_by_organismCompletedEventHandler get_number_of_genes_by_organismCompleted; - - /// - public event get_reactions_by_glycanCompletedEventHandler get_reactions_by_glycanCompleted; - - /// - public event get_reactions_by_compoundCompletedEventHandler get_reactions_by_compoundCompleted; - - /// - public event get_enzymes_by_glycanCompletedEventHandler get_enzymes_by_glycanCompleted; - - /// - public event get_enzymes_by_compoundCompletedEventHandler get_enzymes_by_compoundCompleted; - - /// - public event get_pathways_by_compoundsCompletedEventHandler get_pathways_by_compoundsCompleted; - - /// - public event get_pathways_by_glycansCompletedEventHandler get_pathways_by_glycansCompleted; - - /// - public event get_compounds_by_pathwayCompletedEventHandler get_compounds_by_pathwayCompleted; - - /// - public event get_glycans_by_pathwayCompletedEventHandler get_glycans_by_pathwayCompleted; - - /// - public event get_compounds_by_reactionCompletedEventHandler get_compounds_by_reactionCompleted; - - /// - public event get_glycans_by_reactionCompletedEventHandler get_glycans_by_reactionCompleted; - - /// - public event get_compounds_by_enzymeCompletedEventHandler get_compounds_by_enzymeCompleted; - - /// - public event get_glycans_by_enzymeCompletedEventHandler get_glycans_by_enzymeCompleted; - - /// - public event convert_mol_to_kcfCompletedEventHandler convert_mol_to_kcfCompleted; - - /// - public event get_kos_by_pathwayCompletedEventHandler get_kos_by_pathwayCompleted; - - /// - public event get_pathways_by_kosCompletedEventHandler get_pathways_by_kosCompleted; - - /// - public event search_compounds_by_nameCompletedEventHandler search_compounds_by_nameCompleted; - - /// - public event search_glycans_by_nameCompletedEventHandler search_glycans_by_nameCompleted; - - /// - public event search_compounds_by_compositionCompletedEventHandler search_compounds_by_compositionCompleted; - - /// - public event search_compounds_by_massCompletedEventHandler search_compounds_by_massCompleted; - - /// - public event search_glycans_by_massCompletedEventHandler search_glycans_by_massCompleted; - - /// - public event search_glycans_by_compositionCompletedEventHandler search_glycans_by_compositionCompleted; - - /// - public event search_compounds_by_subcompCompletedEventHandler search_compounds_by_subcompCompleted; - - /// - public event search_glycans_by_kcamCompletedEventHandler search_glycans_by_kcamCompleted; - - /// - public event get_linkdb_between_databasesCompletedEventHandler get_linkdb_between_databasesCompleted; - - /// - public event search_drugs_by_nameCompletedEventHandler search_drugs_by_nameCompleted; - - /// - public event search_drugs_by_compositionCompletedEventHandler search_drugs_by_compositionCompleted; - - /// - public event search_drugs_by_massCompletedEventHandler search_drugs_by_massCompleted; - - /// - public event search_drugs_by_subcompCompletedEventHandler search_drugs_by_subcompCompleted; - - /// - public event get_references_by_pathwayCompletedEventHandler get_references_by_pathwayCompleted; - - /// - public event get_drugs_by_pathwayCompletedEventHandler get_drugs_by_pathwayCompleted; - - /// - public event get_pathways_by_drugsCompletedEventHandler get_pathways_by_drugsCompleted; - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#list_databases", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] list_databases() { - object[] results = this.Invoke("list_databases", new object[0]); - return ((Definition[])(results[0])); - } - - /// - public void list_databasesAsync() { - this.list_databasesAsync(null); - } - - /// - public void list_databasesAsync(object userState) { - if ((this.list_databasesOperationCompleted == null)) { - this.list_databasesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onlist_databasesOperationCompleted); - } - this.InvokeAsync("list_databases", new object[0], this.list_databasesOperationCompleted, userState); - } - - private void Onlist_databasesOperationCompleted(object arg) { - if ((this.list_databasesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.list_databasesCompleted(this, new list_databasesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#list_organisms", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] list_organisms() { - object[] results = this.Invoke("list_organisms", new object[0]); - return ((Definition[])(results[0])); - } - - /// - public void list_organismsAsync() { - this.list_organismsAsync(null); - } - - /// - public void list_organismsAsync(object userState) { - if ((this.list_organismsOperationCompleted == null)) { - this.list_organismsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onlist_organismsOperationCompleted); - } - this.InvokeAsync("list_organisms", new object[0], this.list_organismsOperationCompleted, userState); - } - - private void Onlist_organismsOperationCompleted(object arg) { - if ((this.list_organismsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.list_organismsCompleted(this, new list_organismsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#list_pathways", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] list_pathways(string org) { - object[] results = this.Invoke("list_pathways", new object[] { - org}); - return ((Definition[])(results[0])); - } - - /// - public void list_pathwaysAsync(string org) { - this.list_pathwaysAsync(org, null); - } - - /// - public void list_pathwaysAsync(string org, object userState) { - if ((this.list_pathwaysOperationCompleted == null)) { - this.list_pathwaysOperationCompleted = new System.Threading.SendOrPostCallback(this.Onlist_pathwaysOperationCompleted); - } - this.InvokeAsync("list_pathways", new object[] { - org}, this.list_pathwaysOperationCompleted, userState); - } - - private void Onlist_pathwaysOperationCompleted(object arg) { - if ((this.list_pathwaysCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.list_pathwaysCompleted(this, new list_pathwaysCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#list_ko_classes", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] list_ko_classes(string class_id) { - object[] results = this.Invoke("list_ko_classes", new object[] { - class_id}); - return ((Definition[])(results[0])); - } - - /// - public void list_ko_classesAsync(string class_id) { - this.list_ko_classesAsync(class_id, null); - } - - /// - public void list_ko_classesAsync(string class_id, object userState) { - if ((this.list_ko_classesOperationCompleted == null)) { - this.list_ko_classesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onlist_ko_classesOperationCompleted); - } - this.InvokeAsync("list_ko_classes", new object[] { - class_id}, this.list_ko_classesOperationCompleted, userState); - } - - private void Onlist_ko_classesOperationCompleted(object arg) { - if ((this.list_ko_classesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.list_ko_classesCompleted(this, new list_ko_classesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#binfo", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string binfo(string db) { - object[] results = this.Invoke("binfo", new object[] { - db}); - return ((string)(results[0])); - } - - /// - public void binfoAsync(string db) { - this.binfoAsync(db, null); - } - - /// - public void binfoAsync(string db, object userState) { - if ((this.binfoOperationCompleted == null)) { - this.binfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnbinfoOperationCompleted); - } - this.InvokeAsync("binfo", new object[] { - db}, this.binfoOperationCompleted, userState); - } - - private void OnbinfoOperationCompleted(object arg) { - if ((this.binfoCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.binfoCompleted(this, new binfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#bget", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string bget(string @string) { - object[] results = this.Invoke("bget", new object[] { - @string}); - return ((string)(results[0])); - } - - /// - public void bgetAsync(string @string) { - this.bgetAsync(@string, null); - } - - /// - public void bgetAsync(string @string, object userState) { - if ((this.bgetOperationCompleted == null)) { - this.bgetOperationCompleted = new System.Threading.SendOrPostCallback(this.OnbgetOperationCompleted); - } - this.InvokeAsync("bget", new object[] { - @string}, this.bgetOperationCompleted, userState); - } - - private void OnbgetOperationCompleted(object arg) { - if ((this.bgetCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.bgetCompleted(this, new bgetCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#bfind", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string bfind(string @string) { - object[] results = this.Invoke("bfind", new object[] { - @string}); - return ((string)(results[0])); - } - - /// - public void bfindAsync(string @string) { - this.bfindAsync(@string, null); - } - - /// - public void bfindAsync(string @string, object userState) { - if ((this.bfindOperationCompleted == null)) { - this.bfindOperationCompleted = new System.Threading.SendOrPostCallback(this.OnbfindOperationCompleted); - } - this.InvokeAsync("bfind", new object[] { - @string}, this.bfindOperationCompleted, userState); - } - - private void OnbfindOperationCompleted(object arg) { - if ((this.bfindCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.bfindCompleted(this, new bfindCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#btit", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string btit(string @string) { - object[] results = this.Invoke("btit", new object[] { - @string}); - return ((string)(results[0])); - } - - /// - public void btitAsync(string @string) { - this.btitAsync(@string, null); - } - - /// - public void btitAsync(string @string, object userState) { - if ((this.btitOperationCompleted == null)) { - this.btitOperationCompleted = new System.Threading.SendOrPostCallback(this.OnbtitOperationCompleted); - } - this.InvokeAsync("btit", new object[] { - @string}, this.btitOperationCompleted, userState); - } - - private void OnbtitOperationCompleted(object arg) { - if ((this.btitCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.btitCompleted(this, new btitCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#bconv", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string bconv(string @string) { - object[] results = this.Invoke("bconv", new object[] { - @string}); - return ((string)(results[0])); - } - - /// - public void bconvAsync(string @string) { - this.bconvAsync(@string, null); - } - - /// - public void bconvAsync(string @string, object userState) { - if ((this.bconvOperationCompleted == null)) { - this.bconvOperationCompleted = new System.Threading.SendOrPostCallback(this.OnbconvOperationCompleted); - } - this.InvokeAsync("bconv", new object[] { - @string}, this.bconvOperationCompleted, userState); - } - - private void OnbconvOperationCompleted(object arg) { - if ((this.bconvCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.bconvCompleted(this, new bconvCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_linkdb_by_entry", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public LinkDBRelation[] get_linkdb_by_entry(string entry_id, string db, int offset, int limit) { - object[] results = this.Invoke("get_linkdb_by_entry", new object[] { - entry_id, - db, - offset, - limit}); - return ((LinkDBRelation[])(results[0])); - } - - /// - public void get_linkdb_by_entryAsync(string entry_id, string db, int offset, int limit) { - this.get_linkdb_by_entryAsync(entry_id, db, offset, limit, null); - } - - /// - public void get_linkdb_by_entryAsync(string entry_id, string db, int offset, int limit, object userState) { - if ((this.get_linkdb_by_entryOperationCompleted == null)) { - this.get_linkdb_by_entryOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_linkdb_by_entryOperationCompleted); - } - this.InvokeAsync("get_linkdb_by_entry", new object[] { - entry_id, - db, - offset, - limit}, this.get_linkdb_by_entryOperationCompleted, userState); - } - - private void Onget_linkdb_by_entryOperationCompleted(object arg) { - if ((this.get_linkdb_by_entryCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_linkdb_by_entryCompleted(this, new get_linkdb_by_entryCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_best_neighbors_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public SSDBRelation[] get_best_neighbors_by_gene(string genes_id, int offset, int limit) { - object[] results = this.Invoke("get_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}); - return ((SSDBRelation[])(results[0])); - } - - /// - public void get_best_neighbors_by_geneAsync(string genes_id, int offset, int limit) { - this.get_best_neighbors_by_geneAsync(genes_id, offset, limit, null); - } - - /// - public void get_best_neighbors_by_geneAsync(string genes_id, int offset, int limit, object userState) { - if ((this.get_best_neighbors_by_geneOperationCompleted == null)) { - this.get_best_neighbors_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_best_neighbors_by_geneOperationCompleted); - } - this.InvokeAsync("get_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}, this.get_best_neighbors_by_geneOperationCompleted, userState); - } - - private void Onget_best_neighbors_by_geneOperationCompleted(object arg) { - if ((this.get_best_neighbors_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_best_neighbors_by_geneCompleted(this, new get_best_neighbors_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_best_best_neighbors_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public SSDBRelation[] get_best_best_neighbors_by_gene(string genes_id, int offset, int limit) { - object[] results = this.Invoke("get_best_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}); - return ((SSDBRelation[])(results[0])); - } - - /// - public void get_best_best_neighbors_by_geneAsync(string genes_id, int offset, int limit) { - this.get_best_best_neighbors_by_geneAsync(genes_id, offset, limit, null); - } - - /// - public void get_best_best_neighbors_by_geneAsync(string genes_id, int offset, int limit, object userState) { - if ((this.get_best_best_neighbors_by_geneOperationCompleted == null)) { - this.get_best_best_neighbors_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_best_best_neighbors_by_geneOperationCompleted); - } - this.InvokeAsync("get_best_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}, this.get_best_best_neighbors_by_geneOperationCompleted, userState); - } - - private void Onget_best_best_neighbors_by_geneOperationCompleted(object arg) { - if ((this.get_best_best_neighbors_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_best_best_neighbors_by_geneCompleted(this, new get_best_best_neighbors_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_reverse_best_neighbors_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public SSDBRelation[] get_reverse_best_neighbors_by_gene(string genes_id, int offset, int limit) { - object[] results = this.Invoke("get_reverse_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}); - return ((SSDBRelation[])(results[0])); - } - - /// - public void get_reverse_best_neighbors_by_geneAsync(string genes_id, int offset, int limit) { - this.get_reverse_best_neighbors_by_geneAsync(genes_id, offset, limit, null); - } - - /// - public void get_reverse_best_neighbors_by_geneAsync(string genes_id, int offset, int limit, object userState) { - if ((this.get_reverse_best_neighbors_by_geneOperationCompleted == null)) { - this.get_reverse_best_neighbors_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_reverse_best_neighbors_by_geneOperationCompleted); - } - this.InvokeAsync("get_reverse_best_neighbors_by_gene", new object[] { - genes_id, - offset, - limit}, this.get_reverse_best_neighbors_by_geneOperationCompleted, userState); - } - - private void Onget_reverse_best_neighbors_by_geneOperationCompleted(object arg) { - if ((this.get_reverse_best_neighbors_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_reverse_best_neighbors_by_geneCompleted(this, new get_reverse_best_neighbors_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_paralogs_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public SSDBRelation[] get_paralogs_by_gene(string genes_id, int offset, int limit) { - object[] results = this.Invoke("get_paralogs_by_gene", new object[] { - genes_id, - offset, - limit}); - return ((SSDBRelation[])(results[0])); - } - - /// - public void get_paralogs_by_geneAsync(string genes_id, int offset, int limit) { - this.get_paralogs_by_geneAsync(genes_id, offset, limit, null); - } - - /// - public void get_paralogs_by_geneAsync(string genes_id, int offset, int limit, object userState) { - if ((this.get_paralogs_by_geneOperationCompleted == null)) { - this.get_paralogs_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_paralogs_by_geneOperationCompleted); - } - this.InvokeAsync("get_paralogs_by_gene", new object[] { - genes_id, - offset, - limit}, this.get_paralogs_by_geneOperationCompleted, userState); - } - - private void Onget_paralogs_by_geneOperationCompleted(object arg) { - if ((this.get_paralogs_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_paralogs_by_geneCompleted(this, new get_paralogs_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_motifs_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public MotifResult[] get_motifs_by_gene(string genes_id, string db) { - object[] results = this.Invoke("get_motifs_by_gene", new object[] { - genes_id, - db}); - return ((MotifResult[])(results[0])); - } - - /// - public void get_motifs_by_geneAsync(string genes_id, string db) { - this.get_motifs_by_geneAsync(genes_id, db, null); - } - - /// - public void get_motifs_by_geneAsync(string genes_id, string db, object userState) { - if ((this.get_motifs_by_geneOperationCompleted == null)) { - this.get_motifs_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_motifs_by_geneOperationCompleted); - } - this.InvokeAsync("get_motifs_by_gene", new object[] { - genes_id, - db}, this.get_motifs_by_geneOperationCompleted, userState); - } - - private void Onget_motifs_by_geneOperationCompleted(object arg) { - if ((this.get_motifs_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_motifs_by_geneCompleted(this, new get_motifs_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_motifs", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] get_genes_by_motifs(string[] motif_id_list, int offset, int limit) { - object[] results = this.Invoke("get_genes_by_motifs", new object[] { - motif_id_list, - offset, - limit}); - return ((Definition[])(results[0])); - } - - /// - public void get_genes_by_motifsAsync(string[] motif_id_list, int offset, int limit) { - this.get_genes_by_motifsAsync(motif_id_list, offset, limit, null); - } - - /// - public void get_genes_by_motifsAsync(string[] motif_id_list, int offset, int limit, object userState) { - if ((this.get_genes_by_motifsOperationCompleted == null)) { - this.get_genes_by_motifsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_motifsOperationCompleted); - } - this.InvokeAsync("get_genes_by_motifs", new object[] { - motif_id_list, - offset, - limit}, this.get_genes_by_motifsOperationCompleted, userState); - } - - private void Onget_genes_by_motifsOperationCompleted(object arg) { - if ((this.get_genes_by_motifsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_motifsCompleted(this, new get_genes_by_motifsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_ko_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_ko_by_gene(string genes_id) { - object[] results = this.Invoke("get_ko_by_gene", new object[] { - genes_id}); - return ((string[])(results[0])); - } - - /// - public void get_ko_by_geneAsync(string genes_id) { - this.get_ko_by_geneAsync(genes_id, null); - } - - /// - public void get_ko_by_geneAsync(string genes_id, object userState) { - if ((this.get_ko_by_geneOperationCompleted == null)) { - this.get_ko_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_ko_by_geneOperationCompleted); - } - this.InvokeAsync("get_ko_by_gene", new object[] { - genes_id}, this.get_ko_by_geneOperationCompleted, userState); - } - - private void Onget_ko_by_geneOperationCompleted(object arg) { - if ((this.get_ko_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_ko_by_geneCompleted(this, new get_ko_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_ko_by_ko_class", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] get_ko_by_ko_class(string class_id) { - object[] results = this.Invoke("get_ko_by_ko_class", new object[] { - class_id}); - return ((Definition[])(results[0])); - } - - /// - public void get_ko_by_ko_classAsync(string class_id) { - this.get_ko_by_ko_classAsync(class_id, null); - } - - /// - public void get_ko_by_ko_classAsync(string class_id, object userState) { - if ((this.get_ko_by_ko_classOperationCompleted == null)) { - this.get_ko_by_ko_classOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_ko_by_ko_classOperationCompleted); - } - this.InvokeAsync("get_ko_by_ko_class", new object[] { - class_id}, this.get_ko_by_ko_classOperationCompleted, userState); - } - - private void Onget_ko_by_ko_classOperationCompleted(object arg) { - if ((this.get_ko_by_ko_classCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_ko_by_ko_classCompleted(this, new get_ko_by_ko_classCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_ko", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] get_genes_by_ko(string ko_id, string org) { - object[] results = this.Invoke("get_genes_by_ko", new object[] { - ko_id, - org}); - return ((Definition[])(results[0])); - } - - /// - public void get_genes_by_koAsync(string ko_id, string org) { - this.get_genes_by_koAsync(ko_id, org, null); - } - - /// - public void get_genes_by_koAsync(string ko_id, string org, object userState) { - if ((this.get_genes_by_koOperationCompleted == null)) { - this.get_genes_by_koOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_koOperationCompleted); - } - this.InvokeAsync("get_genes_by_ko", new object[] { - ko_id, - org}, this.get_genes_by_koOperationCompleted, userState); - } - - private void Onget_genes_by_koOperationCompleted(object arg) { - if ((this.get_genes_by_koCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_koCompleted(this, new get_genes_by_koCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_ko_class", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public Definition[] get_genes_by_ko_class(string class_id, string org, int offset, int limit) { - object[] results = this.Invoke("get_genes_by_ko_class", new object[] { - class_id, - org, - offset, - limit}); - return ((Definition[])(results[0])); - } - - /// - public void get_genes_by_ko_classAsync(string class_id, string org, int offset, int limit) { - this.get_genes_by_ko_classAsync(class_id, org, offset, limit, null); - } - - /// - public void get_genes_by_ko_classAsync(string class_id, string org, int offset, int limit, object userState) { - if ((this.get_genes_by_ko_classOperationCompleted == null)) { - this.get_genes_by_ko_classOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_ko_classOperationCompleted); - } - this.InvokeAsync("get_genes_by_ko_class", new object[] { - class_id, - org, - offset, - limit}, this.get_genes_by_ko_classOperationCompleted, userState); - } - - private void Onget_genes_by_ko_classOperationCompleted(object arg) { - if ((this.get_genes_by_ko_classCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_ko_classCompleted(this, new get_genes_by_ko_classCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_elements_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public PathwayElement[] get_elements_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_elements_by_pathway", new object[] { - pathway_id}); - return ((PathwayElement[])(results[0])); - } - - /// - public void get_elements_by_pathwayAsync(string pathway_id) { - this.get_elements_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_elements_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_elements_by_pathwayOperationCompleted == null)) { - this.get_elements_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_elements_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_elements_by_pathway", new object[] { - pathway_id}, this.get_elements_by_pathwayOperationCompleted, userState); - } - - private void Onget_elements_by_pathwayOperationCompleted(object arg) { - if ((this.get_elements_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_elements_by_pathwayCompleted(this, new get_elements_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_element_relations_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public PathwayElementRelation[] get_element_relations_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_element_relations_by_pathway", new object[] { - pathway_id}); - return ((PathwayElementRelation[])(results[0])); - } - - /// - public void get_element_relations_by_pathwayAsync(string pathway_id) { - this.get_element_relations_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_element_relations_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_element_relations_by_pathwayOperationCompleted == null)) { - this.get_element_relations_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_element_relations_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_element_relations_by_pathway", new object[] { - pathway_id}, this.get_element_relations_by_pathwayOperationCompleted, userState); - } - - private void Onget_element_relations_by_pathwayOperationCompleted(object arg) { - if ((this.get_element_relations_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_element_relations_by_pathwayCompleted(this, new get_element_relations_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#color_pathway_by_elements", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string color_pathway_by_elements(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list) { - object[] results = this.Invoke("color_pathway_by_elements", new object[] { - pathway_id, - element_list, - fg_color_list, - bg_color_list}); - return ((string)(results[0])); - } - - /// - public void color_pathway_by_elementsAsync(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list) { - this.color_pathway_by_elementsAsync(pathway_id, element_list, fg_color_list, bg_color_list, null); - } - - /// - public void color_pathway_by_elementsAsync(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list, object userState) { - if ((this.color_pathway_by_elementsOperationCompleted == null)) { - this.color_pathway_by_elementsOperationCompleted = new System.Threading.SendOrPostCallback(this.Oncolor_pathway_by_elementsOperationCompleted); - } - this.InvokeAsync("color_pathway_by_elements", new object[] { - pathway_id, - element_list, - fg_color_list, - bg_color_list}, this.color_pathway_by_elementsOperationCompleted, userState); - } - - private void Oncolor_pathway_by_elementsOperationCompleted(object arg) { - if ((this.color_pathway_by_elementsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.color_pathway_by_elementsCompleted(this, new color_pathway_by_elementsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_html_of_colored_pathway_by_elements", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string get_html_of_colored_pathway_by_elements(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list) { - object[] results = this.Invoke("get_html_of_colored_pathway_by_elements", new object[] { - pathway_id, - element_list, - fg_color_list, - bg_color_list}); - return ((string)(results[0])); - } - - /// - public void get_html_of_colored_pathway_by_elementsAsync(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list) { - this.get_html_of_colored_pathway_by_elementsAsync(pathway_id, element_list, fg_color_list, bg_color_list, null); - } - - /// - public void get_html_of_colored_pathway_by_elementsAsync(string pathway_id, int[] element_list, string[] fg_color_list, string[] bg_color_list, object userState) { - if ((this.get_html_of_colored_pathway_by_elementsOperationCompleted == null)) { - this.get_html_of_colored_pathway_by_elementsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_html_of_colored_pathway_by_elementsOperationCompleted); - } - this.InvokeAsync("get_html_of_colored_pathway_by_elements", new object[] { - pathway_id, - element_list, - fg_color_list, - bg_color_list}, this.get_html_of_colored_pathway_by_elementsOperationCompleted, userState); - } - - private void Onget_html_of_colored_pathway_by_elementsOperationCompleted(object arg) { - if ((this.get_html_of_colored_pathway_by_elementsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_html_of_colored_pathway_by_elementsCompleted(this, new get_html_of_colored_pathway_by_elementsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#mark_pathway_by_objects", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string mark_pathway_by_objects(string pathway_id, string[] object_id_list) { - object[] results = this.Invoke("mark_pathway_by_objects", new object[] { - pathway_id, - object_id_list}); - return ((string)(results[0])); - } - - /// - public void mark_pathway_by_objectsAsync(string pathway_id, string[] object_id_list) { - this.mark_pathway_by_objectsAsync(pathway_id, object_id_list, null); - } - - /// - public void mark_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, object userState) { - if ((this.mark_pathway_by_objectsOperationCompleted == null)) { - this.mark_pathway_by_objectsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onmark_pathway_by_objectsOperationCompleted); - } - this.InvokeAsync("mark_pathway_by_objects", new object[] { - pathway_id, - object_id_list}, this.mark_pathway_by_objectsOperationCompleted, userState); - } - - private void Onmark_pathway_by_objectsOperationCompleted(object arg) { - if ((this.mark_pathway_by_objectsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.mark_pathway_by_objectsCompleted(this, new mark_pathway_by_objectsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#color_pathway_by_objects", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string color_pathway_by_objects(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list) { - object[] results = this.Invoke("color_pathway_by_objects", new object[] { - pathway_id, - object_id_list, - fg_color_list, - bg_color_list}); - return ((string)(results[0])); - } - - /// - public void color_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list) { - this.color_pathway_by_objectsAsync(pathway_id, object_id_list, fg_color_list, bg_color_list, null); - } - - /// - public void color_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list, object userState) { - if ((this.color_pathway_by_objectsOperationCompleted == null)) { - this.color_pathway_by_objectsOperationCompleted = new System.Threading.SendOrPostCallback(this.Oncolor_pathway_by_objectsOperationCompleted); - } - this.InvokeAsync("color_pathway_by_objects", new object[] { - pathway_id, - object_id_list, - fg_color_list, - bg_color_list}, this.color_pathway_by_objectsOperationCompleted, userState); - } - - private void Oncolor_pathway_by_objectsOperationCompleted(object arg) { - if ((this.color_pathway_by_objectsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.color_pathway_by_objectsCompleted(this, new color_pathway_by_objectsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_html_of_marked_pathway_by_objects", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string get_html_of_marked_pathway_by_objects(string pathway_id, string[] object_id_list) { - object[] results = this.Invoke("get_html_of_marked_pathway_by_objects", new object[] { - pathway_id, - object_id_list}); - return ((string)(results[0])); - } - - /// - public void get_html_of_marked_pathway_by_objectsAsync(string pathway_id, string[] object_id_list) { - this.get_html_of_marked_pathway_by_objectsAsync(pathway_id, object_id_list, null); - } - - /// - public void get_html_of_marked_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, object userState) { - if ((this.get_html_of_marked_pathway_by_objectsOperationCompleted == null)) { - this.get_html_of_marked_pathway_by_objectsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_html_of_marked_pathway_by_objectsOperationCompleted); - } - this.InvokeAsync("get_html_of_marked_pathway_by_objects", new object[] { - pathway_id, - object_id_list}, this.get_html_of_marked_pathway_by_objectsOperationCompleted, userState); - } - - private void Onget_html_of_marked_pathway_by_objectsOperationCompleted(object arg) { - if ((this.get_html_of_marked_pathway_by_objectsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_html_of_marked_pathway_by_objectsCompleted(this, new get_html_of_marked_pathway_by_objectsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_html_of_colored_pathway_by_objects", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string get_html_of_colored_pathway_by_objects(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list) { - object[] results = this.Invoke("get_html_of_colored_pathway_by_objects", new object[] { - pathway_id, - object_id_list, - fg_color_list, - bg_color_list}); - return ((string)(results[0])); - } - - /// - public void get_html_of_colored_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list) { - this.get_html_of_colored_pathway_by_objectsAsync(pathway_id, object_id_list, fg_color_list, bg_color_list, null); - } - - /// - public void get_html_of_colored_pathway_by_objectsAsync(string pathway_id, string[] object_id_list, string[] fg_color_list, string[] bg_color_list, object userState) { - if ((this.get_html_of_colored_pathway_by_objectsOperationCompleted == null)) { - this.get_html_of_colored_pathway_by_objectsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_html_of_colored_pathway_by_objectsOperationCompleted); - } - this.InvokeAsync("get_html_of_colored_pathway_by_objects", new object[] { - pathway_id, - object_id_list, - fg_color_list, - bg_color_list}, this.get_html_of_colored_pathway_by_objectsOperationCompleted, userState); - } - - private void Onget_html_of_colored_pathway_by_objectsOperationCompleted(object arg) { - if ((this.get_html_of_colored_pathway_by_objectsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_html_of_colored_pathway_by_objectsCompleted(this, new get_html_of_colored_pathway_by_objectsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_genes_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_genes_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_genes_by_pathwayAsync(string pathway_id) { - this.get_genes_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_genes_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_genes_by_pathwayOperationCompleted == null)) { - this.get_genes_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_genes_by_pathway", new object[] { - pathway_id}, this.get_genes_by_pathwayOperationCompleted, userState); - } - - private void Onget_genes_by_pathwayOperationCompleted(object arg) { - if ((this.get_genes_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_pathwayCompleted(this, new get_genes_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_enzymes_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_enzymes_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_enzymes_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_enzymes_by_pathwayAsync(string pathway_id) { - this.get_enzymes_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_enzymes_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_enzymes_by_pathwayOperationCompleted == null)) { - this.get_enzymes_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_enzymes_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_enzymes_by_pathway", new object[] { - pathway_id}, this.get_enzymes_by_pathwayOperationCompleted, userState); - } - - private void Onget_enzymes_by_pathwayOperationCompleted(object arg) { - if ((this.get_enzymes_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_enzymes_by_pathwayCompleted(this, new get_enzymes_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_reactions_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_reactions_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_reactions_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_reactions_by_pathwayAsync(string pathway_id) { - this.get_reactions_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_reactions_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_reactions_by_pathwayOperationCompleted == null)) { - this.get_reactions_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_reactions_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_reactions_by_pathway", new object[] { - pathway_id}, this.get_reactions_by_pathwayOperationCompleted, userState); - } - - private void Onget_reactions_by_pathwayOperationCompleted(object arg) { - if ((this.get_reactions_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_reactions_by_pathwayCompleted(this, new get_reactions_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_genes", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_genes(string[] genes_id_list) { - object[] results = this.Invoke("get_pathways_by_genes", new object[] { - genes_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_genesAsync(string[] genes_id_list) { - this.get_pathways_by_genesAsync(genes_id_list, null); - } - - /// - public void get_pathways_by_genesAsync(string[] genes_id_list, object userState) { - if ((this.get_pathways_by_genesOperationCompleted == null)) { - this.get_pathways_by_genesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_genesOperationCompleted); - } - this.InvokeAsync("get_pathways_by_genes", new object[] { - genes_id_list}, this.get_pathways_by_genesOperationCompleted, userState); - } - - private void Onget_pathways_by_genesOperationCompleted(object arg) { - if ((this.get_pathways_by_genesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_genesCompleted(this, new get_pathways_by_genesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_enzymes", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_enzymes(string[] enzyme_id_list) { - object[] results = this.Invoke("get_pathways_by_enzymes", new object[] { - enzyme_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_enzymesAsync(string[] enzyme_id_list) { - this.get_pathways_by_enzymesAsync(enzyme_id_list, null); - } - - /// - public void get_pathways_by_enzymesAsync(string[] enzyme_id_list, object userState) { - if ((this.get_pathways_by_enzymesOperationCompleted == null)) { - this.get_pathways_by_enzymesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_enzymesOperationCompleted); - } - this.InvokeAsync("get_pathways_by_enzymes", new object[] { - enzyme_id_list}, this.get_pathways_by_enzymesOperationCompleted, userState); - } - - private void Onget_pathways_by_enzymesOperationCompleted(object arg) { - if ((this.get_pathways_by_enzymesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_enzymesCompleted(this, new get_pathways_by_enzymesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_reactions", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_reactions(string[] reaction_id_list) { - object[] results = this.Invoke("get_pathways_by_reactions", new object[] { - reaction_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_reactionsAsync(string[] reaction_id_list) { - this.get_pathways_by_reactionsAsync(reaction_id_list, null); - } - - /// - public void get_pathways_by_reactionsAsync(string[] reaction_id_list, object userState) { - if ((this.get_pathways_by_reactionsOperationCompleted == null)) { - this.get_pathways_by_reactionsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_reactionsOperationCompleted); - } - this.InvokeAsync("get_pathways_by_reactions", new object[] { - reaction_id_list}, this.get_pathways_by_reactionsOperationCompleted, userState); - } - - private void Onget_pathways_by_reactionsOperationCompleted(object arg) { - if ((this.get_pathways_by_reactionsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_reactionsCompleted(this, new get_pathways_by_reactionsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_linked_pathways", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_linked_pathways(string pathway_id) { - object[] results = this.Invoke("get_linked_pathways", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_linked_pathwaysAsync(string pathway_id) { - this.get_linked_pathwaysAsync(pathway_id, null); - } - - /// - public void get_linked_pathwaysAsync(string pathway_id, object userState) { - if ((this.get_linked_pathwaysOperationCompleted == null)) { - this.get_linked_pathwaysOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_linked_pathwaysOperationCompleted); - } - this.InvokeAsync("get_linked_pathways", new object[] { - pathway_id}, this.get_linked_pathwaysOperationCompleted, userState); - } - - private void Onget_linked_pathwaysOperationCompleted(object arg) { - if ((this.get_linked_pathwaysCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_linked_pathwaysCompleted(this, new get_linked_pathwaysCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_enzyme", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_genes_by_enzyme(string enzyme_id, string org) { - object[] results = this.Invoke("get_genes_by_enzyme", new object[] { - enzyme_id, - org}); - return ((string[])(results[0])); - } - - /// - public void get_genes_by_enzymeAsync(string enzyme_id, string org) { - this.get_genes_by_enzymeAsync(enzyme_id, org, null); - } - - /// - public void get_genes_by_enzymeAsync(string enzyme_id, string org, object userState) { - if ((this.get_genes_by_enzymeOperationCompleted == null)) { - this.get_genes_by_enzymeOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_enzymeOperationCompleted); - } - this.InvokeAsync("get_genes_by_enzyme", new object[] { - enzyme_id, - org}, this.get_genes_by_enzymeOperationCompleted, userState); - } - - private void Onget_genes_by_enzymeOperationCompleted(object arg) { - if ((this.get_genes_by_enzymeCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_enzymeCompleted(this, new get_genes_by_enzymeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_enzymes_by_gene", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_enzymes_by_gene(string genes_id) { - object[] results = this.Invoke("get_enzymes_by_gene", new object[] { - genes_id}); - return ((string[])(results[0])); - } - - /// - public void get_enzymes_by_geneAsync(string genes_id) { - this.get_enzymes_by_geneAsync(genes_id, null); - } - - /// - public void get_enzymes_by_geneAsync(string genes_id, object userState) { - if ((this.get_enzymes_by_geneOperationCompleted == null)) { - this.get_enzymes_by_geneOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_enzymes_by_geneOperationCompleted); - } - this.InvokeAsync("get_enzymes_by_gene", new object[] { - genes_id}, this.get_enzymes_by_geneOperationCompleted, userState); - } - - private void Onget_enzymes_by_geneOperationCompleted(object arg) { - if ((this.get_enzymes_by_geneCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_enzymes_by_geneCompleted(this, new get_enzymes_by_geneCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_enzymes_by_reaction", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_enzymes_by_reaction(string reaction_id) { - object[] results = this.Invoke("get_enzymes_by_reaction", new object[] { - reaction_id}); - return ((string[])(results[0])); - } - - /// - public void get_enzymes_by_reactionAsync(string reaction_id) { - this.get_enzymes_by_reactionAsync(reaction_id, null); - } - - /// - public void get_enzymes_by_reactionAsync(string reaction_id, object userState) { - if ((this.get_enzymes_by_reactionOperationCompleted == null)) { - this.get_enzymes_by_reactionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_enzymes_by_reactionOperationCompleted); - } - this.InvokeAsync("get_enzymes_by_reaction", new object[] { - reaction_id}, this.get_enzymes_by_reactionOperationCompleted, userState); - } - - private void Onget_enzymes_by_reactionOperationCompleted(object arg) { - if ((this.get_enzymes_by_reactionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_enzymes_by_reactionCompleted(this, new get_enzymes_by_reactionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_reactions_by_enzyme", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_reactions_by_enzyme(string enzyme_id) { - object[] results = this.Invoke("get_reactions_by_enzyme", new object[] { - enzyme_id}); - return ((string[])(results[0])); - } - - /// - public void get_reactions_by_enzymeAsync(string enzyme_id) { - this.get_reactions_by_enzymeAsync(enzyme_id, null); - } - - /// - public void get_reactions_by_enzymeAsync(string enzyme_id, object userState) { - if ((this.get_reactions_by_enzymeOperationCompleted == null)) { - this.get_reactions_by_enzymeOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_reactions_by_enzymeOperationCompleted); - } - this.InvokeAsync("get_reactions_by_enzyme", new object[] { - enzyme_id}, this.get_reactions_by_enzymeOperationCompleted, userState); - } - - private void Onget_reactions_by_enzymeOperationCompleted(object arg) { - if ((this.get_reactions_by_enzymeCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_reactions_by_enzymeCompleted(this, new get_reactions_by_enzymeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_genes_by_organism", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_genes_by_organism(string org, int offset, int limit) { - object[] results = this.Invoke("get_genes_by_organism", new object[] { - org, - offset, - limit}); - return ((string[])(results[0])); - } - - /// - public void get_genes_by_organismAsync(string org, int offset, int limit) { - this.get_genes_by_organismAsync(org, offset, limit, null); - } - - /// - public void get_genes_by_organismAsync(string org, int offset, int limit, object userState) { - if ((this.get_genes_by_organismOperationCompleted == null)) { - this.get_genes_by_organismOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_genes_by_organismOperationCompleted); - } - this.InvokeAsync("get_genes_by_organism", new object[] { - org, - offset, - limit}, this.get_genes_by_organismOperationCompleted, userState); - } - - private void Onget_genes_by_organismOperationCompleted(object arg) { - if ((this.get_genes_by_organismCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_genes_by_organismCompleted(this, new get_genes_by_organismCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_number_of_genes_by_organism", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public int get_number_of_genes_by_organism(string abbr) { - object[] results = this.Invoke("get_number_of_genes_by_organism", new object[] { - abbr}); - return ((int)(results[0])); - } - - /// - public void get_number_of_genes_by_organismAsync(string abbr) { - this.get_number_of_genes_by_organismAsync(abbr, null); - } - - /// - public void get_number_of_genes_by_organismAsync(string abbr, object userState) { - if ((this.get_number_of_genes_by_organismOperationCompleted == null)) { - this.get_number_of_genes_by_organismOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_number_of_genes_by_organismOperationCompleted); - } - this.InvokeAsync("get_number_of_genes_by_organism", new object[] { - abbr}, this.get_number_of_genes_by_organismOperationCompleted, userState); - } - - private void Onget_number_of_genes_by_organismOperationCompleted(object arg) { - if ((this.get_number_of_genes_by_organismCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_number_of_genes_by_organismCompleted(this, new get_number_of_genes_by_organismCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_reactions_by_glycan", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_reactions_by_glycan(string glycan_id) { - object[] results = this.Invoke("get_reactions_by_glycan", new object[] { - glycan_id}); - return ((string[])(results[0])); - } - - /// - public void get_reactions_by_glycanAsync(string glycan_id) { - this.get_reactions_by_glycanAsync(glycan_id, null); - } - - /// - public void get_reactions_by_glycanAsync(string glycan_id, object userState) { - if ((this.get_reactions_by_glycanOperationCompleted == null)) { - this.get_reactions_by_glycanOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_reactions_by_glycanOperationCompleted); - } - this.InvokeAsync("get_reactions_by_glycan", new object[] { - glycan_id}, this.get_reactions_by_glycanOperationCompleted, userState); - } - - private void Onget_reactions_by_glycanOperationCompleted(object arg) { - if ((this.get_reactions_by_glycanCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_reactions_by_glycanCompleted(this, new get_reactions_by_glycanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_reactions_by_compound", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_reactions_by_compound(string compound_id) { - object[] results = this.Invoke("get_reactions_by_compound", new object[] { - compound_id}); - return ((string[])(results[0])); - } - - /// - public void get_reactions_by_compoundAsync(string compound_id) { - this.get_reactions_by_compoundAsync(compound_id, null); - } - - /// - public void get_reactions_by_compoundAsync(string compound_id, object userState) { - if ((this.get_reactions_by_compoundOperationCompleted == null)) { - this.get_reactions_by_compoundOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_reactions_by_compoundOperationCompleted); - } - this.InvokeAsync("get_reactions_by_compound", new object[] { - compound_id}, this.get_reactions_by_compoundOperationCompleted, userState); - } - - private void Onget_reactions_by_compoundOperationCompleted(object arg) { - if ((this.get_reactions_by_compoundCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_reactions_by_compoundCompleted(this, new get_reactions_by_compoundCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_enzymes_by_glycan", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_enzymes_by_glycan(string glycan_id) { - object[] results = this.Invoke("get_enzymes_by_glycan", new object[] { - glycan_id}); - return ((string[])(results[0])); - } - - /// - public void get_enzymes_by_glycanAsync(string glycan_id) { - this.get_enzymes_by_glycanAsync(glycan_id, null); - } - - /// - public void get_enzymes_by_glycanAsync(string glycan_id, object userState) { - if ((this.get_enzymes_by_glycanOperationCompleted == null)) { - this.get_enzymes_by_glycanOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_enzymes_by_glycanOperationCompleted); - } - this.InvokeAsync("get_enzymes_by_glycan", new object[] { - glycan_id}, this.get_enzymes_by_glycanOperationCompleted, userState); - } - - private void Onget_enzymes_by_glycanOperationCompleted(object arg) { - if ((this.get_enzymes_by_glycanCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_enzymes_by_glycanCompleted(this, new get_enzymes_by_glycanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_enzymes_by_compound", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_enzymes_by_compound(string compound_id) { - object[] results = this.Invoke("get_enzymes_by_compound", new object[] { - compound_id}); - return ((string[])(results[0])); - } - - /// - public void get_enzymes_by_compoundAsync(string compound_id) { - this.get_enzymes_by_compoundAsync(compound_id, null); - } - - /// - public void get_enzymes_by_compoundAsync(string compound_id, object userState) { - if ((this.get_enzymes_by_compoundOperationCompleted == null)) { - this.get_enzymes_by_compoundOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_enzymes_by_compoundOperationCompleted); - } - this.InvokeAsync("get_enzymes_by_compound", new object[] { - compound_id}, this.get_enzymes_by_compoundOperationCompleted, userState); - } - - private void Onget_enzymes_by_compoundOperationCompleted(object arg) { - if ((this.get_enzymes_by_compoundCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_enzymes_by_compoundCompleted(this, new get_enzymes_by_compoundCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_compounds", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_compounds(string[] compound_id_list) { - object[] results = this.Invoke("get_pathways_by_compounds", new object[] { - compound_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_compoundsAsync(string[] compound_id_list) { - this.get_pathways_by_compoundsAsync(compound_id_list, null); - } - - /// - public void get_pathways_by_compoundsAsync(string[] compound_id_list, object userState) { - if ((this.get_pathways_by_compoundsOperationCompleted == null)) { - this.get_pathways_by_compoundsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_compoundsOperationCompleted); - } - this.InvokeAsync("get_pathways_by_compounds", new object[] { - compound_id_list}, this.get_pathways_by_compoundsOperationCompleted, userState); - } - - private void Onget_pathways_by_compoundsOperationCompleted(object arg) { - if ((this.get_pathways_by_compoundsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_compoundsCompleted(this, new get_pathways_by_compoundsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_glycans", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_glycans(string[] glycan_id_list) { - object[] results = this.Invoke("get_pathways_by_glycans", new object[] { - glycan_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_glycansAsync(string[] glycan_id_list) { - this.get_pathways_by_glycansAsync(glycan_id_list, null); - } - - /// - public void get_pathways_by_glycansAsync(string[] glycan_id_list, object userState) { - if ((this.get_pathways_by_glycansOperationCompleted == null)) { - this.get_pathways_by_glycansOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_glycansOperationCompleted); - } - this.InvokeAsync("get_pathways_by_glycans", new object[] { - glycan_id_list}, this.get_pathways_by_glycansOperationCompleted, userState); - } - - private void Onget_pathways_by_glycansOperationCompleted(object arg) { - if ((this.get_pathways_by_glycansCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_glycansCompleted(this, new get_pathways_by_glycansCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_compounds_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_compounds_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_compounds_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_compounds_by_pathwayAsync(string pathway_id) { - this.get_compounds_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_compounds_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_compounds_by_pathwayOperationCompleted == null)) { - this.get_compounds_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_compounds_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_compounds_by_pathway", new object[] { - pathway_id}, this.get_compounds_by_pathwayOperationCompleted, userState); - } - - private void Onget_compounds_by_pathwayOperationCompleted(object arg) { - if ((this.get_compounds_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_compounds_by_pathwayCompleted(this, new get_compounds_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_glycans_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_glycans_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_glycans_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_glycans_by_pathwayAsync(string pathway_id) { - this.get_glycans_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_glycans_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_glycans_by_pathwayOperationCompleted == null)) { - this.get_glycans_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_glycans_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_glycans_by_pathway", new object[] { - pathway_id}, this.get_glycans_by_pathwayOperationCompleted, userState); - } - - private void Onget_glycans_by_pathwayOperationCompleted(object arg) { - if ((this.get_glycans_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_glycans_by_pathwayCompleted(this, new get_glycans_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_compounds_by_reaction", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_compounds_by_reaction(string reaction_id) { - object[] results = this.Invoke("get_compounds_by_reaction", new object[] { - reaction_id}); - return ((string[])(results[0])); - } - - /// - public void get_compounds_by_reactionAsync(string reaction_id) { - this.get_compounds_by_reactionAsync(reaction_id, null); - } - - /// - public void get_compounds_by_reactionAsync(string reaction_id, object userState) { - if ((this.get_compounds_by_reactionOperationCompleted == null)) { - this.get_compounds_by_reactionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_compounds_by_reactionOperationCompleted); - } - this.InvokeAsync("get_compounds_by_reaction", new object[] { - reaction_id}, this.get_compounds_by_reactionOperationCompleted, userState); - } - - private void Onget_compounds_by_reactionOperationCompleted(object arg) { - if ((this.get_compounds_by_reactionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_compounds_by_reactionCompleted(this, new get_compounds_by_reactionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_glycans_by_reaction", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_glycans_by_reaction(string reaction_id) { - object[] results = this.Invoke("get_glycans_by_reaction", new object[] { - reaction_id}); - return ((string[])(results[0])); - } - - /// - public void get_glycans_by_reactionAsync(string reaction_id) { - this.get_glycans_by_reactionAsync(reaction_id, null); - } - - /// - public void get_glycans_by_reactionAsync(string reaction_id, object userState) { - if ((this.get_glycans_by_reactionOperationCompleted == null)) { - this.get_glycans_by_reactionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_glycans_by_reactionOperationCompleted); - } - this.InvokeAsync("get_glycans_by_reaction", new object[] { - reaction_id}, this.get_glycans_by_reactionOperationCompleted, userState); - } - - private void Onget_glycans_by_reactionOperationCompleted(object arg) { - if ((this.get_glycans_by_reactionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_glycans_by_reactionCompleted(this, new get_glycans_by_reactionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_compounds_by_enzyme", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_compounds_by_enzyme(string enzyme_id) { - object[] results = this.Invoke("get_compounds_by_enzyme", new object[] { - enzyme_id}); - return ((string[])(results[0])); - } - - /// - public void get_compounds_by_enzymeAsync(string enzyme_id) { - this.get_compounds_by_enzymeAsync(enzyme_id, null); - } - - /// - public void get_compounds_by_enzymeAsync(string enzyme_id, object userState) { - if ((this.get_compounds_by_enzymeOperationCompleted == null)) { - this.get_compounds_by_enzymeOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_compounds_by_enzymeOperationCompleted); - } - this.InvokeAsync("get_compounds_by_enzyme", new object[] { - enzyme_id}, this.get_compounds_by_enzymeOperationCompleted, userState); - } - - private void Onget_compounds_by_enzymeOperationCompleted(object arg) { - if ((this.get_compounds_by_enzymeCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_compounds_by_enzymeCompleted(this, new get_compounds_by_enzymeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_glycans_by_enzyme", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_glycans_by_enzyme(string enzyme_id) { - object[] results = this.Invoke("get_glycans_by_enzyme", new object[] { - enzyme_id}); - return ((string[])(results[0])); - } - - /// - public void get_glycans_by_enzymeAsync(string enzyme_id) { - this.get_glycans_by_enzymeAsync(enzyme_id, null); - } - - /// - public void get_glycans_by_enzymeAsync(string enzyme_id, object userState) { - if ((this.get_glycans_by_enzymeOperationCompleted == null)) { - this.get_glycans_by_enzymeOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_glycans_by_enzymeOperationCompleted); - } - this.InvokeAsync("get_glycans_by_enzyme", new object[] { - enzyme_id}, this.get_glycans_by_enzymeOperationCompleted, userState); - } - - private void Onget_glycans_by_enzymeOperationCompleted(object arg) { - if ((this.get_glycans_by_enzymeCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_glycans_by_enzymeCompleted(this, new get_glycans_by_enzymeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#convert_mol_to_kcf", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string convert_mol_to_kcf(string mol_text) { - object[] results = this.Invoke("convert_mol_to_kcf", new object[] { - mol_text}); - return ((string)(results[0])); - } - - /// - public void convert_mol_to_kcfAsync(string mol_text) { - this.convert_mol_to_kcfAsync(mol_text, null); - } - - /// - public void convert_mol_to_kcfAsync(string mol_text, object userState) { - if ((this.convert_mol_to_kcfOperationCompleted == null)) { - this.convert_mol_to_kcfOperationCompleted = new System.Threading.SendOrPostCallback(this.Onconvert_mol_to_kcfOperationCompleted); - } - this.InvokeAsync("convert_mol_to_kcf", new object[] { - mol_text}, this.convert_mol_to_kcfOperationCompleted, userState); - } - - private void Onconvert_mol_to_kcfOperationCompleted(object arg) { - if ((this.convert_mol_to_kcfCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.convert_mol_to_kcfCompleted(this, new convert_mol_to_kcfCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_kos_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_kos_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_kos_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_kos_by_pathwayAsync(string pathway_id) { - this.get_kos_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_kos_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_kos_by_pathwayOperationCompleted == null)) { - this.get_kos_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_kos_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_kos_by_pathway", new object[] { - pathway_id}, this.get_kos_by_pathwayOperationCompleted, userState); - } - - private void Onget_kos_by_pathwayOperationCompleted(object arg) { - if ((this.get_kos_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_kos_by_pathwayCompleted(this, new get_kos_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_kos", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_kos(string[] ko_id_list, string org) { - object[] results = this.Invoke("get_pathways_by_kos", new object[] { - ko_id_list, - org}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_kosAsync(string[] ko_id_list, string org) { - this.get_pathways_by_kosAsync(ko_id_list, org, null); - } - - /// - public void get_pathways_by_kosAsync(string[] ko_id_list, string org, object userState) { - if ((this.get_pathways_by_kosOperationCompleted == null)) { - this.get_pathways_by_kosOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_kosOperationCompleted); - } - this.InvokeAsync("get_pathways_by_kos", new object[] { - ko_id_list, - org}, this.get_pathways_by_kosOperationCompleted, userState); - } - - private void Onget_pathways_by_kosOperationCompleted(object arg) { - if ((this.get_pathways_by_kosCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_kosCompleted(this, new get_pathways_by_kosCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_compounds_by_name", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_compounds_by_name(string name) { - object[] results = this.Invoke("search_compounds_by_name", new object[] { - name}); - return ((string[])(results[0])); - } - - /// - public void search_compounds_by_nameAsync(string name) { - this.search_compounds_by_nameAsync(name, null); - } - - /// - public void search_compounds_by_nameAsync(string name, object userState) { - if ((this.search_compounds_by_nameOperationCompleted == null)) { - this.search_compounds_by_nameOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_compounds_by_nameOperationCompleted); - } - this.InvokeAsync("search_compounds_by_name", new object[] { - name}, this.search_compounds_by_nameOperationCompleted, userState); - } - - private void Onsearch_compounds_by_nameOperationCompleted(object arg) { - if ((this.search_compounds_by_nameCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_compounds_by_nameCompleted(this, new search_compounds_by_nameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_glycans_by_name", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_glycans_by_name(string name) { - object[] results = this.Invoke("search_glycans_by_name", new object[] { - name}); - return ((string[])(results[0])); - } - - /// - public void search_glycans_by_nameAsync(string name) { - this.search_glycans_by_nameAsync(name, null); - } - - /// - public void search_glycans_by_nameAsync(string name, object userState) { - if ((this.search_glycans_by_nameOperationCompleted == null)) { - this.search_glycans_by_nameOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_glycans_by_nameOperationCompleted); - } - this.InvokeAsync("search_glycans_by_name", new object[] { - name}, this.search_glycans_by_nameOperationCompleted, userState); - } - - private void Onsearch_glycans_by_nameOperationCompleted(object arg) { - if ((this.search_glycans_by_nameCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_glycans_by_nameCompleted(this, new search_glycans_by_nameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_compounds_by_composition", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_compounds_by_composition(string composition) { - object[] results = this.Invoke("search_compounds_by_composition", new object[] { - composition}); - return ((string[])(results[0])); - } - - /// - public void search_compounds_by_compositionAsync(string composition) { - this.search_compounds_by_compositionAsync(composition, null); - } - - /// - public void search_compounds_by_compositionAsync(string composition, object userState) { - if ((this.search_compounds_by_compositionOperationCompleted == null)) { - this.search_compounds_by_compositionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_compounds_by_compositionOperationCompleted); - } - this.InvokeAsync("search_compounds_by_composition", new object[] { - composition}, this.search_compounds_by_compositionOperationCompleted, userState); - } - - private void Onsearch_compounds_by_compositionOperationCompleted(object arg) { - if ((this.search_compounds_by_compositionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_compounds_by_compositionCompleted(this, new search_compounds_by_compositionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_compounds_by_mass", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_compounds_by_mass(float mass, float range) { - object[] results = this.Invoke("search_compounds_by_mass", new object[] { - mass, - range}); - return ((string[])(results[0])); - } - - /// - public void search_compounds_by_massAsync(float mass, float range) { - this.search_compounds_by_massAsync(mass, range, null); - } - - /// - public void search_compounds_by_massAsync(float mass, float range, object userState) { - if ((this.search_compounds_by_massOperationCompleted == null)) { - this.search_compounds_by_massOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_compounds_by_massOperationCompleted); - } - this.InvokeAsync("search_compounds_by_mass", new object[] { - mass, - range}, this.search_compounds_by_massOperationCompleted, userState); - } - - private void Onsearch_compounds_by_massOperationCompleted(object arg) { - if ((this.search_compounds_by_massCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_compounds_by_massCompleted(this, new search_compounds_by_massCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_glycans_by_mass", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_glycans_by_mass(float mass, float range) { - object[] results = this.Invoke("search_glycans_by_mass", new object[] { - mass, - range}); - return ((string[])(results[0])); - } - - /// - public void search_glycans_by_massAsync(float mass, float range) { - this.search_glycans_by_massAsync(mass, range, null); - } - - /// - public void search_glycans_by_massAsync(float mass, float range, object userState) { - if ((this.search_glycans_by_massOperationCompleted == null)) { - this.search_glycans_by_massOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_glycans_by_massOperationCompleted); - } - this.InvokeAsync("search_glycans_by_mass", new object[] { - mass, - range}, this.search_glycans_by_massOperationCompleted, userState); - } - - private void Onsearch_glycans_by_massOperationCompleted(object arg) { - if ((this.search_glycans_by_massCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_glycans_by_massCompleted(this, new search_glycans_by_massCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_glycans_by_composition", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_glycans_by_composition(string composition) { - object[] results = this.Invoke("search_glycans_by_composition", new object[] { - composition}); - return ((string[])(results[0])); - } - - /// - public void search_glycans_by_compositionAsync(string composition) { - this.search_glycans_by_compositionAsync(composition, null); - } - - /// - public void search_glycans_by_compositionAsync(string composition, object userState) { - if ((this.search_glycans_by_compositionOperationCompleted == null)) { - this.search_glycans_by_compositionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_glycans_by_compositionOperationCompleted); - } - this.InvokeAsync("search_glycans_by_composition", new object[] { - composition}, this.search_glycans_by_compositionOperationCompleted, userState); - } - - private void Onsearch_glycans_by_compositionOperationCompleted(object arg) { - if ((this.search_glycans_by_compositionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_glycans_by_compositionCompleted(this, new search_glycans_by_compositionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_compounds_by_subcomp", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public StructureAlignment[] search_compounds_by_subcomp(string mol, int offset, int limit) { - object[] results = this.Invoke("search_compounds_by_subcomp", new object[] { - mol, - offset, - limit}); - return ((StructureAlignment[])(results[0])); - } - - /// - public void search_compounds_by_subcompAsync(string mol, int offset, int limit) { - this.search_compounds_by_subcompAsync(mol, offset, limit, null); - } - - /// - public void search_compounds_by_subcompAsync(string mol, int offset, int limit, object userState) { - if ((this.search_compounds_by_subcompOperationCompleted == null)) { - this.search_compounds_by_subcompOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_compounds_by_subcompOperationCompleted); - } - this.InvokeAsync("search_compounds_by_subcomp", new object[] { - mol, - offset, - limit}, this.search_compounds_by_subcompOperationCompleted, userState); - } - - private void Onsearch_compounds_by_subcompOperationCompleted(object arg) { - if ((this.search_compounds_by_subcompCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_compounds_by_subcompCompleted(this, new search_compounds_by_subcompCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_glycans_by_kcam", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public StructureAlignment[] search_glycans_by_kcam(string kcf, string program, string option, int offset, int limit) { - object[] results = this.Invoke("search_glycans_by_kcam", new object[] { - kcf, - program, - option, - offset, - limit}); - return ((StructureAlignment[])(results[0])); - } - - /// - public void search_glycans_by_kcamAsync(string kcf, string program, string option, int offset, int limit) { - this.search_glycans_by_kcamAsync(kcf, program, option, offset, limit, null); - } - - /// - public void search_glycans_by_kcamAsync(string kcf, string program, string option, int offset, int limit, object userState) { - if ((this.search_glycans_by_kcamOperationCompleted == null)) { - this.search_glycans_by_kcamOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_glycans_by_kcamOperationCompleted); - } - this.InvokeAsync("search_glycans_by_kcam", new object[] { - kcf, - program, - option, - offset, - limit}, this.search_glycans_by_kcamOperationCompleted, userState); - } - - private void Onsearch_glycans_by_kcamOperationCompleted(object arg) { - if ((this.search_glycans_by_kcamCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_glycans_by_kcamCompleted(this, new search_glycans_by_kcamCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_linkdb_between_databases", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public LinkDBRelation[] get_linkdb_between_databases(string from_db, string to_db, int offset, int limit) { - object[] results = this.Invoke("get_linkdb_between_databases", new object[] { - from_db, - to_db, - offset, - limit}); - return ((LinkDBRelation[])(results[0])); - } - - /// - public void get_linkdb_between_databasesAsync(string from_db, string to_db, int offset, int limit) { - this.get_linkdb_between_databasesAsync(from_db, to_db, offset, limit, null); - } - - /// - public void get_linkdb_between_databasesAsync(string from_db, string to_db, int offset, int limit, object userState) { - if ((this.get_linkdb_between_databasesOperationCompleted == null)) { - this.get_linkdb_between_databasesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_linkdb_between_databasesOperationCompleted); - } - this.InvokeAsync("get_linkdb_between_databases", new object[] { - from_db, - to_db, - offset, - limit}, this.get_linkdb_between_databasesOperationCompleted, userState); - } - - private void Onget_linkdb_between_databasesOperationCompleted(object arg) { - if ((this.get_linkdb_between_databasesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_linkdb_between_databasesCompleted(this, new get_linkdb_between_databasesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_drugs_by_name", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_drugs_by_name(string name) { - object[] results = this.Invoke("search_drugs_by_name", new object[] { - name}); - return ((string[])(results[0])); - } - - /// - public void search_drugs_by_nameAsync(string name) { - this.search_drugs_by_nameAsync(name, null); - } - - /// - public void search_drugs_by_nameAsync(string name, object userState) { - if ((this.search_drugs_by_nameOperationCompleted == null)) { - this.search_drugs_by_nameOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_drugs_by_nameOperationCompleted); - } - this.InvokeAsync("search_drugs_by_name", new object[] { - name}, this.search_drugs_by_nameOperationCompleted, userState); - } - - private void Onsearch_drugs_by_nameOperationCompleted(object arg) { - if ((this.search_drugs_by_nameCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_drugs_by_nameCompleted(this, new search_drugs_by_nameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_drugs_by_composition", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_drugs_by_composition(string composition) { - object[] results = this.Invoke("search_drugs_by_composition", new object[] { - composition}); - return ((string[])(results[0])); - } - - /// - public void search_drugs_by_compositionAsync(string composition) { - this.search_drugs_by_compositionAsync(composition, null); - } - - /// - public void search_drugs_by_compositionAsync(string composition, object userState) { - if ((this.search_drugs_by_compositionOperationCompleted == null)) { - this.search_drugs_by_compositionOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_drugs_by_compositionOperationCompleted); - } - this.InvokeAsync("search_drugs_by_composition", new object[] { - composition}, this.search_drugs_by_compositionOperationCompleted, userState); - } - - private void Onsearch_drugs_by_compositionOperationCompleted(object arg) { - if ((this.search_drugs_by_compositionCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_drugs_by_compositionCompleted(this, new search_drugs_by_compositionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_drugs_by_mass", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] search_drugs_by_mass(float mass, float range) { - object[] results = this.Invoke("search_drugs_by_mass", new object[] { - mass, - range}); - return ((string[])(results[0])); - } - - /// - public void search_drugs_by_massAsync(float mass, float range) { - this.search_drugs_by_massAsync(mass, range, null); - } - - /// - public void search_drugs_by_massAsync(float mass, float range, object userState) { - if ((this.search_drugs_by_massOperationCompleted == null)) { - this.search_drugs_by_massOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_drugs_by_massOperationCompleted); - } - this.InvokeAsync("search_drugs_by_mass", new object[] { - mass, - range}, this.search_drugs_by_massOperationCompleted, userState); - } - - private void Onsearch_drugs_by_massOperationCompleted(object arg) { - if ((this.search_drugs_by_massCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_drugs_by_massCompleted(this, new search_drugs_by_massCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#search_drugs_by_subcomp", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public StructureAlignment[] search_drugs_by_subcomp(string mol, int offset, int limit) { - object[] results = this.Invoke("search_drugs_by_subcomp", new object[] { - mol, - offset, - limit}); - return ((StructureAlignment[])(results[0])); - } - - /// - public void search_drugs_by_subcompAsync(string mol, int offset, int limit) { - this.search_drugs_by_subcompAsync(mol, offset, limit, null); - } - - /// - public void search_drugs_by_subcompAsync(string mol, int offset, int limit, object userState) { - if ((this.search_drugs_by_subcompOperationCompleted == null)) { - this.search_drugs_by_subcompOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsearch_drugs_by_subcompOperationCompleted); - } - this.InvokeAsync("search_drugs_by_subcomp", new object[] { - mol, - offset, - limit}, this.search_drugs_by_subcompOperationCompleted, userState); - } - - private void Onsearch_drugs_by_subcompOperationCompleted(object arg) { - if ((this.search_drugs_by_subcompCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.search_drugs_by_subcompCompleted(this, new search_drugs_by_subcompCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_references_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public int[] get_references_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_references_by_pathway", new object[] { - pathway_id}); - return ((int[])(results[0])); - } - - /// - public void get_references_by_pathwayAsync(string pathway_id) { - this.get_references_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_references_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_references_by_pathwayOperationCompleted == null)) { - this.get_references_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_references_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_references_by_pathway", new object[] { - pathway_id}, this.get_references_by_pathwayOperationCompleted, userState); - } - - private void Onget_references_by_pathwayOperationCompleted(object arg) { - if ((this.get_references_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_references_by_pathwayCompleted(this, new get_references_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_drugs_by_pathway", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_drugs_by_pathway(string pathway_id) { - object[] results = this.Invoke("get_drugs_by_pathway", new object[] { - pathway_id}); - return ((string[])(results[0])); - } - - /// - public void get_drugs_by_pathwayAsync(string pathway_id) { - this.get_drugs_by_pathwayAsync(pathway_id, null); - } - - /// - public void get_drugs_by_pathwayAsync(string pathway_id, object userState) { - if ((this.get_drugs_by_pathwayOperationCompleted == null)) { - this.get_drugs_by_pathwayOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_drugs_by_pathwayOperationCompleted); - } - this.InvokeAsync("get_drugs_by_pathway", new object[] { - pathway_id}, this.get_drugs_by_pathwayOperationCompleted, userState); - } - - private void Onget_drugs_by_pathwayOperationCompleted(object arg) { - if ((this.get_drugs_by_pathwayCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_drugs_by_pathwayCompleted(this, new get_drugs_by_pathwayCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapRpcMethodAttribute("SOAP/KEGG#get_pathways_by_drugs", RequestNamespace="SOAP/KEGG", ResponseNamespace="SOAP/KEGG")] - [return: System.Xml.Serialization.SoapElementAttribute("return")] - public string[] get_pathways_by_drugs(string[] drug_id_list) { - object[] results = this.Invoke("get_pathways_by_drugs", new object[] { - drug_id_list}); - return ((string[])(results[0])); - } - - /// - public void get_pathways_by_drugsAsync(string[] drug_id_list) { - this.get_pathways_by_drugsAsync(drug_id_list, null); - } - - /// - public void get_pathways_by_drugsAsync(string[] drug_id_list, object userState) { - if ((this.get_pathways_by_drugsOperationCompleted == null)) { - this.get_pathways_by_drugsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_pathways_by_drugsOperationCompleted); - } - this.InvokeAsync("get_pathways_by_drugs", new object[] { - drug_id_list}, this.get_pathways_by_drugsOperationCompleted, userState); - } - - private void Onget_pathways_by_drugsOperationCompleted(object arg) { - if ((this.get_pathways_by_drugsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.get_pathways_by_drugsCompleted(this, new get_pathways_by_drugsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - public new void CancelAsync(object userState) { - base.CancelAsync(userState); - } - - private bool IsLocalFileSystemWebService(string url) { - if (((url == null) - || (url == string.Empty))) { - return false; - } - System.Uri wsUri = new System.Uri(url); - if (((wsUri.Port >= 1024) - && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { - return true; - } - return false; - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class Definition { - - private string entry_idField; - - private string definitionField; - - /// - public string entry_id { - get { - return this.entry_idField; - } - set { - this.entry_idField = value; - } - } - - /// - public string definition { - get { - return this.definitionField; - } - set { - this.definitionField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class StructureAlignment { - - private string target_idField; - - private float scoreField; - - private int[] query_nodesField; - - private int[] target_nodesField; - - /// - public string target_id { - get { - return this.target_idField; - } - set { - this.target_idField = value; - } - } - - /// - public float score { - get { - return this.scoreField; - } - set { - this.scoreField = value; - } - } - - /// - public int[] query_nodes { - get { - return this.query_nodesField; - } - set { - this.query_nodesField = value; - } - } - - /// - public int[] target_nodes { - get { - return this.target_nodesField; - } - set { - this.target_nodesField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class Subtype { - - private string relationField; - - private int element_idField; - - private string typeField; - - /// - public string relation { - get { - return this.relationField; - } - set { - this.relationField = value; - } - } - - /// - public int element_id { - get { - return this.element_idField; - } - set { - this.element_idField = value; - } - } - - /// - public string type { - get { - return this.typeField; - } - set { - this.typeField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class PathwayElementRelation { - - private int element_id1Field; - - private int element_id2Field; - - private string typeField; - - private Subtype[] subtypesField; - - /// - public int element_id1 { - get { - return this.element_id1Field; - } - set { - this.element_id1Field = value; - } - } - - /// - public int element_id2 { - get { - return this.element_id2Field; - } - set { - this.element_id2Field = value; - } - } - - /// - public string type { - get { - return this.typeField; - } - set { - this.typeField = value; - } - } - - /// - public Subtype[] subtypes { - get { - return this.subtypesField; - } - set { - this.subtypesField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class PathwayElement { - - private int element_idField; - - private string typeField; - - private string[] namesField; - - private int[] componentsField; - - /// - public int element_id { - get { - return this.element_idField; - } - set { - this.element_idField = value; - } - } - - /// - public string type { - get { - return this.typeField; - } - set { - this.typeField = value; - } - } - - /// - public string[] names { - get { - return this.namesField; - } - set { - this.namesField = value; - } - } - - /// - public int[] components { - get { - return this.componentsField; - } - set { - this.componentsField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class MotifResult { - - private string motif_idField; - - private string definitionField; - - private string genes_idField; - - private int start_positionField; - - private int end_positionField; - - private float scoreField; - - private double evalueField; - - /// - public string motif_id { - get { - return this.motif_idField; - } - set { - this.motif_idField = value; - } - } - - /// - public string definition { - get { - return this.definitionField; - } - set { - this.definitionField = value; - } - } - - /// - public string genes_id { - get { - return this.genes_idField; - } - set { - this.genes_idField = value; - } - } - - /// - public int start_position { - get { - return this.start_positionField; - } - set { - this.start_positionField = value; - } - } - - /// - public int end_position { - get { - return this.end_positionField; - } - set { - this.end_positionField = value; - } - } - - /// - public float score { - get { - return this.scoreField; - } - set { - this.scoreField = value; - } - } - - /// - public double evalue { - get { - return this.evalueField; - } - set { - this.evalueField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class SSDBRelation { - - private string genes_id1Field; - - private string genes_id2Field; - - private int sw_scoreField; - - private float bit_scoreField; - - private float identityField; - - private int overlapField; - - private int start_position1Field; - - private int end_position1Field; - - private int start_position2Field; - - private int end_position2Field; - - private bool best_flag_1to2Field; - - private bool best_flag_2to1Field; - - private string definition1Field; - - private string definition2Field; - - private int length1Field; - - private int length2Field; - - /// - public string genes_id1 { - get { - return this.genes_id1Field; - } - set { - this.genes_id1Field = value; - } - } - - /// - public string genes_id2 { - get { - return this.genes_id2Field; - } - set { - this.genes_id2Field = value; - } - } - - /// - public int sw_score { - get { - return this.sw_scoreField; - } - set { - this.sw_scoreField = value; - } - } - - /// - public float bit_score { - get { - return this.bit_scoreField; - } - set { - this.bit_scoreField = value; - } - } - - /// - public float identity { - get { - return this.identityField; - } - set { - this.identityField = value; - } - } - - /// - public int overlap { - get { - return this.overlapField; - } - set { - this.overlapField = value; - } - } - - /// - public int start_position1 { - get { - return this.start_position1Field; - } - set { - this.start_position1Field = value; - } - } - - /// - public int end_position1 { - get { - return this.end_position1Field; - } - set { - this.end_position1Field = value; - } - } - - /// - public int start_position2 { - get { - return this.start_position2Field; - } - set { - this.start_position2Field = value; - } - } - - /// - public int end_position2 { - get { - return this.end_position2Field; - } - set { - this.end_position2Field = value; - } - } - - /// - public bool best_flag_1to2 { - get { - return this.best_flag_1to2Field; - } - set { - this.best_flag_1to2Field = value; - } - } - - /// - public bool best_flag_2to1 { - get { - return this.best_flag_2to1Field; - } - set { - this.best_flag_2to1Field = value; - } - } - - /// - public string definition1 { - get { - return this.definition1Field; - } - set { - this.definition1Field = value; - } - } - - /// - public string definition2 { - get { - return this.definition2Field; - } - set { - this.definition2Field = value; - } - } - - /// - public int length1 { - get { - return this.length1Field; - } - set { - this.length1Field = value; - } - } - - /// - public int length2 { - get { - return this.length2Field; - } - set { - this.length2Field = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.SoapTypeAttribute(Namespace="SOAP/KEGG")] - public partial class LinkDBRelation { - - private string entry_id1Field; - - private string entry_id2Field; - - private string typeField; - - private string pathField; - - /// - public string entry_id1 { - get { - return this.entry_id1Field; - } - set { - this.entry_id1Field = value; - } - } - - /// - public string entry_id2 { - get { - return this.entry_id2Field; - } - set { - this.entry_id2Field = value; - } - } - - /// - public string type { - get { - return this.typeField; - } - set { - this.typeField = value; - } - } - - /// - public string path { - get { - return this.pathField; - } - set { - this.pathField = value; - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void list_databasesCompletedEventHandler(object sender, list_databasesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class list_databasesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal list_databasesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void list_organismsCompletedEventHandler(object sender, list_organismsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class list_organismsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal list_organismsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void list_pathwaysCompletedEventHandler(object sender, list_pathwaysCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class list_pathwaysCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal list_pathwaysCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void list_ko_classesCompletedEventHandler(object sender, list_ko_classesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class list_ko_classesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal list_ko_classesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void binfoCompletedEventHandler(object sender, binfoCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class binfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal binfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void bgetCompletedEventHandler(object sender, bgetCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class bgetCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal bgetCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void bfindCompletedEventHandler(object sender, bfindCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class bfindCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal bfindCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void btitCompletedEventHandler(object sender, btitCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class btitCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal btitCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void bconvCompletedEventHandler(object sender, bconvCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class bconvCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal bconvCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_linkdb_by_entryCompletedEventHandler(object sender, get_linkdb_by_entryCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_linkdb_by_entryCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_linkdb_by_entryCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LinkDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LinkDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_best_neighbors_by_geneCompletedEventHandler(object sender, get_best_neighbors_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_best_neighbors_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_best_neighbors_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public SSDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SSDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_best_best_neighbors_by_geneCompletedEventHandler(object sender, get_best_best_neighbors_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_best_best_neighbors_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_best_best_neighbors_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public SSDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SSDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_reverse_best_neighbors_by_geneCompletedEventHandler(object sender, get_reverse_best_neighbors_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_reverse_best_neighbors_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_reverse_best_neighbors_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public SSDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SSDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_paralogs_by_geneCompletedEventHandler(object sender, get_paralogs_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_paralogs_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_paralogs_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public SSDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((SSDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_motifs_by_geneCompletedEventHandler(object sender, get_motifs_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_motifs_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_motifs_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public MotifResult[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((MotifResult[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_motifsCompletedEventHandler(object sender, get_genes_by_motifsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_motifsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_motifsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_ko_by_geneCompletedEventHandler(object sender, get_ko_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_ko_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_ko_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_ko_by_ko_classCompletedEventHandler(object sender, get_ko_by_ko_classCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_ko_by_ko_classCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_ko_by_ko_classCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_koCompletedEventHandler(object sender, get_genes_by_koCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_koCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_koCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_ko_classCompletedEventHandler(object sender, get_genes_by_ko_classCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_ko_classCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_ko_classCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public Definition[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((Definition[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_elements_by_pathwayCompletedEventHandler(object sender, get_elements_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_elements_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_elements_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public PathwayElement[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((PathwayElement[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_element_relations_by_pathwayCompletedEventHandler(object sender, get_element_relations_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_element_relations_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_element_relations_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public PathwayElementRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((PathwayElementRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void color_pathway_by_elementsCompletedEventHandler(object sender, color_pathway_by_elementsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class color_pathway_by_elementsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal color_pathway_by_elementsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_html_of_colored_pathway_by_elementsCompletedEventHandler(object sender, get_html_of_colored_pathway_by_elementsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_html_of_colored_pathway_by_elementsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_html_of_colored_pathway_by_elementsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void mark_pathway_by_objectsCompletedEventHandler(object sender, mark_pathway_by_objectsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class mark_pathway_by_objectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal mark_pathway_by_objectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void color_pathway_by_objectsCompletedEventHandler(object sender, color_pathway_by_objectsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class color_pathway_by_objectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal color_pathway_by_objectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_html_of_marked_pathway_by_objectsCompletedEventHandler(object sender, get_html_of_marked_pathway_by_objectsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_html_of_marked_pathway_by_objectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_html_of_marked_pathway_by_objectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_html_of_colored_pathway_by_objectsCompletedEventHandler(object sender, get_html_of_colored_pathway_by_objectsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_html_of_colored_pathway_by_objectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_html_of_colored_pathway_by_objectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_pathwayCompletedEventHandler(object sender, get_genes_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_enzymes_by_pathwayCompletedEventHandler(object sender, get_enzymes_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_enzymes_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_enzymes_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_reactions_by_pathwayCompletedEventHandler(object sender, get_reactions_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_reactions_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_reactions_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_genesCompletedEventHandler(object sender, get_pathways_by_genesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_genesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_genesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_enzymesCompletedEventHandler(object sender, get_pathways_by_enzymesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_enzymesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_enzymesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_reactionsCompletedEventHandler(object sender, get_pathways_by_reactionsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_reactionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_reactionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_linked_pathwaysCompletedEventHandler(object sender, get_linked_pathwaysCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_linked_pathwaysCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_linked_pathwaysCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_enzymeCompletedEventHandler(object sender, get_genes_by_enzymeCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_enzymeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_enzymeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_enzymes_by_geneCompletedEventHandler(object sender, get_enzymes_by_geneCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_enzymes_by_geneCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_enzymes_by_geneCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_enzymes_by_reactionCompletedEventHandler(object sender, get_enzymes_by_reactionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_enzymes_by_reactionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_enzymes_by_reactionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_reactions_by_enzymeCompletedEventHandler(object sender, get_reactions_by_enzymeCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_reactions_by_enzymeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_reactions_by_enzymeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_genes_by_organismCompletedEventHandler(object sender, get_genes_by_organismCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_genes_by_organismCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_genes_by_organismCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_number_of_genes_by_organismCompletedEventHandler(object sender, get_number_of_genes_by_organismCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_number_of_genes_by_organismCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_number_of_genes_by_organismCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_reactions_by_glycanCompletedEventHandler(object sender, get_reactions_by_glycanCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_reactions_by_glycanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_reactions_by_glycanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_reactions_by_compoundCompletedEventHandler(object sender, get_reactions_by_compoundCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_reactions_by_compoundCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_reactions_by_compoundCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_enzymes_by_glycanCompletedEventHandler(object sender, get_enzymes_by_glycanCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_enzymes_by_glycanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_enzymes_by_glycanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_enzymes_by_compoundCompletedEventHandler(object sender, get_enzymes_by_compoundCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_enzymes_by_compoundCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_enzymes_by_compoundCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_compoundsCompletedEventHandler(object sender, get_pathways_by_compoundsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_compoundsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_compoundsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_glycansCompletedEventHandler(object sender, get_pathways_by_glycansCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_glycansCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_glycansCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_compounds_by_pathwayCompletedEventHandler(object sender, get_compounds_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_compounds_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_compounds_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_glycans_by_pathwayCompletedEventHandler(object sender, get_glycans_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_glycans_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_glycans_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_compounds_by_reactionCompletedEventHandler(object sender, get_compounds_by_reactionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_compounds_by_reactionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_compounds_by_reactionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_glycans_by_reactionCompletedEventHandler(object sender, get_glycans_by_reactionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_glycans_by_reactionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_glycans_by_reactionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_compounds_by_enzymeCompletedEventHandler(object sender, get_compounds_by_enzymeCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_compounds_by_enzymeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_compounds_by_enzymeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_glycans_by_enzymeCompletedEventHandler(object sender, get_glycans_by_enzymeCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_glycans_by_enzymeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_glycans_by_enzymeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void convert_mol_to_kcfCompletedEventHandler(object sender, convert_mol_to_kcfCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class convert_mol_to_kcfCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal convert_mol_to_kcfCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_kos_by_pathwayCompletedEventHandler(object sender, get_kos_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_kos_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_kos_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_kosCompletedEventHandler(object sender, get_pathways_by_kosCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_kosCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_kosCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_compounds_by_nameCompletedEventHandler(object sender, search_compounds_by_nameCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_compounds_by_nameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_compounds_by_nameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_glycans_by_nameCompletedEventHandler(object sender, search_glycans_by_nameCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_glycans_by_nameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_glycans_by_nameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_compounds_by_compositionCompletedEventHandler(object sender, search_compounds_by_compositionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_compounds_by_compositionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_compounds_by_compositionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_compounds_by_massCompletedEventHandler(object sender, search_compounds_by_massCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_compounds_by_massCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_compounds_by_massCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_glycans_by_massCompletedEventHandler(object sender, search_glycans_by_massCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_glycans_by_massCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_glycans_by_massCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_glycans_by_compositionCompletedEventHandler(object sender, search_glycans_by_compositionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_glycans_by_compositionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_glycans_by_compositionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_compounds_by_subcompCompletedEventHandler(object sender, search_compounds_by_subcompCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_compounds_by_subcompCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_compounds_by_subcompCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public StructureAlignment[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((StructureAlignment[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_glycans_by_kcamCompletedEventHandler(object sender, search_glycans_by_kcamCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_glycans_by_kcamCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_glycans_by_kcamCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public StructureAlignment[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((StructureAlignment[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_linkdb_between_databasesCompletedEventHandler(object sender, get_linkdb_between_databasesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_linkdb_between_databasesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_linkdb_between_databasesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LinkDBRelation[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LinkDBRelation[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_drugs_by_nameCompletedEventHandler(object sender, search_drugs_by_nameCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_drugs_by_nameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_drugs_by_nameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_drugs_by_compositionCompletedEventHandler(object sender, search_drugs_by_compositionCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_drugs_by_compositionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_drugs_by_compositionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_drugs_by_massCompletedEventHandler(object sender, search_drugs_by_massCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_drugs_by_massCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_drugs_by_massCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void search_drugs_by_subcompCompletedEventHandler(object sender, search_drugs_by_subcompCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class search_drugs_by_subcompCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal search_drugs_by_subcompCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public StructureAlignment[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((StructureAlignment[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_references_by_pathwayCompletedEventHandler(object sender, get_references_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_references_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_references_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_drugs_by_pathwayCompletedEventHandler(object sender, get_drugs_by_pathwayCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_drugs_by_pathwayCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_drugs_by_pathwayCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - public delegate void get_pathways_by_drugsCompletedEventHandler(object sender, get_pathways_by_drugsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class get_pathways_by_drugsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal get_pathways_by_drugsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string[])(this.results[0])); - } - } - } -} - -#pragma warning restore 1591 \ No newline at end of file diff --git a/Web References/jp.genome.soap/Reference.map b/Web References/jp.genome.soap/Reference.map deleted file mode 100644 index 6077954..0000000 --- a/Web References/jp.genome.soap/Reference.map +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Web References/jp.genome.soap/SSDBRelation1.datasource b/Web References/jp.genome.soap/SSDBRelation1.datasource deleted file mode 100644 index 302ef61..0000000 --- a/Web References/jp.genome.soap/SSDBRelation1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.SSDBRelation, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Web References/jp.genome.soap/StructureAlignment1.datasource b/Web References/jp.genome.soap/StructureAlignment1.datasource deleted file mode 100644 index 6523bd3..0000000 --- a/Web References/jp.genome.soap/StructureAlignment1.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - HCSAnalyzer.jp.genome.soap.StructureAlignment, Web References.jp.genome.soap.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/WindowHCSAnalyzer.Designer.cs b/WindowHCSAnalyzer.Designer.cs index 822be9c..75511a7 100644 --- a/WindowHCSAnalyzer.Designer.cs +++ b/WindowHCSAnalyzer.Designer.cs @@ -76,27 +76,19 @@ private void InitializeComponent() this.label4 = new System.Windows.Forms.Label(); this.richTextBoxInfoForNormalization = new System.Windows.Forms.RichTextBox(); this.comboBoxMethodForNormalization = new System.Windows.Forms.ComboBox(); + this.tabPageSingleCellAnalysis = new System.Windows.Forms.TabPage(); + this.checkBoxWellClassAsPhenoClass = new System.Windows.Forms.CheckBox(); + this.PanelForMultipleClassesSelection = new System.Windows.Forms.Panel(); + this.buttonToSelectWellsFromClass = new System.Windows.Forms.Button(); + this.listBoxSelectedWells = new System.Windows.Forms.ListBox(); + this.buttonDisplayWellsSelectionData = new System.Windows.Forms.Button(); this.tabPageClassification = new System.Windows.Forms.TabPage(); - this.groupBox6 = new System.Windows.Forms.GroupBox(); - this.buttonStartManualSelection = new System.Windows.Forms.Button(); - this.numericUpDownManualThreshold = new System.Windows.Forms.NumericUpDown(); - this.radioButtonManualLowerThan = new System.Windows.Forms.RadioButton(); - this.comboBoxManualClassToBeAnalyzed = new System.Windows.Forms.ComboBox(); - this.radioButtonManualHigherThan = new System.Windows.Forms.RadioButton(); - this.label14 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.richTextBoxForManualSelection = new System.Windows.Forms.RichTextBox(); - this.comboBoxdescriptorToBeAnalyzed = new System.Windows.Forms.ComboBox(); this.groupBox12 = new System.Windows.Forms.GroupBox(); - this.radioButtonClusterFullScreen = new System.Windows.Forms.RadioButton(); - this.radioButtonClusterPlateByPlate = new System.Windows.Forms.RadioButton(); - this.buttonCluster = new System.Windows.Forms.Button(); - this.label10 = new System.Windows.Forms.Label(); - this.checkBoxAutomatedClusterNumber = new System.Windows.Forms.CheckBox(); + this.ButtonClustering = new System.Windows.Forms.Button(); this.richTextBoxInfoClustering = new System.Windows.Forms.RichTextBox(); - this.comboBoxClusteringMethod = new System.Windows.Forms.ComboBox(); - this.numericUpDownClusterNumber = new System.Windows.Forms.NumericUpDown(); this.groupBox11 = new System.Windows.Forms.GroupBox(); + this.panelTMPForFeedBack = new System.Windows.Forms.Panel(); + this.buttonNewClassificationProcess = new System.Windows.Forms.Button(); this.button_Trees = new System.Windows.Forms.Button(); this.radioButtonClassifGlobal = new System.Windows.Forms.RadioButton(); this.comboBoxNeutralClassForClassif = new System.Windows.Forms.ComboBox(); @@ -118,26 +110,13 @@ private void InitializeComponent() this.groupBox4 = new System.Windows.Forms.GroupBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.buttonExport = new System.Windows.Forms.Button(); - this.tabPageWellsSelection = new System.Windows.Forms.TabPage(); - this.buttonToSelectWellsFromClass = new System.Windows.Forms.Button(); - this.comboBoxClassForWellSelection = new System.Windows.Forms.ComboBox(); - this.listBoxSelectedWells = new System.Windows.Forms.ListBox(); - this.contextMenuStripForListSelectedWells = new System.Windows.Forms.ContextMenuStrip(this.components); - this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonDisplayWellsSelectionData = new System.Windows.Forms.Button(); this.imageListForTab = new System.Windows.Forms.ImageList(this.components); this.panelForTools = new System.Windows.Forms.Panel(); this.label1 = new System.Windows.Forms.Label(); this.comboBoxClass = new System.Windows.Forms.ComboBox(); this.labelNumClasses = new System.Windows.Forms.Label(); - this.buttonGlobalOnlySelected = new System.Windows.Forms.Button(); - this.checkBoxDisplayClasses = new System.Windows.Forms.CheckBox(); - this.buttonSizeIncrease = new System.Windows.Forms.Button(); - this.buttonSizeDecrease = new System.Windows.Forms.Button(); - this.checkBoxApplyToAllPlates = new System.Windows.Forms.CheckBox(); this.labelMax = new System.Windows.Forms.Label(); this.panelForLUT = new System.Windows.Forms.Panel(); - this.buttonGlobalSelection = new System.Windows.Forms.Button(); this.labelMin = new System.Windows.Forms.Label(); this.panelForPlate = new System.Windows.Forms.Panel(); this.pictureBox3 = new System.Windows.Forms.PictureBox(); @@ -147,11 +126,10 @@ private void InitializeComponent() this.cellByCellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadDBToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.generateDBFromCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.loadScreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.generateScreenToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.univariateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.multivariateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.histogramBasedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.singleCellsSimulatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SaveScreentoCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -188,48 +166,46 @@ private void InitializeComponent() this.scatterPointsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.xYScatterPointsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.xYZScatterPointsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.distributionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.stackedHistogramsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.distanceMatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.visualizationToolStripMenuItemPCA = new System.Windows.Forms.ToolStripMenuItem(); - this.scatterPointsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.xYScatterPointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.visualizationToolStripMenuItemFullScreen = new System.Windows.Forms.ToolStripMenuItem(); this.xYZScatterPointsToolStripMenuItemFullScreen = new System.Windows.Forms.ToolStripMenuItem(); - this.histogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.stackedHistogramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); this.cellBasedClassificationTreeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.hierarchicalTreeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.projectionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCAToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lDAToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.displayGraphToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.projectionsFullScreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lDAToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.displayGraphToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.pCAToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); this.StatisticsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.zscoreSinglePlateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.normalProbabilityPlotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.systematicErrorsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.mINEAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.qualityControlsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.zScoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.normalProbabilityPlotToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.systematicErrorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ftestdescBasedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statisticsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.correlationAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.correlationMatrixToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.covarianceMatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.qualityControlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.zscoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.sSMDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.normalProbabilityPlotToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.correlationMatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.coeffOfVariationEvolutionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.descriptorEvolutionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.classesDistributionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.extractPhenotypesOfInterestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.generateHitsDistributionMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createAveragePlateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.projectionsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.pCAToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.lDAToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.hitIdentificationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mahalanobisDistanceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemGeneAnalysis = new System.Windows.Forms.ToolStripMenuItem(); this.findGeneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.pahtwaysAnalysisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.findPathwayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pathwayExpressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.betaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.dRCAnalysisToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); this.doseResponseDesignerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -239,12 +215,23 @@ private void InitializeComponent() this.displayRespondingDRCToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.currentPlate3DToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.generateDRCsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.distributionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.distributionsModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.displayReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.loadSingleImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testSingleImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bioFormatsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newOptionMenuToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testDisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.heatMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testRStatsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testNewProjectorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testBoxPlotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testLinearRegressionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testMultiScatterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripTextBox1 = new System.Windows.Forms.ToolStripTextBox(); this.pluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutHCSAnalyzerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -257,6 +244,20 @@ private void InitializeComponent() this.splitContainerMain = new System.Windows.Forms.SplitContainer(); this.buttonPreviousPlate = new System.Windows.Forms.Button(); this.buttonNextPlate = new System.Windows.Forms.Button(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.toolStripMain = new System.Windows.Forms.ToolStrip(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonZoomOut = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonZoomIn = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripDropDownButtonApplyClass = new System.Windows.Forms.ToolStripDropDownButton(); + this.globalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.globalIfOnlyActiveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButtonProcessMode = new System.Windows.Forms.ToolStripDropDownButton(); + this.ProcessModeCurrentPlateOnlyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ProcessModeplateByPlateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ProcessModeEntireScreeningToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.tabControlMain.SuspendLayout(); this.tabPageDImRed.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDownNewDimension)).BeginInit(); @@ -269,11 +270,9 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.dataGridViewForQualityControl)).BeginInit(); this.tabPageNormalization.SuspendLayout(); this.groupBox15.SuspendLayout(); + this.tabPageSingleCellAnalysis.SuspendLayout(); this.tabPageClassification.SuspendLayout(); - this.groupBox6.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualThreshold)).BeginInit(); this.groupBox12.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownClusterNumber)).BeginInit(); this.groupBox11.SuspendLayout(); this.tabPageExport.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerExport)).BeginInit(); @@ -285,8 +284,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.groupBox4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - this.tabPageWellsSelection.SuspendLayout(); - this.contextMenuStripForListSelectedWells.SuspendLayout(); this.panelForTools.SuspendLayout(); this.panelForPlate.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); @@ -296,23 +293,29 @@ private void InitializeComponent() this.splitContainerMain.Panel1.SuspendLayout(); this.splitContainerMain.Panel2.SuspendLayout(); this.splitContainerMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.toolStripMain.SuspendLayout(); this.SuspendLayout(); // // tabControlMain // this.tabControlMain.AllowDrop = true; - this.tabControlMain.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.tabControlMain.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.tabControlMain.Controls.Add(this.tabPageDImRed); this.tabControlMain.Controls.Add(this.tabPageQualityQtrl); this.tabControlMain.Controls.Add(this.tabPageNormalization); + this.tabControlMain.Controls.Add(this.tabPageSingleCellAnalysis); this.tabControlMain.Controls.Add(this.tabPageClassification); this.tabControlMain.Controls.Add(this.tabPageExport); - this.tabControlMain.Controls.Add(this.tabPageWellsSelection); - this.tabControlMain.Location = new System.Drawing.Point(0, 429); + this.tabControlMain.Location = new System.Drawing.Point(5, 3); this.tabControlMain.Name = "tabControlMain"; this.tabControlMain.SelectedIndex = 0; - this.tabControlMain.Size = new System.Drawing.Size(1216, 303); + this.tabControlMain.Size = new System.Drawing.Size(1177, 264); this.tabControlMain.TabIndex = 5; this.tabControlMain.SelectedIndexChanged += new System.EventHandler(this.tabControlMain_SelectedIndexChanged); this.tabControlMain.DragDrop += new System.Windows.Forms.DragEventHandler(this.tabControlMain_DragDrop); @@ -331,7 +334,7 @@ private void InitializeComponent() this.tabPageDImRed.Location = new System.Drawing.Point(4, 22); this.tabPageDImRed.Name = "tabPageDImRed"; this.tabPageDImRed.Padding = new System.Windows.Forms.Padding(3); - this.tabPageDImRed.Size = new System.Drawing.Size(1208, 277); + this.tabPageDImRed.Size = new System.Drawing.Size(1169, 238); this.tabPageDImRed.TabIndex = 8; this.tabPageDImRed.Text = "Dimensionality Reduction"; this.tabPageDImRed.UseVisualStyleBackColor = true; @@ -395,9 +398,9 @@ private void InitializeComponent() // this.buttonReduceDim.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonReduceDim.Enabled = false; - this.buttonReduceDim.Location = new System.Drawing.Point(1052, 234); + this.buttonReduceDim.Location = new System.Drawing.Point(1029, 195); this.buttonReduceDim.Name = "buttonReduceDim"; - this.buttonReduceDim.Size = new System.Drawing.Size(150, 37); + this.buttonReduceDim.Size = new System.Drawing.Size(134, 37); this.buttonReduceDim.TabIndex = 9; this.buttonReduceDim.Text = "Reduce Dimensionality"; this.buttonReduceDim.UseVisualStyleBackColor = true; @@ -411,7 +414,7 @@ private void InitializeComponent() this.groupBoxUnsupervised.Controls.Add(this.comboBoxReduceDimSingleClass); this.groupBoxUnsupervised.Location = new System.Drawing.Point(174, 29); this.groupBoxUnsupervised.Name = "groupBoxUnsupervised"; - this.groupBoxUnsupervised.Size = new System.Drawing.Size(263, 245); + this.groupBoxUnsupervised.Size = new System.Drawing.Size(263, 206); this.groupBoxUnsupervised.TabIndex = 7; this.groupBoxUnsupervised.TabStop = false; // @@ -422,7 +425,7 @@ private void InitializeComponent() this.richTextBoxUnsupervisedDimRec.Location = new System.Drawing.Point(6, 89); this.richTextBoxUnsupervisedDimRec.Name = "richTextBoxUnsupervisedDimRec"; this.richTextBoxUnsupervisedDimRec.ReadOnly = true; - this.richTextBoxUnsupervisedDimRec.Size = new System.Drawing.Size(251, 149); + this.richTextBoxUnsupervisedDimRec.Size = new System.Drawing.Size(251, 110); this.richTextBoxUnsupervisedDimRec.TabIndex = 5; this.richTextBoxUnsupervisedDimRec.Text = ""; this.richTextBoxUnsupervisedDimRec.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxUnsupervisedDimRec_LinkClicked); @@ -452,7 +455,7 @@ private void InitializeComponent() this.groupBoxSupervised.Enabled = false; this.groupBoxSupervised.Location = new System.Drawing.Point(483, 29); this.groupBoxSupervised.Name = "groupBoxSupervised"; - this.groupBoxSupervised.Size = new System.Drawing.Size(263, 245); + this.groupBoxSupervised.Size = new System.Drawing.Size(263, 206); this.groupBoxSupervised.TabIndex = 8; this.groupBoxSupervised.TabStop = false; // @@ -463,8 +466,8 @@ private void InitializeComponent() this.comboBoxDimReductionNeutralClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxDimReductionNeutralClass.FormattingEnabled = true; this.comboBoxDimReductionNeutralClass.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -486,7 +489,7 @@ private void InitializeComponent() this.richTextBoxSupervisedDimRec.Location = new System.Drawing.Point(6, 89); this.richTextBoxSupervisedDimRec.Name = "richTextBoxSupervisedDimRec"; this.richTextBoxSupervisedDimRec.ReadOnly = true; - this.richTextBoxSupervisedDimRec.Size = new System.Drawing.Size(251, 149); + this.richTextBoxSupervisedDimRec.Size = new System.Drawing.Size(251, 110); this.richTextBoxSupervisedDimRec.TabIndex = 8; this.richTextBoxSupervisedDimRec.Text = ""; this.richTextBoxSupervisedDimRec.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxSupervisedDimRec_LinkClicked); @@ -527,7 +530,7 @@ private void InitializeComponent() this.tabPageQualityQtrl.Location = new System.Drawing.Point(4, 22); this.tabPageQualityQtrl.Name = "tabPageQualityQtrl"; this.tabPageQualityQtrl.Padding = new System.Windows.Forms.Padding(3); - this.tabPageQualityQtrl.Size = new System.Drawing.Size(1208, 277); + this.tabPageQualityQtrl.Size = new System.Drawing.Size(1169, 238); this.tabPageQualityQtrl.TabIndex = 7; this.tabPageQualityQtrl.Text = "Systematic Error Identification & Correction"; this.tabPageQualityQtrl.UseVisualStyleBackColor = true; @@ -547,7 +550,7 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.comboBoxRejection); this.groupBox1.Location = new System.Drawing.Point(694, 6); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(291, 268); + this.groupBox1.Size = new System.Drawing.Size(291, 255); this.groupBox1.TabIndex = 8; this.groupBox1.TabStop = false; this.groupBox1.Text = "Rejection"; @@ -556,7 +559,7 @@ private void InitializeComponent() // this.buttonRejectPlates.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonRejectPlates.Enabled = false; - this.buttonRejectPlates.Location = new System.Drawing.Point(65, 225); + this.buttonRejectPlates.Location = new System.Drawing.Point(66, 192); this.buttonRejectPlates.Name = "buttonRejectPlates"; this.buttonRejectPlates.Size = new System.Drawing.Size(150, 34); this.buttonRejectPlates.TabIndex = 14; @@ -569,8 +572,8 @@ private void InitializeComponent() this.comboBoxRejectionPositiveCtrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxRejectionPositiveCtrl.FormattingEnabled = true; this.comboBoxRejectionPositiveCtrl.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -579,7 +582,7 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxRejectionPositiveCtrl.Location = new System.Drawing.Point(161, 101); + this.comboBoxRejectionPositiveCtrl.Location = new System.Drawing.Point(161, 87); this.comboBoxRejectionPositiveCtrl.Name = "comboBoxRejectionPositiveCtrl"; this.comboBoxRejectionPositiveCtrl.Size = new System.Drawing.Size(108, 21); this.comboBoxRejectionPositiveCtrl.TabIndex = 31; @@ -588,7 +591,7 @@ private void InitializeComponent() // label11 // this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(172, 85); + this.label11.Location = new System.Drawing.Point(172, 71); this.label11.Name = "label11"; this.label11.Size = new System.Drawing.Size(80, 13); this.label11.TabIndex = 33; @@ -599,8 +602,8 @@ private void InitializeComponent() this.comboBoxRejectionNegativeCtrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxRejectionNegativeCtrl.FormattingEnabled = true; this.comboBoxRejectionNegativeCtrl.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -609,7 +612,7 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxRejectionNegativeCtrl.Location = new System.Drawing.Point(27, 101); + this.comboBoxRejectionNegativeCtrl.Location = new System.Drawing.Point(27, 87); this.comboBoxRejectionNegativeCtrl.Name = "comboBoxRejectionNegativeCtrl"; this.comboBoxRejectionNegativeCtrl.Size = new System.Drawing.Size(110, 21); this.comboBoxRejectionNegativeCtrl.TabIndex = 30; @@ -618,7 +621,7 @@ private void InitializeComponent() // label12 // this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(39, 85); + this.label12.Location = new System.Drawing.Point(39, 71); this.label12.Name = "label12"; this.label12.Size = new System.Drawing.Size(86, 13); this.label12.TabIndex = 32; @@ -632,7 +635,7 @@ private void InitializeComponent() 0, 0, 65536}); - this.numericUpDownRejectionThreshold.Location = new System.Drawing.Point(118, 50); + this.numericUpDownRejectionThreshold.Location = new System.Drawing.Point(117, 44); this.numericUpDownRejectionThreshold.Name = "numericUpDownRejectionThreshold"; this.numericUpDownRejectionThreshold.Size = new System.Drawing.Size(120, 20); this.numericUpDownRejectionThreshold.TabIndex = 6; @@ -645,7 +648,7 @@ private void InitializeComponent() // label9 // this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(53, 52); + this.label9.Location = new System.Drawing.Point(52, 46); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(54, 13); this.label9.TabIndex = 5; @@ -657,10 +660,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Left))); this.richTextBoxInformationRejection.BackColor = System.Drawing.SystemColors.Control; this.richTextBoxInformationRejection.ForeColor = System.Drawing.SystemColors.WindowText; - this.richTextBoxInformationRejection.Location = new System.Drawing.Point(6, 128); + this.richTextBoxInformationRejection.Location = new System.Drawing.Point(6, 122); this.richTextBoxInformationRejection.Name = "richTextBoxInformationRejection"; this.richTextBoxInformationRejection.ReadOnly = true; - this.richTextBoxInformationRejection.Size = new System.Drawing.Size(279, 89); + this.richTextBoxInformationRejection.Size = new System.Drawing.Size(279, 64); this.richTextBoxInformationRejection.TabIndex = 4; this.richTextBoxInformationRejection.Text = ""; this.richTextBoxInformationRejection.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxInformationRejection_LinkClicked); @@ -685,7 +688,7 @@ private void InitializeComponent() this.groupBox2.Controls.Add(this.buttonCorrectionPlateByPlate); this.groupBox2.Location = new System.Drawing.Point(426, 6); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(262, 268); + this.groupBox2.Size = new System.Drawing.Size(262, 255); this.groupBox2.TabIndex = 7; this.groupBox2.TabStop = false; this.groupBox2.Text = "Correction"; @@ -697,7 +700,7 @@ private void InitializeComponent() this.richTextBoxInformationForPlateCorrection.Location = new System.Drawing.Point(5, 64); this.richTextBoxInformationForPlateCorrection.Name = "richTextBoxInformationForPlateCorrection"; this.richTextBoxInformationForPlateCorrection.ReadOnly = true; - this.richTextBoxInformationForPlateCorrection.Size = new System.Drawing.Size(251, 153); + this.richTextBoxInformationForPlateCorrection.Size = new System.Drawing.Size(251, 122); this.richTextBoxInformationForPlateCorrection.TabIndex = 4; this.richTextBoxInformationForPlateCorrection.Text = ""; this.richTextBoxInformationForPlateCorrection.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxInformationForPlateCorrection_LinkClicked); @@ -718,7 +721,7 @@ private void InitializeComponent() // this.buttonCorrectionPlateByPlate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonCorrectionPlateByPlate.Enabled = false; - this.buttonCorrectionPlateByPlate.Location = new System.Drawing.Point(57, 226); + this.buttonCorrectionPlateByPlate.Location = new System.Drawing.Point(57, 192); this.buttonCorrectionPlateByPlate.Name = "buttonCorrectionPlateByPlate"; this.buttonCorrectionPlateByPlate.Size = new System.Drawing.Size(150, 34); this.buttonCorrectionPlateByPlate.TabIndex = 5; @@ -735,7 +738,7 @@ private void InitializeComponent() this.dataGridViewForQualityControl.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridViewForQualityControl.Location = new System.Drawing.Point(6, 6); this.dataGridViewForQualityControl.Name = "dataGridViewForQualityControl"; - this.dataGridViewForQualityControl.Size = new System.Drawing.Size(414, 228); + this.dataGridViewForQualityControl.Size = new System.Drawing.Size(414, 186); this.dataGridViewForQualityControl.TabIndex = 1; this.dataGridViewForQualityControl.CellContentDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewForQualityControl_CellContentDoubleClick); // @@ -744,7 +747,7 @@ private void InitializeComponent() this.buttonQualityControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.buttonQualityControl.Enabled = false; - this.buttonQualityControl.Location = new System.Drawing.Point(5, 240); + this.buttonQualityControl.Location = new System.Drawing.Point(6, 198); this.buttonQualityControl.Name = "buttonQualityControl"; this.buttonQualityControl.Size = new System.Drawing.Size(414, 34); this.buttonQualityControl.TabIndex = 2; @@ -760,7 +763,7 @@ private void InitializeComponent() this.tabPageNormalization.Location = new System.Drawing.Point(4, 22); this.tabPageNormalization.Name = "tabPageNormalization"; this.tabPageNormalization.Padding = new System.Windows.Forms.Padding(3); - this.tabPageNormalization.Size = new System.Drawing.Size(1208, 277); + this.tabPageNormalization.Size = new System.Drawing.Size(1169, 238); this.tabPageNormalization.TabIndex = 3; this.tabPageNormalization.Text = "Normalization"; this.tabPageNormalization.UseVisualStyleBackColor = true; @@ -769,7 +772,7 @@ private void InitializeComponent() // this.buttonNormalize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonNormalize.Enabled = false; - this.buttonNormalize.Location = new System.Drawing.Point(1055, 237); + this.buttonNormalize.Location = new System.Drawing.Point(1010, 198); this.buttonNormalize.Name = "buttonNormalize"; this.buttonNormalize.Size = new System.Drawing.Size(150, 34); this.buttonNormalize.TabIndex = 5; @@ -789,7 +792,7 @@ private void InitializeComponent() this.groupBox15.Controls.Add(this.comboBoxMethodForNormalization); this.groupBox15.Location = new System.Drawing.Point(6, 6); this.groupBox15.Name = "groupBox15"; - this.groupBox15.Size = new System.Drawing.Size(476, 271); + this.groupBox15.Size = new System.Drawing.Size(476, 226); this.groupBox15.TabIndex = 8; this.groupBox15.TabStop = false; this.groupBox15.Text = "Normalization"; @@ -799,8 +802,8 @@ private void InitializeComponent() this.comboBoxNormalizationPositiveCtrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxNormalizationPositiveCtrl.FormattingEnabled = true; this.comboBoxNormalizationPositiveCtrl.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -809,7 +812,7 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxNormalizationPositiveCtrl.Location = new System.Drawing.Point(335, 69); + this.comboBoxNormalizationPositiveCtrl.Location = new System.Drawing.Point(335, 56); this.comboBoxNormalizationPositiveCtrl.Name = "comboBoxNormalizationPositiveCtrl"; this.comboBoxNormalizationPositiveCtrl.Size = new System.Drawing.Size(120, 21); this.comboBoxNormalizationPositiveCtrl.TabIndex = 3; @@ -818,7 +821,7 @@ private void InitializeComponent() // label7 // this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(257, 72); + this.label7.Location = new System.Drawing.Point(257, 59); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(72, 13); this.label7.TabIndex = 29; @@ -829,8 +832,8 @@ private void InitializeComponent() this.comboBoxNormalizationNegativeCtrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxNormalizationNegativeCtrl.FormattingEnabled = true; this.comboBoxNormalizationNegativeCtrl.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -839,7 +842,7 @@ private void InitializeComponent() "7", "8", "9"}); - this.comboBoxNormalizationNegativeCtrl.Location = new System.Drawing.Point(100, 69); + this.comboBoxNormalizationNegativeCtrl.Location = new System.Drawing.Point(100, 56); this.comboBoxNormalizationNegativeCtrl.Name = "comboBoxNormalizationNegativeCtrl"; this.comboBoxNormalizationNegativeCtrl.Size = new System.Drawing.Size(120, 21); this.comboBoxNormalizationNegativeCtrl.TabIndex = 2; @@ -848,7 +851,7 @@ private void InitializeComponent() // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(16, 72); + this.label4.Location = new System.Drawing.Point(16, 59); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(78, 13); this.label4.TabIndex = 27; @@ -858,10 +861,10 @@ private void InitializeComponent() // this.richTextBoxInfoForNormalization.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.richTextBoxInfoForNormalization.Location = new System.Drawing.Point(6, 96); + this.richTextBoxInfoForNormalization.Location = new System.Drawing.Point(6, 83); this.richTextBoxInfoForNormalization.Name = "richTextBoxInfoForNormalization"; this.richTextBoxInfoForNormalization.ReadOnly = true; - this.richTextBoxInfoForNormalization.Size = new System.Drawing.Size(464, 169); + this.richTextBoxInfoForNormalization.Size = new System.Drawing.Size(464, 137); this.richTextBoxInfoForNormalization.TabIndex = 4; this.richTextBoxInfoForNormalization.Text = ""; this.richTextBoxInfoForNormalization.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxInfoForNormalization_LinkClicked); @@ -879,276 +882,134 @@ private void InitializeComponent() this.comboBoxMethodForNormalization.TabIndex = 1; this.comboBoxMethodForNormalization.SelectedIndexChanged += new System.EventHandler(this.comboBoxMethodForNormalization_SelectedIndexChanged); // + // tabPageSingleCellAnalysis + // + this.tabPageSingleCellAnalysis.Controls.Add(this.checkBoxWellClassAsPhenoClass); + this.tabPageSingleCellAnalysis.Controls.Add(this.PanelForMultipleClassesSelection); + this.tabPageSingleCellAnalysis.Controls.Add(this.buttonToSelectWellsFromClass); + this.tabPageSingleCellAnalysis.Controls.Add(this.listBoxSelectedWells); + this.tabPageSingleCellAnalysis.Controls.Add(this.buttonDisplayWellsSelectionData); + this.tabPageSingleCellAnalysis.Location = new System.Drawing.Point(4, 22); + this.tabPageSingleCellAnalysis.Name = "tabPageSingleCellAnalysis"; + this.tabPageSingleCellAnalysis.Padding = new System.Windows.Forms.Padding(3); + this.tabPageSingleCellAnalysis.Size = new System.Drawing.Size(1169, 238); + this.tabPageSingleCellAnalysis.TabIndex = 9; + this.tabPageSingleCellAnalysis.Text = "Single Cell Analysis"; + this.tabPageSingleCellAnalysis.UseVisualStyleBackColor = true; + // + // checkBoxWellClassAsPhenoClass + // + this.checkBoxWellClassAsPhenoClass.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.checkBoxWellClassAsPhenoClass.AutoSize = true; + this.checkBoxWellClassAsPhenoClass.Location = new System.Drawing.Point(989, 171); + this.checkBoxWellClassAsPhenoClass.Name = "checkBoxWellClassAsPhenoClass"; + this.checkBoxWellClassAsPhenoClass.Size = new System.Drawing.Size(170, 17); + this.checkBoxWellClassAsPhenoClass.TabIndex = 32; + this.checkBoxWellClassAsPhenoClass.Text = "Well class as phenotypic class"; + this.toolTip.SetToolTip(this.checkBoxWellClassAsPhenoClass, "The well class will be associated to each object as its own phenotypic class"); + this.checkBoxWellClassAsPhenoClass.UseVisualStyleBackColor = true; + // + // PanelForMultipleClassesSelection + // + this.PanelForMultipleClassesSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.PanelForMultipleClassesSelection.AutoScroll = true; + this.PanelForMultipleClassesSelection.Location = new System.Drawing.Point(6, 6); + this.PanelForMultipleClassesSelection.Name = "PanelForMultipleClassesSelection"; + this.PanelForMultipleClassesSelection.Size = new System.Drawing.Size(176, 194); + this.PanelForMultipleClassesSelection.TabIndex = 31; + // + // buttonToSelectWellsFromClass + // + this.buttonToSelectWellsFromClass.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonToSelectWellsFromClass.Location = new System.Drawing.Point(6, 206); + this.buttonToSelectWellsFromClass.Name = "buttonToSelectWellsFromClass"; + this.buttonToSelectWellsFromClass.Size = new System.Drawing.Size(121, 26); + this.buttonToSelectWellsFromClass.TabIndex = 29; + this.buttonToSelectWellsFromClass.Text = "Add wells from class"; + this.buttonToSelectWellsFromClass.UseVisualStyleBackColor = true; + this.buttonToSelectWellsFromClass.Click += new System.EventHandler(this.buttonToSelectWellsFromClass_Click); + // + // listBoxSelectedWells + // + this.listBoxSelectedWells.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.listBoxSelectedWells.FormattingEnabled = true; + this.listBoxSelectedWells.HorizontalScrollbar = true; + this.listBoxSelectedWells.Location = new System.Drawing.Point(188, 5); + this.listBoxSelectedWells.Name = "listBoxSelectedWells"; + this.listBoxSelectedWells.Size = new System.Drawing.Size(504, 225); + this.listBoxSelectedWells.TabIndex = 1; + this.toolTip.SetToolTip(this.listBoxSelectedWells, "List of wells that will be used for the single cell based analysis"); + this.listBoxSelectedWells.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listBoxSelectedWells_MouseDown); + // + // buttonDisplayWellsSelectionData + // + this.buttonDisplayWellsSelectionData.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDisplayWellsSelectionData.Enabled = false; + this.buttonDisplayWellsSelectionData.Location = new System.Drawing.Point(988, 194); + this.buttonDisplayWellsSelectionData.Name = "buttonDisplayWellsSelectionData"; + this.buttonDisplayWellsSelectionData.Size = new System.Drawing.Size(172, 39); + this.buttonDisplayWellsSelectionData.TabIndex = 0; + this.buttonDisplayWellsSelectionData.Text = "Cell-by-Cell Analysis"; + this.buttonDisplayWellsSelectionData.UseVisualStyleBackColor = true; + this.buttonDisplayWellsSelectionData.Click += new System.EventHandler(this.buttonDisplayWellsSelectionData_Click); + // // tabPageClassification // - this.tabPageClassification.Controls.Add(this.groupBox6); this.tabPageClassification.Controls.Add(this.groupBox12); this.tabPageClassification.Controls.Add(this.groupBox11); this.tabPageClassification.ImageIndex = 3; this.tabPageClassification.Location = new System.Drawing.Point(4, 22); this.tabPageClassification.Name = "tabPageClassification"; this.tabPageClassification.Padding = new System.Windows.Forms.Padding(3); - this.tabPageClassification.Size = new System.Drawing.Size(1208, 277); + this.tabPageClassification.Size = new System.Drawing.Size(1169, 238); this.tabPageClassification.TabIndex = 4; - this.tabPageClassification.Text = "Classification & Clustering"; + this.tabPageClassification.Text = "Clustering & Classification"; this.tabPageClassification.UseVisualStyleBackColor = true; // - // groupBox6 - // - this.groupBox6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.groupBox6.Controls.Add(this.buttonStartManualSelection); - this.groupBox6.Controls.Add(this.numericUpDownManualThreshold); - this.groupBox6.Controls.Add(this.radioButtonManualLowerThan); - this.groupBox6.Controls.Add(this.comboBoxManualClassToBeAnalyzed); - this.groupBox6.Controls.Add(this.radioButtonManualHigherThan); - this.groupBox6.Controls.Add(this.label14); - this.groupBox6.Controls.Add(this.label13); - this.groupBox6.Controls.Add(this.richTextBoxForManualSelection); - this.groupBox6.Controls.Add(this.comboBoxdescriptorToBeAnalyzed); - this.groupBox6.Location = new System.Drawing.Point(278, 6); - this.groupBox6.Name = "groupBox6"; - this.groupBox6.Size = new System.Drawing.Size(263, 268); - this.groupBox6.TabIndex = 28; - this.groupBox6.TabStop = false; - this.groupBox6.Text = "Manual Selection"; - // - // buttonStartManualSelection - // - this.buttonStartManualSelection.Location = new System.Drawing.Point(69, 228); - this.buttonStartManualSelection.Name = "buttonStartManualSelection"; - this.buttonStartManualSelection.Size = new System.Drawing.Size(125, 34); - this.buttonStartManualSelection.TabIndex = 28; - this.buttonStartManualSelection.Text = "Select"; - this.buttonStartManualSelection.UseVisualStyleBackColor = true; - this.buttonStartManualSelection.Click += new System.EventHandler(this.buttonStartManualSelection_Click); - // - // numericUpDownManualThreshold - // - this.numericUpDownManualThreshold.DecimalPlaces = 3; - this.numericUpDownManualThreshold.Location = new System.Drawing.Point(77, 53); - this.numericUpDownManualThreshold.Maximum = new decimal(new int[] { - 1316134912, - 2328, - 0, - 0}); - this.numericUpDownManualThreshold.Minimum = new decimal(new int[] { - 1316134912, - 2328, - 0, - -2147483648}); - this.numericUpDownManualThreshold.Name = "numericUpDownManualThreshold"; - this.numericUpDownManualThreshold.Size = new System.Drawing.Size(97, 20); - this.numericUpDownManualThreshold.TabIndex = 27; - // - // radioButtonManualLowerThan - // - this.radioButtonManualLowerThan.AutoSize = true; - this.radioButtonManualLowerThan.Location = new System.Drawing.Point(16, 53); - this.radioButtonManualLowerThan.Name = "radioButtonManualLowerThan"; - this.radioButtonManualLowerThan.Size = new System.Drawing.Size(54, 17); - this.radioButtonManualLowerThan.TabIndex = 6; - this.radioButtonManualLowerThan.TabStop = true; - this.radioButtonManualLowerThan.Text = "Lower"; - this.radioButtonManualLowerThan.UseVisualStyleBackColor = true; - // - // comboBoxManualClassToBeAnalyzed - // - this.comboBoxManualClassToBeAnalyzed.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; - this.comboBoxManualClassToBeAnalyzed.FormattingEnabled = true; - this.comboBoxManualClassToBeAnalyzed.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxManualClassToBeAnalyzed.Location = new System.Drawing.Point(113, 80); - this.comboBoxManualClassToBeAnalyzed.Name = "comboBoxManualClassToBeAnalyzed"; - this.comboBoxManualClassToBeAnalyzed.Size = new System.Drawing.Size(133, 21); - this.comboBoxManualClassToBeAnalyzed.TabIndex = 26; - this.comboBoxManualClassToBeAnalyzed.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxManualClassToBeAnalyzed_DrawItem); - // - // radioButtonManualHigherThan - // - this.radioButtonManualHigherThan.AutoSize = true; - this.radioButtonManualHigherThan.Checked = true; - this.radioButtonManualHigherThan.Location = new System.Drawing.Point(190, 53); - this.radioButtonManualHigherThan.Name = "radioButtonManualHigherThan"; - this.radioButtonManualHigherThan.Size = new System.Drawing.Size(56, 17); - this.radioButtonManualHigherThan.TabIndex = 2; - this.radioButtonManualHigherThan.TabStop = true; - this.radioButtonManualHigherThan.Text = "Higher"; - this.radioButtonManualHigherThan.UseVisualStyleBackColor = true; - // - // label14 - // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(13, 23); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(35, 13); - this.label14.TabIndex = 22; - this.label14.Text = "Desc."; - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(24, 84); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(83, 13); - this.label13.TabIndex = 22; - this.label13.Text = "To Be Classified"; - // - // richTextBoxForManualSelection - // - this.richTextBoxForManualSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.richTextBoxForManualSelection.Location = new System.Drawing.Point(6, 110); - this.richTextBoxForManualSelection.Name = "richTextBoxForManualSelection"; - this.richTextBoxForManualSelection.ReadOnly = true; - this.richTextBoxForManualSelection.Size = new System.Drawing.Size(251, 112); - this.richTextBoxForManualSelection.TabIndex = 0; - this.richTextBoxForManualSelection.Text = ""; - // - // comboBoxdescriptorToBeAnalyzed - // - this.comboBoxdescriptorToBeAnalyzed.FormattingEnabled = true; - this.comboBoxdescriptorToBeAnalyzed.Location = new System.Drawing.Point(64, 20); - this.comboBoxdescriptorToBeAnalyzed.Name = "comboBoxdescriptorToBeAnalyzed"; - this.comboBoxdescriptorToBeAnalyzed.Size = new System.Drawing.Size(182, 21); - this.comboBoxdescriptorToBeAnalyzed.TabIndex = 19; - this.comboBoxdescriptorToBeAnalyzed.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxdescriptorToBeAnalyzed_DrawItem); - this.comboBoxdescriptorToBeAnalyzed.DropDown += new System.EventHandler(this.comboBoxdescriptorToBeAnalyzed_DropDown); - // // groupBox12 // this.groupBox12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.groupBox12.Controls.Add(this.radioButtonClusterFullScreen); - this.groupBox12.Controls.Add(this.radioButtonClusterPlateByPlate); - this.groupBox12.Controls.Add(this.buttonCluster); - this.groupBox12.Controls.Add(this.label10); - this.groupBox12.Controls.Add(this.checkBoxAutomatedClusterNumber); + this.groupBox12.Controls.Add(this.ButtonClustering); this.groupBox12.Controls.Add(this.richTextBoxInfoClustering); - this.groupBox12.Controls.Add(this.comboBoxClusteringMethod); - this.groupBox12.Controls.Add(this.numericUpDownClusterNumber); this.groupBox12.Location = new System.Drawing.Point(9, 6); this.groupBox12.Name = "groupBox12"; - this.groupBox12.Size = new System.Drawing.Size(263, 268); + this.groupBox12.Size = new System.Drawing.Size(406, 229); this.groupBox12.TabIndex = 5; this.groupBox12.TabStop = false; this.groupBox12.Text = "Clustering"; // - // radioButtonClusterFullScreen - // - this.radioButtonClusterFullScreen.AutoSize = true; - this.radioButtonClusterFullScreen.Checked = true; - this.radioButtonClusterFullScreen.Location = new System.Drawing.Point(153, 53); - this.radioButtonClusterFullScreen.Name = "radioButtonClusterFullScreen"; - this.radioButtonClusterFullScreen.Size = new System.Drawing.Size(78, 17); - this.radioButtonClusterFullScreen.TabIndex = 28; - this.radioButtonClusterFullScreen.TabStop = true; - this.radioButtonClusterFullScreen.Text = "Full Screen"; - this.radioButtonClusterFullScreen.UseVisualStyleBackColor = true; - // - // radioButtonClusterPlateByPlate - // - this.radioButtonClusterPlateByPlate.AutoSize = true; - this.radioButtonClusterPlateByPlate.Location = new System.Drawing.Point(36, 53); - this.radioButtonClusterPlateByPlate.Name = "radioButtonClusterPlateByPlate"; - this.radioButtonClusterPlateByPlate.Size = new System.Drawing.Size(91, 17); - this.radioButtonClusterPlateByPlate.TabIndex = 27; - this.radioButtonClusterPlateByPlate.Text = "Plate By Plate"; - this.radioButtonClusterPlateByPlate.UseVisualStyleBackColor = true; - this.radioButtonClusterPlateByPlate.CheckedChanged += new System.EventHandler(this.radioButtonClusterPlateByPlate_CheckedChanged); - // - // buttonCluster - // - this.buttonCluster.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonCluster.Enabled = false; - this.buttonCluster.Location = new System.Drawing.Point(58, 228); - this.buttonCluster.Name = "buttonCluster"; - this.buttonCluster.Size = new System.Drawing.Size(146, 34); - this.buttonCluster.TabIndex = 1; - this.buttonCluster.Text = "Cluster"; - this.buttonCluster.UseVisualStyleBackColor = true; - this.buttonCluster.Click += new System.EventHandler(this.buttonCluster_Click); - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(6, 87); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(79, 13); - this.label10.TabIndex = 27; - this.label10.Text = "Cluster Number"; - // - // checkBoxAutomatedClusterNumber - // - this.checkBoxAutomatedClusterNumber.AutoSize = true; - this.checkBoxAutomatedClusterNumber.Location = new System.Drawing.Point(176, 86); - this.checkBoxAutomatedClusterNumber.Name = "checkBoxAutomatedClusterNumber"; - this.checkBoxAutomatedClusterNumber.Size = new System.Drawing.Size(77, 17); - this.checkBoxAutomatedClusterNumber.TabIndex = 22; - this.checkBoxAutomatedClusterNumber.Text = "Automated"; - this.checkBoxAutomatedClusterNumber.UseVisualStyleBackColor = true; - this.checkBoxAutomatedClusterNumber.CheckedChanged += new System.EventHandler(this.checkBoxAutomatedClusterNumber_CheckedChanged); + // ButtonClustering + // + this.ButtonClustering.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.ButtonClustering.Location = new System.Drawing.Point(7, 189); + this.ButtonClustering.Name = "ButtonClustering"; + this.ButtonClustering.Size = new System.Drawing.Size(88, 34); + this.ButtonClustering.TabIndex = 29; + this.ButtonClustering.Text = "Clustering"; + this.ButtonClustering.UseVisualStyleBackColor = true; + this.ButtonClustering.Click += new System.EventHandler(this.buttonClustering_Click); // // richTextBoxInfoClustering // this.richTextBoxInfoClustering.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - this.richTextBoxInfoClustering.Location = new System.Drawing.Point(6, 110); + this.richTextBoxInfoClustering.Location = new System.Drawing.Point(106, 10); this.richTextBoxInfoClustering.Name = "richTextBoxInfoClustering"; this.richTextBoxInfoClustering.ReadOnly = true; - this.richTextBoxInfoClustering.Size = new System.Drawing.Size(251, 112); + this.richTextBoxInfoClustering.Size = new System.Drawing.Size(294, 213); this.richTextBoxInfoClustering.TabIndex = 0; this.richTextBoxInfoClustering.Text = ""; - this.richTextBoxInfoClustering.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxInfoClustering_LinkClicked); - // - // comboBoxClusteringMethod - // - this.comboBoxClusteringMethod.FormattingEnabled = true; - this.comboBoxClusteringMethod.Items.AddRange(new object[] { - "K-Means", - "EM", - "Hierarchical"}); - this.comboBoxClusteringMethod.Location = new System.Drawing.Point(40, 20); - this.comboBoxClusteringMethod.Name = "comboBoxClusteringMethod"; - this.comboBoxClusteringMethod.Size = new System.Drawing.Size(182, 21); - this.comboBoxClusteringMethod.TabIndex = 19; - this.comboBoxClusteringMethod.SelectedIndexChanged += new System.EventHandler(this.comboBoxClusteringMethod_SelectedIndexChanged); - // - // numericUpDownClusterNumber - // - this.numericUpDownClusterNumber.Location = new System.Drawing.Point(91, 84); - this.numericUpDownClusterNumber.Maximum = new decimal(new int[] { - 10, - 0, - 0, - 0}); - this.numericUpDownClusterNumber.Minimum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.numericUpDownClusterNumber.Name = "numericUpDownClusterNumber"; - this.numericUpDownClusterNumber.Size = new System.Drawing.Size(66, 20); - this.numericUpDownClusterNumber.TabIndex = 21; - this.numericUpDownClusterNumber.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); // // groupBox11 // this.groupBox11.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); + this.groupBox11.Controls.Add(this.panelTMPForFeedBack); + this.groupBox11.Controls.Add(this.buttonNewClassificationProcess); this.groupBox11.Controls.Add(this.button_Trees); this.groupBox11.Controls.Add(this.radioButtonClassifGlobal); this.groupBox11.Controls.Add(this.comboBoxNeutralClassForClassif); @@ -1157,22 +1018,41 @@ private void InitializeComponent() this.groupBox11.Controls.Add(this.label5); this.groupBox11.Controls.Add(this.richTextBoxInfoClassif); this.groupBox11.Controls.Add(this.comboBoxCLassificationMethod); - this.groupBox11.Location = new System.Drawing.Point(547, 6); + this.groupBox11.Location = new System.Drawing.Point(421, 6); this.groupBox11.Name = "groupBox11"; - this.groupBox11.Size = new System.Drawing.Size(263, 268); + this.groupBox11.Size = new System.Drawing.Size(739, 229); this.groupBox11.TabIndex = 5; this.groupBox11.TabStop = false; this.groupBox11.Text = "Classification"; // + // panelTMPForFeedBack + // + this.panelTMPForFeedBack.Location = new System.Drawing.Point(379, 16); + this.panelTMPForFeedBack.Name = "panelTMPForFeedBack"; + this.panelTMPForFeedBack.Size = new System.Drawing.Size(354, 205); + this.panelTMPForFeedBack.TabIndex = 33; + // + // buttonNewClassificationProcess + // + this.buttonNewClassificationProcess.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonNewClassificationProcess.Enabled = false; + this.buttonNewClassificationProcess.Location = new System.Drawing.Point(275, 189); + this.buttonNewClassificationProcess.Name = "buttonNewClassificationProcess"; + this.buttonNewClassificationProcess.Size = new System.Drawing.Size(88, 34); + this.buttonNewClassificationProcess.TabIndex = 28; + this.buttonNewClassificationProcess.Text = "New Classification"; + this.buttonNewClassificationProcess.UseVisualStyleBackColor = true; + this.buttonNewClassificationProcess.Click += new System.EventHandler(this.buttonNewClassificationProcess_Click); + // // button_Trees // - this.button_Trees.Location = new System.Drawing.Point(140, 228); + this.button_Trees.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button_Trees.Location = new System.Drawing.Point(140, 188); this.button_Trees.Name = "button_Trees"; this.button_Trees.Size = new System.Drawing.Size(85, 34); this.button_Trees.TabIndex = 27; this.button_Trees.Text = "Vizualize Tree"; this.button_Trees.UseVisualStyleBackColor = true; - this.button_Trees.Click += new System.EventHandler(this.button_Trees_Click); // // radioButtonClassifGlobal // @@ -1190,8 +1070,8 @@ private void InitializeComponent() this.comboBoxNeutralClassForClassif.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxNeutralClassForClassif.FormattingEnabled = true; this.comboBoxNeutralClassForClassif.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", + "0", + "1", "2", "3", "4", @@ -1210,7 +1090,7 @@ private void InitializeComponent() // this.buttonStartClassification.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.buttonStartClassification.Enabled = false; - this.buttonStartClassification.Location = new System.Drawing.Point(38, 228); + this.buttonStartClassification.Location = new System.Drawing.Point(38, 189); this.buttonStartClassification.Name = "buttonStartClassification"; this.buttonStartClassification.Size = new System.Drawing.Size(88, 34); this.buttonStartClassification.TabIndex = 1; @@ -1246,7 +1126,7 @@ private void InitializeComponent() this.richTextBoxInfoClassif.Location = new System.Drawing.Point(6, 110); this.richTextBoxInfoClassif.Name = "richTextBoxInfoClassif"; this.richTextBoxInfoClassif.ReadOnly = true; - this.richTextBoxInfoClassif.Size = new System.Drawing.Size(251, 112); + this.richTextBoxInfoClassif.Size = new System.Drawing.Size(251, 73); this.richTextBoxInfoClassif.TabIndex = 0; this.richTextBoxInfoClassif.Text = ""; this.richTextBoxInfoClassif.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxInfoClassif_LinkClicked); @@ -1274,9 +1154,9 @@ private void InitializeComponent() this.tabPageExport.Location = new System.Drawing.Point(4, 22); this.tabPageExport.Name = "tabPageExport"; this.tabPageExport.Padding = new System.Windows.Forms.Padding(3); - this.tabPageExport.Size = new System.Drawing.Size(1208, 277); + this.tabPageExport.Size = new System.Drawing.Size(1169, 238); this.tabPageExport.TabIndex = 5; - this.tabPageExport.Text = "Report Export"; + this.tabPageExport.Text = "Report Export*"; this.tabPageExport.UseVisualStyleBackColor = true; // // splitContainerExport @@ -1284,7 +1164,7 @@ private void InitializeComponent() this.splitContainerExport.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.splitContainerExport.Location = new System.Drawing.Point(6, 13); + this.splitContainerExport.Location = new System.Drawing.Point(6, 6); this.splitContainerExport.Name = "splitContainerExport"; // // splitContainerExport.Panel1 @@ -1298,7 +1178,7 @@ private void InitializeComponent() this.splitContainerExport.Panel2.Controls.Add(this.checkBoxExportPlateFormat); this.splitContainerExport.Panel2.Controls.Add(this.groupBox3); this.splitContainerExport.Panel2.Controls.Add(this.groupBox4); - this.splitContainerExport.Size = new System.Drawing.Size(1033, 261); + this.splitContainerExport.Size = new System.Drawing.Size(1033, 226); this.splitContainerExport.SplitterDistance = 402; this.splitContainerExport.TabIndex = 17; // @@ -1311,7 +1191,7 @@ private void InitializeComponent() this.groupBox5.Controls.Add(this.richTextBoxForScreeningInformation); this.groupBox5.Location = new System.Drawing.Point(3, 8); this.groupBox5.Name = "groupBox5"; - this.groupBox5.Size = new System.Drawing.Size(396, 250); + this.groupBox5.Size = new System.Drawing.Size(396, 192); this.groupBox5.TabIndex = 8; this.groupBox5.TabStop = false; this.groupBox5.Text = " "; @@ -1335,7 +1215,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.richTextBoxForScreeningInformation.Location = new System.Drawing.Point(6, 23); this.richTextBoxForScreeningInformation.Name = "richTextBoxForScreeningInformation"; - this.richTextBoxForScreeningInformation.Size = new System.Drawing.Size(384, 221); + this.richTextBoxForScreeningInformation.Size = new System.Drawing.Size(384, 163); this.richTextBoxForScreeningInformation.TabIndex = 0; this.richTextBoxForScreeningInformation.Text = ""; // @@ -1345,7 +1225,7 @@ private void InitializeComponent() this.checkBoxExportFullScreen.AutoSize = true; this.checkBoxExportFullScreen.Checked = true; this.checkBoxExportFullScreen.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxExportFullScreen.Location = new System.Drawing.Point(163, 8); + this.checkBoxExportFullScreen.Location = new System.Drawing.Point(144, 10); this.checkBoxExportFullScreen.Name = "checkBoxExportFullScreen"; this.checkBoxExportFullScreen.Size = new System.Drawing.Size(79, 17); this.checkBoxExportFullScreen.TabIndex = 9; @@ -1354,11 +1234,12 @@ private void InitializeComponent() // // treeViewSelectionForExport // - this.treeViewSelectionForExport.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.treeViewSelectionForExport.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.treeViewSelectionForExport.CheckBoxes = true; this.treeViewSelectionForExport.FullRowSelect = true; - this.treeViewSelectionForExport.Location = new System.Drawing.Point(67, 111); + this.treeViewSelectionForExport.Location = new System.Drawing.Point(81, 120); this.treeViewSelectionForExport.Name = "treeViewSelectionForExport"; treeNode1.Name = "NodeClassifTree"; treeNode1.Text = "Classification Tree"; @@ -1391,7 +1272,7 @@ private void InitializeComponent() treeNode6, treeNode8, treeNode10}); - this.treeViewSelectionForExport.Size = new System.Drawing.Size(450, 141); + this.treeViewSelectionForExport.Size = new System.Drawing.Size(417, 103); this.treeViewSelectionForExport.TabIndex = 16; // // checkBoxExportPlateFormat @@ -1400,7 +1281,7 @@ private void InitializeComponent() this.checkBoxExportPlateFormat.AutoSize = true; this.checkBoxExportPlateFormat.Checked = true; this.checkBoxExportPlateFormat.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxExportPlateFormat.Location = new System.Drawing.Point(376, 7); + this.checkBoxExportPlateFormat.Location = new System.Drawing.Point(357, 8); this.checkBoxExportPlateFormat.Name = "checkBoxExportPlateFormat"; this.checkBoxExportPlateFormat.Size = new System.Drawing.Size(85, 17); this.checkBoxExportPlateFormat.TabIndex = 10; @@ -1409,11 +1290,11 @@ private void InitializeComponent() // // groupBox3 // - this.groupBox3.Anchor = System.Windows.Forms.AnchorStyles.None; + this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); this.groupBox3.Controls.Add(this.pictureBox1); - this.groupBox3.Location = new System.Drawing.Point(99, 22); + this.groupBox3.Location = new System.Drawing.Point(81, 24); this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(199, 83); + this.groupBox3.Size = new System.Drawing.Size(197, 89); this.groupBox3.TabIndex = 5; this.groupBox3.TabStop = false; // @@ -1422,9 +1303,9 @@ private void InitializeComponent() this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox1.Image = global::HCSAnalyzer.Properties.Resources.Capture; - this.pictureBox1.Location = new System.Drawing.Point(13, 24); + this.pictureBox1.Location = new System.Drawing.Point(16, 24); this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(170, 43); + this.pictureBox1.Size = new System.Drawing.Size(168, 43); this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; this.pictureBox1.TabIndex = 4; this.pictureBox1.TabStop = false; @@ -1433,9 +1314,9 @@ private void InitializeComponent() // this.groupBox4.Anchor = System.Windows.Forms.AnchorStyles.None; this.groupBox4.Controls.Add(this.pictureBox2); - this.groupBox4.Location = new System.Drawing.Point(316, 18); + this.groupBox4.Location = new System.Drawing.Point(298, 24); this.groupBox4.Name = "groupBox4"; - this.groupBox4.Size = new System.Drawing.Size(199, 87); + this.groupBox4.Size = new System.Drawing.Size(199, 89); this.groupBox4.TabIndex = 6; this.groupBox4.TabStop = false; // @@ -1444,7 +1325,7 @@ private void InitializeComponent() this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox2.Image = global::HCSAnalyzer.Properties.Resources.Capture1; - this.pictureBox2.Location = new System.Drawing.Point(13, 24); + this.pictureBox2.Location = new System.Drawing.Point(16, 21); this.pictureBox2.Name = "pictureBox2"; this.pictureBox2.Size = new System.Drawing.Size(173, 46); this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; @@ -1455,7 +1336,7 @@ private void InitializeComponent() // this.buttonExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonExport.Enabled = false; - this.buttonExport.Location = new System.Drawing.Point(1078, 232); + this.buttonExport.Location = new System.Drawing.Point(1041, 194); this.buttonExport.Name = "buttonExport"; this.buttonExport.Size = new System.Drawing.Size(124, 39); this.buttonExport.TabIndex = 0; @@ -1463,86 +1344,6 @@ private void InitializeComponent() this.buttonExport.UseVisualStyleBackColor = true; this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); // - // tabPageWellsSelection - // - this.tabPageWellsSelection.Controls.Add(this.buttonToSelectWellsFromClass); - this.tabPageWellsSelection.Controls.Add(this.comboBoxClassForWellSelection); - this.tabPageWellsSelection.Controls.Add(this.listBoxSelectedWells); - this.tabPageWellsSelection.Controls.Add(this.buttonDisplayWellsSelectionData); - this.tabPageWellsSelection.Location = new System.Drawing.Point(4, 22); - this.tabPageWellsSelection.Name = "tabPageWellsSelection"; - this.tabPageWellsSelection.Padding = new System.Windows.Forms.Padding(3); - this.tabPageWellsSelection.Size = new System.Drawing.Size(1208, 277); - this.tabPageWellsSelection.TabIndex = 9; - this.tabPageWellsSelection.Text = "Cell-by-cell Analysis"; - this.tabPageWellsSelection.UseVisualStyleBackColor = true; - // - // buttonToSelectWellsFromClass - // - this.buttonToSelectWellsFromClass.Location = new System.Drawing.Point(320, 52); - this.buttonToSelectWellsFromClass.Name = "buttonToSelectWellsFromClass"; - this.buttonToSelectWellsFromClass.Size = new System.Drawing.Size(133, 33); - this.buttonToSelectWellsFromClass.TabIndex = 29; - this.buttonToSelectWellsFromClass.Text = "Add wells From class"; - this.buttonToSelectWellsFromClass.UseVisualStyleBackColor = true; - this.buttonToSelectWellsFromClass.Click += new System.EventHandler(this.buttonToSelectWellsFromClass_Click); - // - // comboBoxClassForWellSelection - // - this.comboBoxClassForWellSelection.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; - this.comboBoxClassForWellSelection.FormattingEnabled = true; - this.comboBoxClassForWellSelection.Items.AddRange(new object[] { - "Positive (0)", - "Negative (1)", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxClassForWellSelection.Location = new System.Drawing.Point(320, 101); - this.comboBoxClassForWellSelection.Name = "comboBoxClassForWellSelection"; - this.comboBoxClassForWellSelection.Size = new System.Drawing.Size(133, 21); - this.comboBoxClassForWellSelection.TabIndex = 28; - this.comboBoxClassForWellSelection.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBoxClassForWellSelection_DrawItem); - // - // listBoxSelectedWells - // - this.listBoxSelectedWells.ContextMenuStrip = this.contextMenuStripForListSelectedWells; - this.listBoxSelectedWells.FormattingEnabled = true; - this.listBoxSelectedWells.HorizontalScrollbar = true; - this.listBoxSelectedWells.Location = new System.Drawing.Point(9, 6); - this.listBoxSelectedWells.Name = "listBoxSelectedWells"; - this.listBoxSelectedWells.Size = new System.Drawing.Size(291, 264); - this.listBoxSelectedWells.TabIndex = 1; - // - // contextMenuStripForListSelectedWells - // - this.contextMenuStripForListSelectedWells.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.clearToolStripMenuItem}); - this.contextMenuStripForListSelectedWells.Name = "contextMenuStripForListSelectedWells"; - this.contextMenuStripForListSelectedWells.Size = new System.Drawing.Size(102, 26); - // - // clearToolStripMenuItem - // - this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; - this.clearToolStripMenuItem.Size = new System.Drawing.Size(101, 22); - this.clearToolStripMenuItem.Text = "Clear"; - this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click_1); - // - // buttonDisplayWellsSelectionData - // - this.buttonDisplayWellsSelectionData.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonDisplayWellsSelectionData.Location = new System.Drawing.Point(1063, 230); - this.buttonDisplayWellsSelectionData.Name = "buttonDisplayWellsSelectionData"; - this.buttonDisplayWellsSelectionData.Size = new System.Drawing.Size(139, 39); - this.buttonDisplayWellsSelectionData.TabIndex = 0; - this.buttonDisplayWellsSelectionData.Text = "Cell-by-Cell Analysis"; - this.buttonDisplayWellsSelectionData.UseVisualStyleBackColor = true; - this.buttonDisplayWellsSelectionData.Click += new System.EventHandler(this.buttonDisplayWellsSelectionData_Click); - // // imageListForTab // this.imageListForTab.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListForTab.ImageStream"))); @@ -1561,24 +1362,18 @@ private void InitializeComponent() this.panelForTools.Controls.Add(this.label1); this.panelForTools.Controls.Add(this.comboBoxClass); this.panelForTools.Controls.Add(this.labelNumClasses); - this.panelForTools.Controls.Add(this.buttonGlobalOnlySelected); - this.panelForTools.Controls.Add(this.checkBoxDisplayClasses); - this.panelForTools.Controls.Add(this.buttonSizeIncrease); - this.panelForTools.Controls.Add(this.buttonSizeDecrease); - this.panelForTools.Controls.Add(this.checkBoxApplyToAllPlates); this.panelForTools.Controls.Add(this.labelMax); this.panelForTools.Controls.Add(this.panelForLUT); - this.panelForTools.Controls.Add(this.buttonGlobalSelection); this.panelForTools.Controls.Add(this.labelMin); - this.panelForTools.Location = new System.Drawing.Point(0, 31); + this.panelForTools.Location = new System.Drawing.Point(5, 3); this.panelForTools.Name = "panelForTools"; - this.panelForTools.Size = new System.Drawing.Size(166, 392); + this.panelForTools.Size = new System.Drawing.Size(119, 392); this.panelForTools.TabIndex = 34; // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 343); + this.label1.Location = new System.Drawing.Point(7, 220); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(77, 13); this.label1.TabIndex = 32; @@ -1588,19 +1383,7 @@ private void InitializeComponent() // this.comboBoxClass.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.comboBoxClass.FormattingEnabled = true; - this.comboBoxClass.Items.AddRange(new object[] { - "Unselected (-1)", - "Positive (0)", - "Negative (1)", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9"}); - this.comboBoxClass.Location = new System.Drawing.Point(12, 359); + this.comboBoxClass.Location = new System.Drawing.Point(7, 236); this.comboBoxClass.Name = "comboBoxClass"; this.comboBoxClass.Size = new System.Drawing.Size(101, 21); this.comboBoxClass.TabIndex = 31; @@ -1610,73 +1393,17 @@ private void InitializeComponent() // labelNumClasses // this.labelNumClasses.AutoSize = true; - this.labelNumClasses.Location = new System.Drawing.Point(119, 362); + this.labelNumClasses.Location = new System.Drawing.Point(10, 267); this.labelNumClasses.Name = "labelNumClasses"; this.labelNumClasses.Size = new System.Drawing.Size(28, 13); this.labelNumClasses.TabIndex = 33; this.labelNumClasses.Text = "###"; // - // buttonGlobalOnlySelected - // - this.buttonGlobalOnlySelected.Location = new System.Drawing.Point(52, 39); - this.buttonGlobalOnlySelected.Name = "buttonGlobalOnlySelected"; - this.buttonGlobalOnlySelected.Size = new System.Drawing.Size(61, 54); - this.buttonGlobalOnlySelected.TabIndex = 3; - this.buttonGlobalOnlySelected.Text = "Global only selected"; - this.buttonGlobalOnlySelected.UseVisualStyleBackColor = true; - this.buttonGlobalOnlySelected.Click += new System.EventHandler(this.buttonGlobalOnlySelected_Click); - // - // checkBoxDisplayClasses - // - this.checkBoxDisplayClasses.Appearance = System.Windows.Forms.Appearance.Button; - this.checkBoxDisplayClasses.AutoSize = true; - this.checkBoxDisplayClasses.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.checkBoxDisplayClasses.Location = new System.Drawing.Point(20, 188); - this.checkBoxDisplayClasses.Name = "checkBoxDisplayClasses"; - this.checkBoxDisplayClasses.Size = new System.Drawing.Size(78, 23); - this.checkBoxDisplayClasses.TabIndex = 5; - this.checkBoxDisplayClasses.Text = "Display class"; - this.checkBoxDisplayClasses.UseVisualStyleBackColor = true; - this.checkBoxDisplayClasses.CheckedChanged += new System.EventHandler(this.checkBoxDisplayClasses_CheckedChanged); - // - // buttonSizeIncrease - // - this.buttonSizeIncrease.Image = global::HCSAnalyzer.Properties.Resources.zoom_in_41; - this.buttonSizeIncrease.Location = new System.Drawing.Point(61, 263); - this.buttonSizeIncrease.Name = "buttonSizeIncrease"; - this.buttonSizeIncrease.Size = new System.Drawing.Size(48, 40); - this.buttonSizeIncrease.TabIndex = 7; - this.buttonSizeIncrease.UseVisualStyleBackColor = true; - this.buttonSizeIncrease.Click += new System.EventHandler(this.buttonSizeIncrease_Click); - // - // buttonSizeDecrease - // - this.buttonSizeDecrease.Image = global::HCSAnalyzer.Properties.Resources.zoom_out_41; - this.buttonSizeDecrease.Location = new System.Drawing.Point(10, 263); - this.buttonSizeDecrease.Name = "buttonSizeDecrease"; - this.buttonSizeDecrease.Size = new System.Drawing.Size(45, 40); - this.buttonSizeDecrease.TabIndex = 6; - this.buttonSizeDecrease.UseVisualStyleBackColor = true; - this.buttonSizeDecrease.Click += new System.EventHandler(this.buttonSizeDecrease_Click); - // - // checkBoxApplyToAllPlates - // - this.checkBoxApplyToAllPlates.AutoSize = true; - this.checkBoxApplyToAllPlates.Checked = true; - this.checkBoxApplyToAllPlates.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxApplyToAllPlates.Location = new System.Drawing.Point(6, 125); - this.checkBoxApplyToAllPlates.Name = "checkBoxApplyToAllPlates"; - this.checkBoxApplyToAllPlates.Size = new System.Drawing.Size(108, 17); - this.checkBoxApplyToAllPlates.TabIndex = 4; - this.checkBoxApplyToAllPlates.Text = "Apply to all plates"; - this.checkBoxApplyToAllPlates.UseVisualStyleBackColor = true; - this.checkBoxApplyToAllPlates.CheckedChanged += new System.EventHandler(this.checkBoxApplyToAllPlates_CheckedChanged); - // // labelMax // this.labelMax.AutoSize = true; this.labelMax.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelMax.Location = new System.Drawing.Point(99, 8); + this.labelMax.Location = new System.Drawing.Point(32, 15); this.labelMax.Name = "labelMax"; this.labelMax.Size = new System.Drawing.Size(20, 12); this.labelMax.TabIndex = 10; @@ -1686,28 +1413,19 @@ private void InitializeComponent() // panelForLUT // this.panelForLUT.BackgroundImage = global::HCSAnalyzer.Properties.Resources.LUT; + this.panelForLUT.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.panelForLUT.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.panelForLUT.Location = new System.Drawing.Point(120, 28); + this.panelForLUT.Location = new System.Drawing.Point(47, 35); this.panelForLUT.Name = "panelForLUT"; - this.panelForLUT.Size = new System.Drawing.Size(27, 294); + this.panelForLUT.Size = new System.Drawing.Size(24, 137); this.panelForLUT.TabIndex = 30; this.panelForLUT.Paint += new System.Windows.Forms.PaintEventHandler(this.panelForLUT_Paint); // - // buttonGlobalSelection - // - this.buttonGlobalSelection.Location = new System.Drawing.Point(5, 39); - this.buttonGlobalSelection.Name = "buttonGlobalSelection"; - this.buttonGlobalSelection.Size = new System.Drawing.Size(45, 54); - this.buttonGlobalSelection.TabIndex = 2; - this.buttonGlobalSelection.Text = "Global"; - this.buttonGlobalSelection.UseVisualStyleBackColor = true; - this.buttonGlobalSelection.Click += new System.EventHandler(this.buttonGlobalSelection_Click); - // // labelMin // this.labelMin.AutoSize = true; this.labelMin.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelMin.Location = new System.Drawing.Point(99, 334); + this.labelMin.Location = new System.Drawing.Point(32, 183); this.labelMin.Name = "labelMin"; this.labelMin.Size = new System.Drawing.Size(20, 12); this.labelMin.TabIndex = 11; @@ -1725,9 +1443,9 @@ private void InitializeComponent() this.panelForPlate.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.panelForPlate.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.panelForPlate.Controls.Add(this.pictureBox3); - this.panelForPlate.Location = new System.Drawing.Point(25, 5); + this.panelForPlate.Location = new System.Drawing.Point(28, 5); this.panelForPlate.Name = "panelForPlate"; - this.panelForPlate.Size = new System.Drawing.Size(769, 382); + this.panelForPlate.Size = new System.Drawing.Size(763, 386); this.panelForPlate.TabIndex = 0; this.panelForPlate.Paint += new System.Windows.Forms.PaintEventHandler(this.panelForPlate_Paint); this.panelForPlate.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.panelForPlate_MouseDoubleClick); @@ -1740,7 +1458,7 @@ private void InitializeComponent() // this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox3.Image = global::HCSAnalyzer.Properties.Resources.DarkLogo; - this.pictureBox3.Location = new System.Drawing.Point(638, 258); + this.pictureBox3.Location = new System.Drawing.Point(632, 262); this.pictureBox3.Name = "pictureBox3"; this.pictureBox3.Size = new System.Drawing.Size(124, 117); this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; @@ -1755,15 +1473,15 @@ private void InitializeComponent() this.viewToolStripMenuItem, this.toolStripcomboBoxPlateList, this.visualizationToolStripMenuItem, - this.projectionsToolStripMenuItem, this.StatisticsToolStripMenuItem, + this.hitIdentificationToolStripMenuItem, this.toolStripMenuItemGeneAnalysis, this.betaToolStripMenuItem, this.pluginsToolStripMenuItem, this.aboutToolStripMenuItem}); this.menuStripFile.Location = new System.Drawing.Point(0, 0); this.menuStripFile.Name = "menuStripFile"; - this.menuStripFile.Size = new System.Drawing.Size(1220, 27); + this.menuStripFile.Size = new System.Drawing.Size(1181, 27); this.menuStripFile.TabIndex = 12; this.menuStripFile.Text = "File"; // @@ -1772,7 +1490,6 @@ private void InitializeComponent() this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.importToolStripMenuItem, this.cellByCellToolStripMenuItem, - this.loadScreenToolStripMenuItem, this.generateScreenToolStripMenuItem1, this.toolStripSeparator2, this.exportToolStripMenuItem, @@ -1791,7 +1508,7 @@ private void InitializeComponent() this.importToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.db_comit; this.importToolStripMenuItem.Name = "importToolStripMenuItem"; this.importToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.importToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.importToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.importToolStripMenuItem.Text = "Import Screen"; this.importToolStripMenuItem.ToolTipText = "Load screen from regular format"; this.importToolStripMenuItem.Click += new System.EventHandler(this.importToolStripMenuItem_Click); @@ -1802,7 +1519,7 @@ private void InitializeComponent() this.loadDBToolStripMenuItem, this.generateDBFromCSVToolStripMenuItem}); this.cellByCellToolStripMenuItem.Name = "cellByCellToolStripMenuItem"; - this.cellByCellToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.cellByCellToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.cellByCellToolStripMenuItem.Text = "Cell by Cell"; // // loadDBToolStripMenuItem @@ -1819,31 +1536,21 @@ private void InitializeComponent() this.generateDBFromCSVToolStripMenuItem.Text = "CSV -> DB"; this.generateDBFromCSVToolStripMenuItem.Click += new System.EventHandler(this.generateDBFromCSVToolStripMenuItem_Click); // - // loadScreenToolStripMenuItem - // - this.loadScreenToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.document_open_5; - this.loadScreenToolStripMenuItem.Name = "loadScreenToolStripMenuItem"; - this.loadScreenToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L))); - this.loadScreenToolStripMenuItem.Size = new System.Drawing.Size(271, 22); - this.loadScreenToolStripMenuItem.Text = "Load Histogram Based Screen"; - this.loadScreenToolStripMenuItem.ToolTipText = "Load distributions based screens"; - this.loadScreenToolStripMenuItem.Click += new System.EventHandler(this.loadScreenToolStripMenuItem_Click); - // // generateScreenToolStripMenuItem1 // this.generateScreenToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.univariateToolStripMenuItem, this.multivariateToolStripMenuItem, - this.histogramBasedToolStripMenuItem}); + this.singleCellsSimulatorToolStripMenuItem}); this.generateScreenToolStripMenuItem1.Name = "generateScreenToolStripMenuItem1"; - this.generateScreenToolStripMenuItem1.Size = new System.Drawing.Size(271, 22); + this.generateScreenToolStripMenuItem1.Size = new System.Drawing.Size(185, 22); this.generateScreenToolStripMenuItem1.Text = "Generate Screen"; // // univariateToolStripMenuItem // this.univariateToolStripMenuItem.Name = "univariateToolStripMenuItem"; this.univariateToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); - this.univariateToolStripMenuItem.Size = new System.Drawing.Size(202, 22); + this.univariateToolStripMenuItem.Size = new System.Drawing.Size(262, 22); this.univariateToolStripMenuItem.Text = "Univariate"; this.univariateToolStripMenuItem.Click += new System.EventHandler(this.univariateToolStripMenuItem_Click); // @@ -1852,22 +1559,24 @@ private void InitializeComponent() this.multivariateToolStripMenuItem.Name = "multivariateToolStripMenuItem"; this.multivariateToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt) | System.Windows.Forms.Keys.G))); - this.multivariateToolStripMenuItem.Size = new System.Drawing.Size(202, 22); + this.multivariateToolStripMenuItem.Size = new System.Drawing.Size(262, 22); this.multivariateToolStripMenuItem.Text = "Multivariate"; this.multivariateToolStripMenuItem.Click += new System.EventHandler(this.multivariateToolStripMenuItem_Click); // - // histogramBasedToolStripMenuItem + // singleCellsSimulatorToolStripMenuItem // - this.histogramBasedToolStripMenuItem.Enabled = false; - this.histogramBasedToolStripMenuItem.Name = "histogramBasedToolStripMenuItem"; - this.histogramBasedToolStripMenuItem.Size = new System.Drawing.Size(202, 22); - this.histogramBasedToolStripMenuItem.Text = "Histogram Based"; - this.histogramBasedToolStripMenuItem.Click += new System.EventHandler(this.histogramBasedToolStripMenuItem_Click); + this.singleCellsSimulatorToolStripMenuItem.Name = "singleCellsSimulatorToolStripMenuItem"; + this.singleCellsSimulatorToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.G))); + this.singleCellsSimulatorToolStripMenuItem.Size = new System.Drawing.Size(262, 22); + this.singleCellsSimulatorToolStripMenuItem.Text = "Single Cells Simulator"; + this.singleCellsSimulatorToolStripMenuItem.ToolTipText = "Simulator to generate multivariate cell-by-cell based screening."; + this.singleCellsSimulatorToolStripMenuItem.Click += new System.EventHandler(this.singleCellsSimulatorToolStripMenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(268, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(182, 6); // // exportToolStripMenuItem // @@ -1878,7 +1587,7 @@ private void InitializeComponent() this.exportToolStripMenuItem.Enabled = false; this.exportToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.db_update; this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; - this.exportToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.exportToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.exportToolStripMenuItem.Text = "Save Screen"; // // SaveScreentoCSVToolStripMenuItem @@ -1909,7 +1618,7 @@ private void InitializeComponent() this.appendDescriptorsToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.db_add; this.appendDescriptorsToolStripMenuItem.Name = "appendDescriptorsToolStripMenuItem"; this.appendDescriptorsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.appendDescriptorsToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.appendDescriptorsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.appendDescriptorsToolStripMenuItem.Text = "Add Plates"; this.appendDescriptorsToolStripMenuItem.Click += new System.EventHandler(this.appendAssayToolStripMenuItem_Click); // @@ -1918,21 +1627,21 @@ private void InitializeComponent() this.linkToolStripMenuItem.Enabled = false; this.linkToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.insert_link; this.linkToolStripMenuItem.Name = "linkToolStripMenuItem"; - this.linkToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.linkToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.linkToolStripMenuItem.Text = "Link Data"; this.linkToolStripMenuItem.Click += new System.EventHandler(this.linkToolStripMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(268, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6); // // exitToolStripMenuItem // this.exitToolStripMenuItem.Image = global::HCSAnalyzer.Properties.Resources.application_exit; this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); - this.exitToolStripMenuItem.Size = new System.Drawing.Size(271, 22); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // @@ -2137,10 +1846,10 @@ private void InitializeComponent() this.scatterPointsToolStripMenuItem1, this.xYScatterPointsToolStripMenuItem, this.xYZScatterPointsToolStripMenuItem, - this.distributionToolStripMenuItem, + this.stackedHistogramsToolStripMenuItem, this.distanceMatrixToolStripMenuItem, this.toolStripSeparator9, - this.visualizationToolStripMenuItemPCA, + this.visualizationToolStripMenuItemFullScreen, this.toolStripSeparator8, this.hierarchicalTreeToolStripMenuItem}); this.visualizationToolStripMenuItem.Enabled = false; @@ -2171,24 +1880,23 @@ private void InitializeComponent() // this.xYZScatterPointsToolStripMenuItem.Name = "xYZScatterPointsToolStripMenuItem"; this.xYZScatterPointsToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.xYZScatterPointsToolStripMenuItem.Text = "XYZ Scatter Points"; + this.xYZScatterPointsToolStripMenuItem.Text = "XYZ Scatter Points*"; this.xYZScatterPointsToolStripMenuItem.ToolTipText = "Display 3D points"; this.xYZScatterPointsToolStripMenuItem.Click += new System.EventHandler(this.xYZScatterPointsToolStripMenuItem_Click); // - // distributionToolStripMenuItem + // stackedHistogramsToolStripMenuItem // - this.distributionToolStripMenuItem.Name = "distributionToolStripMenuItem"; - this.distributionToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H))); - this.distributionToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.distributionToolStripMenuItem.Text = "Histogram"; - this.distributionToolStripMenuItem.ToolTipText = "Display Histogram"; - this.distributionToolStripMenuItem.Click += new System.EventHandler(this.histogramToolStripMenuItem_Click); + this.stackedHistogramsToolStripMenuItem.Name = "stackedHistogramsToolStripMenuItem"; + this.stackedHistogramsToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.stackedHistogramsToolStripMenuItem.Text = "Stacked histograms"; + this.stackedHistogramsToolStripMenuItem.ToolTipText = "Display stacked histograms of the active descriptor"; + this.stackedHistogramsToolStripMenuItem.Click += new System.EventHandler(this.stackedHistogramsToolStripMenuItem_Click); // // distanceMatrixToolStripMenuItem // this.distanceMatrixToolStripMenuItem.Name = "distanceMatrixToolStripMenuItem"; this.distanceMatrixToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.distanceMatrixToolStripMenuItem.Text = "Distance Matrix"; + this.distanceMatrixToolStripMenuItem.Text = "Distance Matrix*"; this.distanceMatrixToolStripMenuItem.Click += new System.EventHandler(this.distanceMatrixToolStripMenuItem_Click); // // toolStripSeparator9 @@ -2196,73 +1904,32 @@ private void InitializeComponent() this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(201, 6); // - // visualizationToolStripMenuItemPCA + // visualizationToolStripMenuItemFullScreen // - this.visualizationToolStripMenuItemPCA.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.scatterPointsToolStripMenuItem, - this.xYScatterPointToolStripMenuItem, + this.visualizationToolStripMenuItemFullScreen.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.xYZScatterPointsToolStripMenuItemFullScreen, - this.histogramToolStripMenuItem, - this.stackedHistogramToolStripMenuItem, - this.toolStripSeparator11, + this.toolStripSeparator15, this.cellBasedClassificationTreeToolStripMenuItem}); - this.visualizationToolStripMenuItemPCA.Name = "visualizationToolStripMenuItemPCA"; - this.visualizationToolStripMenuItemPCA.Size = new System.Drawing.Size(204, 22); - this.visualizationToolStripMenuItemPCA.Text = "Visualization Full Screen"; - // - // scatterPointsToolStripMenuItem - // - this.scatterPointsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("scatterPointsToolStripMenuItem.Image"))); - this.scatterPointsToolStripMenuItem.Name = "scatterPointsToolStripMenuItem"; - this.scatterPointsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.P))); - this.scatterPointsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.scatterPointsToolStripMenuItem.Text = "Scatter Points"; - this.scatterPointsToolStripMenuItem.Click += new System.EventHandler(this.scatterPointsToolStripMenuItem_Click); - // - // xYScatterPointToolStripMenuItem - // - this.xYScatterPointToolStripMenuItem.Name = "xYScatterPointToolStripMenuItem"; - this.xYScatterPointToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.Y))); - this.xYScatterPointToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.xYScatterPointToolStripMenuItem.Text = "XY Scatter Points"; - this.xYScatterPointToolStripMenuItem.Click += new System.EventHandler(this.xYScatterPointToolStripMenuItem_Click); + this.visualizationToolStripMenuItemFullScreen.Name = "visualizationToolStripMenuItemFullScreen"; + this.visualizationToolStripMenuItemFullScreen.Size = new System.Drawing.Size(204, 22); + this.visualizationToolStripMenuItemFullScreen.Text = "Full Screen*"; // // xYZScatterPointsToolStripMenuItemFullScreen // this.xYZScatterPointsToolStripMenuItemFullScreen.Name = "xYZScatterPointsToolStripMenuItemFullScreen"; - this.xYZScatterPointsToolStripMenuItemFullScreen.Size = new System.Drawing.Size(246, 22); + this.xYZScatterPointsToolStripMenuItemFullScreen.Size = new System.Drawing.Size(229, 22); this.xYZScatterPointsToolStripMenuItemFullScreen.Text = "XYZ Scatter Points"; this.xYZScatterPointsToolStripMenuItemFullScreen.Click += new System.EventHandler(this.xYZScatterPointsToolStripMenuItemFullScreen_Click); // - // histogramToolStripMenuItem - // - this.histogramToolStripMenuItem.Name = "histogramToolStripMenuItem"; - this.histogramToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.H))); - this.histogramToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.histogramToolStripMenuItem.Text = "Histogram"; - this.histogramToolStripMenuItem.Click += new System.EventHandler(this.histogramToolStripMenuItem_Click); - // - // stackedHistogramToolStripMenuItem - // - this.stackedHistogramToolStripMenuItem.Name = "stackedHistogramToolStripMenuItem"; - this.stackedHistogramToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.S))); - this.stackedHistogramToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.stackedHistogramToolStripMenuItem.Text = "Stacked Histogram"; - this.stackedHistogramToolStripMenuItem.Click += new System.EventHandler(this.stackedHistogramToolStripMenuItem_Click); - // - // toolStripSeparator11 + // toolStripSeparator15 // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(243, 6); + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(226, 6); // // cellBasedClassificationTreeToolStripMenuItem // this.cellBasedClassificationTreeToolStripMenuItem.Name = "cellBasedClassificationTreeToolStripMenuItem"; - this.cellBasedClassificationTreeToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.cellBasedClassificationTreeToolStripMenuItem.Size = new System.Drawing.Size(229, 22); this.cellBasedClassificationTreeToolStripMenuItem.Text = "Cell-based Classification Tree"; this.cellBasedClassificationTreeToolStripMenuItem.Click += new System.EventHandler(this.cellBasedClassificationTreeToolStripMenuItem_Click); // @@ -2275,167 +1942,122 @@ private void InitializeComponent() // this.hierarchicalTreeToolStripMenuItem.Name = "hierarchicalTreeToolStripMenuItem"; this.hierarchicalTreeToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.hierarchicalTreeToolStripMenuItem.Text = "Hierarchical Tree"; + this.hierarchicalTreeToolStripMenuItem.Text = "Hierarchical Tree*"; this.hierarchicalTreeToolStripMenuItem.Click += new System.EventHandler(this.hierarchicalTreeToolStripMenuItem_Click); // - // projectionsToolStripMenuItem - // - this.projectionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.PCAToolStripMenuItem, - this.lDAToolStripMenuItem2, - this.projectionsFullScreenToolStripMenuItem}); - this.projectionsToolStripMenuItem.Enabled = false; - this.projectionsToolStripMenuItem.Name = "projectionsToolStripMenuItem"; - this.projectionsToolStripMenuItem.Size = new System.Drawing.Size(78, 23); - this.projectionsToolStripMenuItem.Text = "Projections"; - // - // PCAToolStripMenuItem - // - this.PCAToolStripMenuItem.Name = "PCAToolStripMenuItem"; - this.PCAToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.PCAToolStripMenuItem.Size = new System.Drawing.Size(193, 22); - this.PCAToolStripMenuItem.Text = "PCA"; - this.PCAToolStripMenuItem.ToolTipText = "Project Data after Principal Component Analysis "; - this.PCAToolStripMenuItem.Click += new System.EventHandler(this.aToolStripMenuItem_Click); - // - // lDAToolStripMenuItem2 - // - this.lDAToolStripMenuItem2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.displayGraphToolStripMenuItem}); - this.lDAToolStripMenuItem2.Name = "lDAToolStripMenuItem2"; - this.lDAToolStripMenuItem2.Size = new System.Drawing.Size(193, 22); - this.lDAToolStripMenuItem2.Text = "LDA"; - this.lDAToolStripMenuItem2.ToolTipText = "Project data after Linear Discreminent Analysis"; - // - // displayGraphToolStripMenuItem + // StatisticsToolStripMenuItem // - this.displayGraphToolStripMenuItem.Name = "displayGraphToolStripMenuItem"; - this.displayGraphToolStripMenuItem.Size = new System.Drawing.Size(147, 22); - this.displayGraphToolStripMenuItem.Text = "Display Graph"; - this.displayGraphToolStripMenuItem.Click += new System.EventHandler(this.displayGraphToolStripMenuItem_Click); + this.StatisticsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.qualityControlsToolStripMenuItem, + this.correlationAnalysisToolStripMenuItem, + this.qualityControlToolStripMenuItem, + this.projectionsToolStripMenuItem1}); + this.StatisticsToolStripMenuItem.Enabled = false; + this.StatisticsToolStripMenuItem.Name = "StatisticsToolStripMenuItem"; + this.StatisticsToolStripMenuItem.Size = new System.Drawing.Size(124, 23); + this.StatisticsToolStripMenuItem.Text = "Statistics && Analysis"; // - // projectionsFullScreenToolStripMenuItem + // qualityControlsToolStripMenuItem // - this.projectionsFullScreenToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.lDAToolStripMenuItem, - this.pCAToolStripMenuItem2}); - this.projectionsFullScreenToolStripMenuItem.Name = "projectionsFullScreenToolStripMenuItem"; - this.projectionsFullScreenToolStripMenuItem.Size = new System.Drawing.Size(193, 22); - this.projectionsFullScreenToolStripMenuItem.Text = "Projections Full Screen"; + this.qualityControlsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.zScoreToolStripMenuItem, + this.normalProbabilityPlotToolStripMenuItem2, + this.systematicErrorsToolStripMenuItem, + this.ftestdescBasedToolStripMenuItem, + this.statisticsToolStripMenuItem1}); + this.qualityControlsToolStripMenuItem.Name = "qualityControlsToolStripMenuItem"; + this.qualityControlsToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.qualityControlsToolStripMenuItem.Text = "Quality Controls"; // - // lDAToolStripMenuItem + // zScoreToolStripMenuItem // - this.lDAToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.displayGraphToolStripMenuItem1}); - this.lDAToolStripMenuItem.Name = "lDAToolStripMenuItem"; - this.lDAToolStripMenuItem.Size = new System.Drawing.Size(231, 22); - this.lDAToolStripMenuItem.Text = "LDA Full Screen"; + this.zScoreToolStripMenuItem.Name = "zScoreToolStripMenuItem"; + this.zScoreToolStripMenuItem.Size = new System.Drawing.Size(253, 22); + this.zScoreToolStripMenuItem.Text = "Z-Score"; + this.zScoreToolStripMenuItem.Click += new System.EventHandler(this.zScoreToolStripMenuItem_Click); // - // displayGraphToolStripMenuItem1 + // normalProbabilityPlotToolStripMenuItem2 // - this.displayGraphToolStripMenuItem1.Name = "displayGraphToolStripMenuItem1"; - this.displayGraphToolStripMenuItem1.Size = new System.Drawing.Size(147, 22); - this.displayGraphToolStripMenuItem1.Text = "Display Graph"; - this.displayGraphToolStripMenuItem1.Click += new System.EventHandler(this.displayGraphToolStripMenuItem1_Click); + this.normalProbabilityPlotToolStripMenuItem2.Name = "normalProbabilityPlotToolStripMenuItem2"; + this.normalProbabilityPlotToolStripMenuItem2.Size = new System.Drawing.Size(253, 22); + this.normalProbabilityPlotToolStripMenuItem2.Text = "Normal probability plot*"; + this.normalProbabilityPlotToolStripMenuItem2.Click += new System.EventHandler(this.normalProbabilityPlotToolStripMenuItem2_Click); // - // pCAToolStripMenuItem2 + // systematicErrorsToolStripMenuItem // - this.pCAToolStripMenuItem2.Name = "pCAToolStripMenuItem2"; - this.pCAToolStripMenuItem2.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.A))); - this.pCAToolStripMenuItem2.Size = new System.Drawing.Size(231, 22); - this.pCAToolStripMenuItem2.Text = "PCA Full Screen"; - this.pCAToolStripMenuItem2.Click += new System.EventHandler(this.pCAToolStripMenuItem2_Click); + this.systematicErrorsToolStripMenuItem.Name = "systematicErrorsToolStripMenuItem"; + this.systematicErrorsToolStripMenuItem.Size = new System.Drawing.Size(253, 22); + this.systematicErrorsToolStripMenuItem.Text = "Systematic errors*"; + this.systematicErrorsToolStripMenuItem.Click += new System.EventHandler(this.systematicErrorsToolStripMenuItem_Click); // - // StatisticsToolStripMenuItem + // ftestdescBasedToolStripMenuItem // - this.StatisticsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.zscoreSinglePlateToolStripMenuItem, - this.normalProbabilityPlotToolStripMenuItem, - this.toolStripMenuItem2, - this.systematicErrorsToolStripMenuItem1, - this.mINEAnalysisToolStripMenuItem, - this.qualityControlToolStripMenuItem}); - this.StatisticsToolStripMenuItem.Enabled = false; - this.StatisticsToolStripMenuItem.Name = "StatisticsToolStripMenuItem"; - this.StatisticsToolStripMenuItem.Size = new System.Drawing.Size(124, 23); - this.StatisticsToolStripMenuItem.Text = "Statistics && Analysis"; + this.ftestdescBasedToolStripMenuItem.Name = "ftestdescBasedToolStripMenuItem"; + this.ftestdescBasedToolStripMenuItem.Size = new System.Drawing.Size(253, 22); + this.ftestdescBasedToolStripMenuItem.Text = "F-test (desc. based)"; + this.ftestdescBasedToolStripMenuItem.Click += new System.EventHandler(this.ftestdescBasedToolStripMenuItem_Click); // - // zscoreSinglePlateToolStripMenuItem + // statisticsToolStripMenuItem1 // - this.zscoreSinglePlateToolStripMenuItem.Name = "zscoreSinglePlateToolStripMenuItem"; - this.zscoreSinglePlateToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); - this.zscoreSinglePlateToolStripMenuItem.Size = new System.Drawing.Size(241, 22); - this.zscoreSinglePlateToolStripMenuItem.Text = "Z-score"; - this.zscoreSinglePlateToolStripMenuItem.ToolTipText = "Compute Z-score between two controls"; - this.zscoreSinglePlateToolStripMenuItem.Click += new System.EventHandler(this.zscoreSinglePlateToolStripMenuItem_Click); + this.statisticsToolStripMenuItem1.Name = "statisticsToolStripMenuItem1"; + this.statisticsToolStripMenuItem1.Size = new System.Drawing.Size(253, 22); + this.statisticsToolStripMenuItem1.Text = "Statistics (Coefficient of Variation)"; + this.statisticsToolStripMenuItem1.Click += new System.EventHandler(this.statisticsToolStripMenuItem1_Click_1); + this.statisticsToolStripMenuItem1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.statisticsToolStripMenuItem1_MouseDown); // - // normalProbabilityPlotToolStripMenuItem + // correlationAnalysisToolStripMenuItem // - this.normalProbabilityPlotToolStripMenuItem.Name = "normalProbabilityPlotToolStripMenuItem"; - this.normalProbabilityPlotToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.normalProbabilityPlotToolStripMenuItem.Size = new System.Drawing.Size(241, 22); - this.normalProbabilityPlotToolStripMenuItem.Text = "Normal Probability Plot"; - this.normalProbabilityPlotToolStripMenuItem.ToolTipText = "Data should fit random distribution"; - this.normalProbabilityPlotToolStripMenuItem.Click += new System.EventHandler(this.normalProbabilityPlotToolStripMenuItem_Click); + this.correlationAnalysisToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aToolStripMenuItem, + this.correlationMatrixToolStripMenuItem1, + this.covarianceMatrixToolStripMenuItem}); + this.correlationAnalysisToolStripMenuItem.Name = "correlationAnalysisToolStripMenuItem"; + this.correlationAnalysisToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.correlationAnalysisToolStripMenuItem.Text = "Correlation analysis"; // - // toolStripMenuItem2 + // aToolStripMenuItem // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.M))); - this.toolStripMenuItem2.Size = new System.Drawing.Size(241, 22); - this.toolStripMenuItem2.Text = "Correlation Matrix"; - this.toolStripMenuItem2.ToolTipText = "Correlation Matrix of descriptors"; - this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + this.aToolStripMenuItem.Name = "aToolStripMenuItem"; + this.aToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.aToolStripMenuItem.Text = "MINE analysis"; + this.aToolStripMenuItem.Click += new System.EventHandler(this.aToolStripMenuItem_Click_1); // - // systematicErrorsToolStripMenuItem1 + // correlationMatrixToolStripMenuItem1 // - this.systematicErrorsToolStripMenuItem1.Name = "systematicErrorsToolStripMenuItem1"; - this.systematicErrorsToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); - this.systematicErrorsToolStripMenuItem1.Size = new System.Drawing.Size(241, 22); - this.systematicErrorsToolStripMenuItem1.Text = "Systematic Errors"; - this.systematicErrorsToolStripMenuItem1.ToolTipText = "Evaluate the systematic spatial errors "; - this.systematicErrorsToolStripMenuItem1.Click += new System.EventHandler(this.systematicErrorsToolStripMenuItem1_Click); + this.correlationMatrixToolStripMenuItem1.Name = "correlationMatrixToolStripMenuItem1"; + this.correlationMatrixToolStripMenuItem1.Size = new System.Drawing.Size(169, 22); + this.correlationMatrixToolStripMenuItem1.Text = "Correlation matrix"; + this.correlationMatrixToolStripMenuItem1.Click += new System.EventHandler(this.correlationMatrixToolStripMenuItem1_Click); // - // mINEAnalysisToolStripMenuItem + // covarianceMatrixToolStripMenuItem // - this.mINEAnalysisToolStripMenuItem.Name = "mINEAnalysisToolStripMenuItem"; - this.mINEAnalysisToolStripMenuItem.Size = new System.Drawing.Size(241, 22); - this.mINEAnalysisToolStripMenuItem.Text = "MINE analysis"; - this.mINEAnalysisToolStripMenuItem.ToolTipText = "Compute nonlinear correlation factors (Science2012)"; - this.mINEAnalysisToolStripMenuItem.Click += new System.EventHandler(this.mINEAnalysisToolStripMenuItem_Click); + this.covarianceMatrixToolStripMenuItem.Name = "covarianceMatrixToolStripMenuItem"; + this.covarianceMatrixToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.covarianceMatrixToolStripMenuItem.Text = "Covariance matrix"; + this.covarianceMatrixToolStripMenuItem.Click += new System.EventHandler(this.covarianceMatrixToolStripMenuItem_Click); // // qualityControlToolStripMenuItem // this.qualityControlToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.zscoreToolStripMenuItem, this.sSMDToolStripMenuItem, this.normalProbabilityPlotToolStripMenuItem1, this.correlationMatrixToolStripMenuItem, - this.coeffOfVariationEvolutionToolStripMenuItem, this.descriptorEvolutionToolStripMenuItem, this.classesDistributionToolStripMenuItem, this.extractPhenotypesOfInterestToolStripMenuItem, this.toolStripSeparator10, - this.generateHitsDistributionMapToolStripMenuItem}); + this.generateHitsDistributionMapToolStripMenuItem, + this.createAveragePlateToolStripMenuItem}); this.qualityControlToolStripMenuItem.Name = "qualityControlToolStripMenuItem"; - this.qualityControlToolStripMenuItem.Size = new System.Drawing.Size(241, 22); - this.qualityControlToolStripMenuItem.Text = "Statistics Full Screen"; - // - // zscoreToolStripMenuItem - // - this.zscoreToolStripMenuItem.Name = "zscoreToolStripMenuItem"; - this.zscoreToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.Z))); - this.zscoreToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.zscoreToolStripMenuItem.Text = "Z-score"; - this.zscoreToolStripMenuItem.Click += new System.EventHandler(this.zscoreToolStripMenuItem_Click_1); + this.qualityControlToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.qualityControlToolStripMenuItem.Text = "Full Screen*"; + // // sSMDToolStripMenuItem // this.sSMDToolStripMenuItem.Name = "sSMDToolStripMenuItem"; - this.sSMDToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.sSMDToolStripMenuItem.Text = "SSMD"; + this.sSMDToolStripMenuItem.Size = new System.Drawing.Size(278, 22); + this.sSMDToolStripMenuItem.Text = "SSMD*"; this.sSMDToolStripMenuItem.Click += new System.EventHandler(this.sSMDToolStripMenuItem_Click); // // normalProbabilityPlotToolStripMenuItem1 @@ -2443,8 +2065,8 @@ private void InitializeComponent() this.normalProbabilityPlotToolStripMenuItem1.Name = "normalProbabilityPlotToolStripMenuItem1"; this.normalProbabilityPlotToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.N))); - this.normalProbabilityPlotToolStripMenuItem1.Size = new System.Drawing.Size(273, 22); - this.normalProbabilityPlotToolStripMenuItem1.Text = "Normal Probability Plot"; + this.normalProbabilityPlotToolStripMenuItem1.Size = new System.Drawing.Size(278, 22); + this.normalProbabilityPlotToolStripMenuItem1.Text = "Normal Probability Plot*"; this.normalProbabilityPlotToolStripMenuItem1.Click += new System.EventHandler(this.normalProbabilityPlotToolStripMenuItem1_Click); // // correlationMatrixToolStripMenuItem @@ -2452,56 +2074,98 @@ private void InitializeComponent() this.correlationMatrixToolStripMenuItem.Name = "correlationMatrixToolStripMenuItem"; this.correlationMatrixToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.M))); - this.correlationMatrixToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.correlationMatrixToolStripMenuItem.Size = new System.Drawing.Size(278, 22); this.correlationMatrixToolStripMenuItem.Text = "Correlation Matrix"; this.correlationMatrixToolStripMenuItem.Click += new System.EventHandler(this.correlationMatrixToolStripMenuItem_Click); // - // coeffOfVariationEvolutionToolStripMenuItem - // - this.coeffOfVariationEvolutionToolStripMenuItem.Name = "coeffOfVariationEvolutionToolStripMenuItem"; - this.coeffOfVariationEvolutionToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.coeffOfVariationEvolutionToolStripMenuItem.Text = "Coeff. of Variation Evolution"; - this.coeffOfVariationEvolutionToolStripMenuItem.Click += new System.EventHandler(this.coeffOfVariationEvolutionToolStripMenuItem_Click); - // // descriptorEvolutionToolStripMenuItem // this.descriptorEvolutionToolStripMenuItem.Name = "descriptorEvolutionToolStripMenuItem"; - this.descriptorEvolutionToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.descriptorEvolutionToolStripMenuItem.Text = "Descriptor Evolution"; + this.descriptorEvolutionToolStripMenuItem.Size = new System.Drawing.Size(278, 22); + this.descriptorEvolutionToolStripMenuItem.Text = "Descriptor Evolution*"; this.descriptorEvolutionToolStripMenuItem.Click += new System.EventHandler(this.descriptorEvolutionToolStripMenuItem_Click); // // classesDistributionToolStripMenuItem // this.classesDistributionToolStripMenuItem.Name = "classesDistributionToolStripMenuItem"; - this.classesDistributionToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.classesDistributionToolStripMenuItem.Text = "Classes Distribution"; + this.classesDistributionToolStripMenuItem.Size = new System.Drawing.Size(278, 22); + this.classesDistributionToolStripMenuItem.Text = "Classes Distribution*"; this.classesDistributionToolStripMenuItem.Click += new System.EventHandler(this.classesDistributionToolStripMenuItem_Click); // // extractPhenotypesOfInterestToolStripMenuItem // this.extractPhenotypesOfInterestToolStripMenuItem.Name = "extractPhenotypesOfInterestToolStripMenuItem"; - this.extractPhenotypesOfInterestToolStripMenuItem.Size = new System.Drawing.Size(273, 22); + this.extractPhenotypesOfInterestToolStripMenuItem.Size = new System.Drawing.Size(278, 22); this.extractPhenotypesOfInterestToolStripMenuItem.Text = "Extract Phenotypes of Interest"; this.extractPhenotypesOfInterestToolStripMenuItem.Click += new System.EventHandler(this.extractPhenotypesOfInterestToolStripMenuItem_Click); // // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(270, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(275, 6); // // generateHitsDistributionMapToolStripMenuItem // this.generateHitsDistributionMapToolStripMenuItem.Name = "generateHitsDistributionMapToolStripMenuItem"; - this.generateHitsDistributionMapToolStripMenuItem.Size = new System.Drawing.Size(273, 22); - this.generateHitsDistributionMapToolStripMenuItem.Text = "Hits Distribution Maps"; + this.generateHitsDistributionMapToolStripMenuItem.Size = new System.Drawing.Size(278, 22); + this.generateHitsDistributionMapToolStripMenuItem.Text = "Hits Distribution Maps*"; this.generateHitsDistributionMapToolStripMenuItem.Click += new System.EventHandler(this.generateHitsDistributionMapToolStripMenuItem_Click); // + // createAveragePlateToolStripMenuItem + // + this.createAveragePlateToolStripMenuItem.Name = "createAveragePlateToolStripMenuItem"; + this.createAveragePlateToolStripMenuItem.Size = new System.Drawing.Size(278, 22); + this.createAveragePlateToolStripMenuItem.Text = "Create Average Plate"; + this.createAveragePlateToolStripMenuItem.Click += new System.EventHandler(this.createAveragePlateToolStripMenuItem_Click); + // + // projectionsToolStripMenuItem1 + // + this.projectionsToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.pCAToolStripMenuItem1, + this.lDAToolStripMenuItem}); + this.projectionsToolStripMenuItem1.Name = "projectionsToolStripMenuItem1"; + this.projectionsToolStripMenuItem1.Size = new System.Drawing.Size(177, 22); + this.projectionsToolStripMenuItem1.Text = "Projections"; + // + // pCAToolStripMenuItem1 + // + this.pCAToolStripMenuItem1.Name = "pCAToolStripMenuItem1"; + this.pCAToolStripMenuItem1.Size = new System.Drawing.Size(97, 22); + this.pCAToolStripMenuItem1.Text = "PCA"; + this.pCAToolStripMenuItem1.ToolTipText = "Principal Component Analysis"; + this.pCAToolStripMenuItem1.Click += new System.EventHandler(this.pCAToolStripMenuItem1_Click); + // + // lDAToolStripMenuItem + // + this.lDAToolStripMenuItem.Name = "lDAToolStripMenuItem"; + this.lDAToolStripMenuItem.Size = new System.Drawing.Size(97, 22); + this.lDAToolStripMenuItem.Text = "LDA"; + this.lDAToolStripMenuItem.ToolTipText = "Linear Decomposition Analysis"; + this.lDAToolStripMenuItem.Click += new System.EventHandler(this.lDAToolStripMenuItem_Click); + // + // hitIdentificationToolStripMenuItem + // + this.hitIdentificationToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mahalanobisDistanceToolStripMenuItem}); + this.hitIdentificationToolStripMenuItem.Enabled = false; + this.hitIdentificationToolStripMenuItem.Name = "hitIdentificationToolStripMenuItem"; + this.hitIdentificationToolStripMenuItem.Size = new System.Drawing.Size(108, 23); + this.hitIdentificationToolStripMenuItem.Text = "Hit Identification"; + // + // mahalanobisDistanceToolStripMenuItem + // + this.mahalanobisDistanceToolStripMenuItem.Name = "mahalanobisDistanceToolStripMenuItem"; + this.mahalanobisDistanceToolStripMenuItem.Size = new System.Drawing.Size(190, 22); + this.mahalanobisDistanceToolStripMenuItem.Text = "Mahalanobis Distance"; + this.mahalanobisDistanceToolStripMenuItem.Click += new System.EventHandler(this.mahalanobisDistanceToolStripMenuItem_Click); + // // toolStripMenuItemGeneAnalysis // this.toolStripMenuItemGeneAnalysis.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.findGeneToolStripMenuItem, this.pahtwaysAnalysisToolStripMenuItem, - this.findPathwayToolStripMenuItem}); + this.findPathwayToolStripMenuItem, + this.pathwayExpressionToolStripMenuItem}); this.toolStripMenuItemGeneAnalysis.Enabled = false; this.toolStripMenuItemGeneAnalysis.Name = "toolStripMenuItemGeneAnalysis"; this.toolStripMenuItemGeneAnalysis.Size = new System.Drawing.Size(113, 23); @@ -2531,12 +2195,24 @@ private void InitializeComponent() this.findPathwayToolStripMenuItem.Text = "Find Pathway"; this.findPathwayToolStripMenuItem.Click += new System.EventHandler(this.findPathwayToolStripMenuItem_Click); // + // pathwayExpressionToolStripMenuItem + // + this.pathwayExpressionToolStripMenuItem.Name = "pathwayExpressionToolStripMenuItem"; + this.pathwayExpressionToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.pathwayExpressionToolStripMenuItem.Text = "Pathway Expression"; + this.pathwayExpressionToolStripMenuItem.Click += new System.EventHandler(this.pathwayExpressionToolStripMenuItem_Click); + // // betaToolStripMenuItem // this.betaToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.dRCAnalysisToolStripMenuItem2, this.distributionsToolStripMenuItem, - this.toolStripMenuItem3}); + this.toolStripMenuItem3, + this.toolStripMenuItem4, + this.bioFormatsToolStripMenuItem, + this.newOptionMenuToolStripMenuItem, + this.testDisplayToolStripMenuItem, + this.toolStripTextBox1}); this.betaToolStripMenuItem.Name = "betaToolStripMenuItem"; this.betaToolStripMenuItem.Size = new System.Drawing.Size(42, 23); this.betaToolStripMenuItem.Text = "Beta"; @@ -2551,9 +2227,7 @@ private void InitializeComponent() this.displayDRCToolStripMenuItem1, this.displayRespondingDRCToolStripMenuItem1, this.toolStripSeparator14, - this.currentPlate3DToolStripMenuItem, - this.toolStripSeparator15, - this.generateDRCsToolStripMenuItem}); + this.currentPlate3DToolStripMenuItem}); this.dRCAnalysisToolStripMenuItem2.Name = "dRCAnalysisToolStripMenuItem2"; this.dRCAnalysisToolStripMenuItem2.Size = new System.Drawing.Size(181, 22); this.dRCAnalysisToolStripMenuItem2.Text = "DRC Analysis"; @@ -2603,18 +2277,6 @@ private void InitializeComponent() this.currentPlate3DToolStripMenuItem.Text = "XYZ Scatter Pts with Connections"; this.currentPlate3DToolStripMenuItem.Click += new System.EventHandler(this.currentPlate3DToolStripMenuItem_Click); // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(246, 6); - // - // generateDRCsToolStripMenuItem - // - this.generateDRCsToolStripMenuItem.Name = "generateDRCsToolStripMenuItem"; - this.generateDRCsToolStripMenuItem.Size = new System.Drawing.Size(249, 22); - this.generateDRCsToolStripMenuItem.Text = "Generate DRCs"; - this.generateDRCsToolStripMenuItem.Click += new System.EventHandler(this.generateDRCsToolStripMenuItem_Click); - // // distributionsToolStripMenuItem // this.distributionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -2646,6 +2308,103 @@ private void InitializeComponent() this.toolStripMenuItem3.Text = "Load FACS data"; this.toolStripMenuItem3.Click += new System.EventHandler(this.toolStripMenuItem3_Click); // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.loadSingleImageToolStripMenuItem, + this.testSingleImageToolStripMenuItem}); + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(181, 22); + this.toolStripMenuItem4.Text = "Image Analysis"; + // + // loadSingleImageToolStripMenuItem + // + this.loadSingleImageToolStripMenuItem.Name = "loadSingleImageToolStripMenuItem"; + this.loadSingleImageToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.loadSingleImageToolStripMenuItem.Text = "Load Single Image"; + this.loadSingleImageToolStripMenuItem.Click += new System.EventHandler(this.loadSingleImageToolStripMenuItem_Click); + // + // testSingleImageToolStripMenuItem + // + this.testSingleImageToolStripMenuItem.Name = "testSingleImageToolStripMenuItem"; + this.testSingleImageToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.testSingleImageToolStripMenuItem.Text = "TestSingleImage"; + this.testSingleImageToolStripMenuItem.Click += new System.EventHandler(this.testSingleImageToolStripMenuItem_Click); + // + // bioFormatsToolStripMenuItem + // + this.bioFormatsToolStripMenuItem.Name = "bioFormatsToolStripMenuItem"; + this.bioFormatsToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.bioFormatsToolStripMenuItem.Text = "Test BioFormat"; + this.bioFormatsToolStripMenuItem.Click += new System.EventHandler(this.bioFormatsToolStripMenuItem_Click); + // + // newOptionMenuToolStripMenuItem + // + this.newOptionMenuToolStripMenuItem.Name = "newOptionMenuToolStripMenuItem"; + this.newOptionMenuToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.newOptionMenuToolStripMenuItem.Text = "NewOptionMenu"; + this.newOptionMenuToolStripMenuItem.Click += new System.EventHandler(this.newOptionMenuToolStripMenuItem_Click); + // + // testDisplayToolStripMenuItem + // + this.testDisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.heatMapToolStripMenuItem, + this.testRStatsToolStripMenuItem, + this.testNewProjectorsToolStripMenuItem, + this.testBoxPlotToolStripMenuItem, + this.testLinearRegressionToolStripMenuItem, + this.testMultiScatterToolStripMenuItem}); + this.testDisplayToolStripMenuItem.Name = "testDisplayToolStripMenuItem"; + this.testDisplayToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + this.testDisplayToolStripMenuItem.Text = "Test Display"; + // + // heatMapToolStripMenuItem + // + this.heatMapToolStripMenuItem.Name = "heatMapToolStripMenuItem"; + this.heatMapToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.heatMapToolStripMenuItem.Text = "Heat Map"; + this.heatMapToolStripMenuItem.Click += new System.EventHandler(this.heatMapToolStripMenuItem_Click); + // + // testRStatsToolStripMenuItem + // + this.testRStatsToolStripMenuItem.Name = "testRStatsToolStripMenuItem"; + this.testRStatsToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.testRStatsToolStripMenuItem.Text = "Test-R-Stats"; + this.testRStatsToolStripMenuItem.Click += new System.EventHandler(this.testRStatsToolStripMenuItem_Click); + // + // testNewProjectorsToolStripMenuItem + // + this.testNewProjectorsToolStripMenuItem.Name = "testNewProjectorsToolStripMenuItem"; + this.testNewProjectorsToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.testNewProjectorsToolStripMenuItem.Text = "Test New Projectors"; + this.testNewProjectorsToolStripMenuItem.Click += new System.EventHandler(this.testNewProjectorsToolStripMenuItem_Click); + // + // testBoxPlotToolStripMenuItem + // + this.testBoxPlotToolStripMenuItem.Name = "testBoxPlotToolStripMenuItem"; + this.testBoxPlotToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.testBoxPlotToolStripMenuItem.Text = "Test BoxPlot"; + this.testBoxPlotToolStripMenuItem.Click += new System.EventHandler(this.testBoxPlotToolStripMenuItem_Click); + // + // testLinearRegressionToolStripMenuItem + // + this.testLinearRegressionToolStripMenuItem.Name = "testLinearRegressionToolStripMenuItem"; + this.testLinearRegressionToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.testLinearRegressionToolStripMenuItem.Text = "Test Linear Regression"; + this.testLinearRegressionToolStripMenuItem.Click += new System.EventHandler(this.testLinearRegressionToolStripMenuItem_Click); + // + // testMultiScatterToolStripMenuItem + // + this.testMultiScatterToolStripMenuItem.Name = "testMultiScatterToolStripMenuItem"; + this.testMultiScatterToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.testMultiScatterToolStripMenuItem.Text = "Test Multi Scatter"; + this.testMultiScatterToolStripMenuItem.Click += new System.EventHandler(this.testMultiScatterToolStripMenuItem_Click); + // + // toolStripTextBox1 + // + this.toolStripTextBox1.Name = "toolStripTextBox1"; + this.toolStripTextBox1.Size = new System.Drawing.Size(100, 23); + // // pluginsToolStripMenuItem // this.pluginsToolStripMenuItem.Enabled = false; @@ -2677,9 +2436,9 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.checkedListBoxActiveDescriptors.CheckOnClick = true; this.checkedListBoxActiveDescriptors.FormattingEnabled = true; - this.checkedListBoxActiveDescriptors.Location = new System.Drawing.Point(3, 85); + this.checkedListBoxActiveDescriptors.Location = new System.Drawing.Point(3, 70); this.checkedListBoxActiveDescriptors.Name = "checkedListBoxActiveDescriptors"; - this.checkedListBoxActiveDescriptors.Size = new System.Drawing.Size(216, 304); + this.checkedListBoxActiveDescriptors.Size = new System.Drawing.Size(218, 319); this.checkedListBoxActiveDescriptors.TabIndex = 8; this.checkedListBoxActiveDescriptors.SelectedIndexChanged += new System.EventHandler(this.checkedListBoxDescriptorActive_SelectedIndexChanged); this.checkedListBoxActiveDescriptors.MouseDown += new System.Windows.Forms.MouseEventHandler(this.checkedListBoxActiveDescriptors_MouseDown); @@ -2688,10 +2447,12 @@ private void InitializeComponent() // this.comboBoxDescriptorToDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxDescriptorToDisplay.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.comboBoxDescriptorToDisplay.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; this.comboBoxDescriptorToDisplay.FormattingEnabled = true; this.comboBoxDescriptorToDisplay.Location = new System.Drawing.Point(3, 26); this.comboBoxDescriptorToDisplay.Name = "comboBoxDescriptorToDisplay"; - this.comboBoxDescriptorToDisplay.Size = new System.Drawing.Size(216, 21); + this.comboBoxDescriptorToDisplay.Size = new System.Drawing.Size(218, 21); this.comboBoxDescriptorToDisplay.TabIndex = 9; this.comboBoxDescriptorToDisplay.SelectedIndexChanged += new System.EventHandler(this.comboBoxDescriptorToDisplay_SelectedIndexChanged); // @@ -2707,7 +2468,7 @@ private void InitializeComponent() // label8 // this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(3, 69); + this.label8.Location = new System.Drawing.Point(3, 54); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(74, 13); this.label8.TabIndex = 20; @@ -2731,7 +2492,7 @@ private void InitializeComponent() this.splitContainerMain.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.splitContainerMain.Location = new System.Drawing.Point(172, 33); + this.splitContainerMain.Location = new System.Drawing.Point(128, 3); this.splitContainerMain.Name = "splitContainerMain"; // // splitContainerMain.Panel1 @@ -2746,7 +2507,7 @@ private void InitializeComponent() this.splitContainerMain.Panel2.Controls.Add(this.label2); this.splitContainerMain.Panel2.Controls.Add(this.comboBoxDescriptorToDisplay); this.splitContainerMain.Panel2.Controls.Add(this.label8); - this.splitContainerMain.Size = new System.Drawing.Size(1048, 390); + this.splitContainerMain.Size = new System.Drawing.Size(1050, 394); this.splitContainerMain.SplitterDistance = 821; this.splitContainerMain.TabIndex = 35; // @@ -2757,7 +2518,7 @@ private void InitializeComponent() this.buttonPreviousPlate.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.buttonPreviousPlate.Location = new System.Drawing.Point(4, 3); this.buttonPreviousPlate.Name = "buttonPreviousPlate"; - this.buttonPreviousPlate.Size = new System.Drawing.Size(19, 384); + this.buttonPreviousPlate.Size = new System.Drawing.Size(19, 388); this.buttonPreviousPlate.TabIndex = 2; this.buttonPreviousPlate.Text = "<"; this.buttonPreviousPlate.UseVisualStyleBackColor = true; @@ -2768,32 +2529,172 @@ private void InitializeComponent() this.buttonNextPlate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right))); this.buttonNextPlate.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonNextPlate.Location = new System.Drawing.Point(795, 3); + this.buttonNextPlate.Location = new System.Drawing.Point(794, 3); this.buttonNextPlate.Name = "buttonNextPlate"; - this.buttonNextPlate.Size = new System.Drawing.Size(19, 384); + this.buttonNextPlate.Size = new System.Drawing.Size(19, 388); this.buttonNextPlate.TabIndex = 1; this.buttonNextPlate.Text = ">"; this.buttonNextPlate.UseVisualStyleBackColor = true; this.buttonNextPlate.Click += new System.EventHandler(this.buttonNextPlate_Click); // + // splitContainer1 + // + this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 55); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.splitContainerMain); + this.splitContainer1.Panel1.Controls.Add(this.panelForTools); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.tabControlMain); + this.splitContainer1.Size = new System.Drawing.Size(1181, 677); + this.splitContainer1.SplitterDistance = 403; + this.splitContainer1.TabIndex = 36; + // + // toolStripMain + // + this.toolStripMain.AllowItemReorder = true; + this.toolStripMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripSeparator16, + this.toolStripButtonZoomOut, + this.toolStripButtonZoomIn, + this.toolStripSeparator11, + this.toolStripDropDownButtonApplyClass, + this.toolStripDropDownButtonProcessMode}); + this.toolStripMain.Location = new System.Drawing.Point(0, 27); + this.toolStripMain.Name = "toolStripMain"; + this.toolStripMain.Size = new System.Drawing.Size(1181, 25); + this.toolStripMain.TabIndex = 37; + this.toolStripMain.Text = "toolStrip1"; + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(6, 25); + // + // toolStripButtonZoomOut + // + this.toolStripButtonZoomOut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonZoomOut.Image = global::HCSAnalyzer.Properties.Resources.zoom_out_41; + this.toolStripButtonZoomOut.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonZoomOut.Name = "toolStripButtonZoomOut"; + this.toolStripButtonZoomOut.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonZoomOut.Text = "Zoom Out"; + this.toolStripButtonZoomOut.Click += new System.EventHandler(this.toolStripButtonZoomOut_Click); + // + // toolStripButtonZoomIn + // + this.toolStripButtonZoomIn.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonZoomIn.Image = global::HCSAnalyzer.Properties.Resources.zoom_in_41; + this.toolStripButtonZoomIn.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonZoomIn.Name = "toolStripButtonZoomIn"; + this.toolStripButtonZoomIn.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonZoomIn.Text = "Zoom In"; + this.toolStripButtonZoomIn.Click += new System.EventHandler(this.toolStripButtonZoomIn_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25); + // + // toolStripDropDownButtonApplyClass + // + this.toolStripDropDownButtonApplyClass.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripDropDownButtonApplyClass.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.globalToolStripMenuItem, + this.globalIfOnlyActiveToolStripMenuItem}); + this.toolStripDropDownButtonApplyClass.Image = ((System.Drawing.Image)(resources.GetObject("toolStripDropDownButtonApplyClass.Image"))); + this.toolStripDropDownButtonApplyClass.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButtonApplyClass.Name = "toolStripDropDownButtonApplyClass"; + this.toolStripDropDownButtonApplyClass.Size = new System.Drawing.Size(29, 22); + this.toolStripDropDownButtonApplyClass.Text = "Class Application"; + // + // globalToolStripMenuItem + // + this.globalToolStripMenuItem.Name = "globalToolStripMenuItem"; + this.globalToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.globalToolStripMenuItem.Text = "Global"; + this.globalToolStripMenuItem.Click += new System.EventHandler(this.globalToolStripMenuItem_Click); + // + // globalIfOnlyActiveToolStripMenuItem + // + this.globalIfOnlyActiveToolStripMenuItem.Name = "globalIfOnlyActiveToolStripMenuItem"; + this.globalIfOnlyActiveToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.globalIfOnlyActiveToolStripMenuItem.Text = "Global (only if active)"; + this.globalIfOnlyActiveToolStripMenuItem.Click += new System.EventHandler(this.globalIfOnlyActiveToolStripMenuItem_Click); + // + // toolStripDropDownButtonProcessMode + // + this.toolStripDropDownButtonProcessMode.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButtonProcessMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ProcessModeCurrentPlateOnlyToolStripMenuItem, + this.ProcessModeplateByPlateToolStripMenuItem, + this.ProcessModeEntireScreeningToolStripMenuItem}); + this.toolStripDropDownButtonProcessMode.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripDropDownButtonProcessMode.Image = ((System.Drawing.Image)(resources.GetObject("toolStripDropDownButtonProcessMode.Image"))); + this.toolStripDropDownButtonProcessMode.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButtonProcessMode.Name = "toolStripDropDownButtonProcessMode"; + this.toolStripDropDownButtonProcessMode.Size = new System.Drawing.Size(89, 22); + this.toolStripDropDownButtonProcessMode.Text = "Current Plate"; + // + // ProcessModeCurrentPlateOnlyToolStripMenuItem + // + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.AutoToolTip = true; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked = true; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.CheckOnClick = true; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Name = "ProcessModeCurrentPlateOnlyToolStripMenuItem"; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Text = "Current Plate"; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.ToolTipText = "Processes will by performed on the current plate only"; + this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Click += new System.EventHandler(this.processModeToolStripMenuItem_Click); + // + // ProcessModeplateByPlateToolStripMenuItem + // + this.ProcessModeplateByPlateToolStripMenuItem.AutoToolTip = true; + this.ProcessModeplateByPlateToolStripMenuItem.CheckOnClick = true; + this.ProcessModeplateByPlateToolStripMenuItem.Name = "ProcessModeplateByPlateToolStripMenuItem"; + this.ProcessModeplateByPlateToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.ProcessModeplateByPlateToolStripMenuItem.Text = "Plate by Plate"; + this.ProcessModeplateByPlateToolStripMenuItem.ToolTipText = "Processes will be performed plate by plate"; + this.ProcessModeplateByPlateToolStripMenuItem.Click += new System.EventHandler(this.plateByPlateToolStripMenuItem_Click); + // + // ProcessModeEntireScreeningToolStripMenuItem + // + this.ProcessModeEntireScreeningToolStripMenuItem.AutoToolTip = true; + this.ProcessModeEntireScreeningToolStripMenuItem.CheckOnClick = true; + this.ProcessModeEntireScreeningToolStripMenuItem.Name = "ProcessModeEntireScreeningToolStripMenuItem"; + this.ProcessModeEntireScreeningToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.ProcessModeEntireScreeningToolStripMenuItem.Text = "Entire Screening"; + this.ProcessModeEntireScreeningToolStripMenuItem.ToolTipText = "Processes will be performed on the overvall screening"; + this.ProcessModeEntireScreeningToolStripMenuItem.Click += new System.EventHandler(this.entireScreeningToolStripMenuItem_Click); + // // HCSAnalyzer // this.AllowDrop = true; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1220, 732); - this.Controls.Add(this.splitContainerMain); - this.Controls.Add(this.tabControlMain); - this.Controls.Add(this.panelForTools); + this.ClientSize = new System.Drawing.Size(1181, 732); + this.Controls.Add(this.toolStripMain); + this.Controls.Add(this.splitContainer1); this.Controls.Add(this.menuStripFile); this.DoubleBuffered = true; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.KeyPreview = true; this.MainMenuStrip = this.menuStripFile; this.Name = "HCSAnalyzer"; + this.Text = "HCS analyzer v1.2.1.3 (Beta)"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.HCSAnalyzer_FormClosed); this.Load += new System.EventHandler(this.HCSAnalyzer_Load); this.Shown += new System.EventHandler(this.HCSAnalyzer_Shown); + this.DragDrop += new System.Windows.Forms.DragEventHandler(this.HCSAnalyzer_DragDrop); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.HCSAnalyzer_KeyPress); this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panelForPlate_MouseWheel); this.tabControlMain.ResumeLayout(false); @@ -2812,13 +2713,10 @@ private void InitializeComponent() this.tabPageNormalization.ResumeLayout(false); this.groupBox15.ResumeLayout(false); this.groupBox15.PerformLayout(); + this.tabPageSingleCellAnalysis.ResumeLayout(false); + this.tabPageSingleCellAnalysis.PerformLayout(); this.tabPageClassification.ResumeLayout(false); - this.groupBox6.ResumeLayout(false); - this.groupBox6.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownManualThreshold)).EndInit(); this.groupBox12.ResumeLayout(false); - this.groupBox12.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDownClusterNumber)).EndInit(); this.groupBox11.ResumeLayout(false); this.groupBox11.PerformLayout(); this.tabPageExport.ResumeLayout(false); @@ -2833,8 +2731,6 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.groupBox4.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - this.tabPageWellsSelection.ResumeLayout(false); - this.contextMenuStripForListSelectedWells.ResumeLayout(false); this.panelForTools.ResumeLayout(false); this.panelForTools.PerformLayout(); this.panelForPlate.ResumeLayout(false); @@ -2847,6 +2743,12 @@ private void InitializeComponent() this.splitContainerMain.Panel2.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).EndInit(); this.splitContainerMain.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.toolStripMain.ResumeLayout(false); + this.toolStripMain.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -2856,18 +2758,13 @@ private void InitializeComponent() private System.Windows.Forms.MenuStrip menuStripFile; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem loadScreenToolStripMenuItem; - private System.Windows.Forms.Button buttonSizeIncrease; - private System.Windows.Forms.Button buttonSizeDecrease; - private System.Windows.Forms.CheckedListBox checkedListBoxActiveDescriptors; + public System.Windows.Forms.CheckedListBox checkedListBoxActiveDescriptors; private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem currentPlateTomtrToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem copyAverageValuesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem copyAverageValuesToolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem copyClassesToolStripMenuItem; - private System.Windows.Forms.Button buttonGlobalSelection; - private System.Windows.Forms.CheckBox checkBoxApplyToAllPlates; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; @@ -2897,14 +2794,11 @@ private void InitializeComponent() private System.Windows.Forms.PictureBox pictureBox2; private System.Windows.Forms.ToolStripMenuItem linkToolStripMenuItem; private System.Windows.Forms.TabPage tabPageQualityQtrl; - private System.Windows.Forms.ComboBox comboBoxDescriptorToDisplay; - private System.Windows.Forms.CheckBox checkBoxDisplayClasses; private System.Windows.Forms.Panel panelForTools; private System.Windows.Forms.RadioButton radioButtonClassifPlateByPlate; private System.Windows.Forms.Button buttonQualityControl; private System.Windows.Forms.ToolStripMenuItem appendDescriptorsToolStripMenuItem; private System.Windows.Forms.DataGridView dataGridViewForQualityControl; - private System.Windows.Forms.Button buttonGlobalOnlySelected; private System.Windows.Forms.GroupBox groupBox5; private System.Windows.Forms.RichTextBox richTextBoxForScreeningInformation; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; @@ -2923,8 +2817,6 @@ private void InitializeComponent() private System.Windows.Forms.RichTextBox richTextBoxInfoClustering; private System.Windows.Forms.GroupBox groupBox11; private System.Windows.Forms.RichTextBox richTextBoxInfoClassif; - private System.Windows.Forms.Button buttonCluster; - private System.Windows.Forms.ComboBox comboBoxClusteringMethod; private System.Windows.Forms.ComboBox comboBoxCLassificationMethod; private System.Windows.Forms.RadioButton radioButtonClassifGlobal; private System.Windows.Forms.Label label5; @@ -2962,11 +2854,6 @@ private void InitializeComponent() private ToolStripMenuItem multivariateToolStripMenuItem; private ContextMenuStrip contextMenuStripForLUT; private ToolStripMenuItem toolStripMenuItem1; - private RadioButton radioButtonClusterFullScreen; - private RadioButton radioButtonClusterPlateByPlate; - private Label label10; - private CheckBox checkBoxAutomatedClusterNumber; - private NumericUpDown numericUpDownClusterNumber; private ToolStripMenuItem pluginsToolStripMenuItem; private ToolStripMenuItem toARFFToolStripMenuItem; private ComboBox comboBoxRejectionPositiveCtrl; @@ -2984,60 +2871,34 @@ private void InitializeComponent() private ToolStripSeparator toolStripSeparator5; private SplitContainer splitContainerExport; private ToolStripMenuItem displayReferenceToolStripMenuItem; - private ToolStripMenuItem histogramBasedToolStripMenuItem; public TabControl tabControlMain; private SplitContainer splitContainerMain; public Panel panelForPlate; private Button buttonNextPlate; private Button buttonPreviousPlate; - private TabPage tabPageWellsSelection; + private TabPage tabPageSingleCellAnalysis; private Button buttonDisplayWellsSelectionData; - private ComboBox comboBoxClassForWellSelection; - private ListBox listBoxSelectedWells; private Button buttonToSelectWellsFromClass; - private ContextMenuStrip contextMenuStripForListSelectedWells; - private ToolStripMenuItem clearToolStripMenuItem; - private ToolStripMenuItem projectionsToolStripMenuItem; - private ToolStripMenuItem PCAToolStripMenuItem; - private ToolStripMenuItem lDAToolStripMenuItem2; - private ToolStripMenuItem displayGraphToolStripMenuItem; private ToolStripMenuItem visualizationToolStripMenuItem; private ToolStripMenuItem scatterPointsToolStripMenuItem1; private ToolStripMenuItem xYScatterPointsToolStripMenuItem; private ToolStripMenuItem xYZScatterPointsToolStripMenuItem; - private ToolStripMenuItem distributionToolStripMenuItem; private ToolStripMenuItem distanceMatrixToolStripMenuItem; - private ToolStripMenuItem visualizationToolStripMenuItemPCA; - private ToolStripMenuItem scatterPointsToolStripMenuItem; - private ToolStripMenuItem xYScatterPointToolStripMenuItem; + private ToolStripMenuItem visualizationToolStripMenuItemFullScreen; private ToolStripMenuItem xYZScatterPointsToolStripMenuItemFullScreen; - private ToolStripMenuItem histogramToolStripMenuItem; - private ToolStripMenuItem stackedHistogramToolStripMenuItem; private ToolStripMenuItem cellBasedClassificationTreeToolStripMenuItem; private ToolStripMenuItem StatisticsToolStripMenuItem; - private ToolStripMenuItem zscoreSinglePlateToolStripMenuItem; - private ToolStripMenuItem normalProbabilityPlotToolStripMenuItem; - private ToolStripMenuItem toolStripMenuItem2; - private ToolStripMenuItem systematicErrorsToolStripMenuItem1; - private ToolStripMenuItem mINEAnalysisToolStripMenuItem; private ToolStripMenuItem qualityControlToolStripMenuItem; - private ToolStripMenuItem zscoreToolStripMenuItem; private ToolStripMenuItem sSMDToolStripMenuItem; private ToolStripMenuItem normalProbabilityPlotToolStripMenuItem1; private ToolStripMenuItem correlationMatrixToolStripMenuItem; - private ToolStripMenuItem coeffOfVariationEvolutionToolStripMenuItem; private ToolStripMenuItem descriptorEvolutionToolStripMenuItem; private ToolStripMenuItem toolStripMenuItemGeneAnalysis; private ToolStripMenuItem findGeneToolStripMenuItem; private ToolStripMenuItem pahtwaysAnalysisToolStripMenuItem; private ToolStripMenuItem findPathwayToolStripMenuItem; private Label label1; - private ComboBox comboBoxClass; private Label labelNumClasses; - private ToolStripMenuItem projectionsFullScreenToolStripMenuItem; - private ToolStripMenuItem lDAToolStripMenuItem; - private ToolStripMenuItem displayGraphToolStripMenuItem1; - private ToolStripMenuItem pCAToolStripMenuItem2; private Button button_Trees; private ToolStripMenuItem toolStripMenuItem3; private ToolStripMenuItem classesDistributionToolStripMenuItem; @@ -3049,7 +2910,6 @@ private void InitializeComponent() private ToolStripSeparator toolStripSeparator7; private ToolStripMenuItem pieViewToolStripMenuItem1; private ToolStripSeparator toolStripSeparator9; - private ToolStripSeparator toolStripSeparator8; public ToolStripMenuItem ThreeDVisualizationToolStripMenuItem; private ToolStripSeparator toolStripSeparator10; private ToolStripMenuItem generateHitsDistributionMapToolStripMenuItem; @@ -3057,25 +2917,68 @@ private void InitializeComponent() private ToolStripMenuItem generateDBFromCSVToolStripMenuItem; private ToolStripMenuItem loadDBToolStripMenuItem; private ToolStripSeparator toolStripSeparator12; - private ToolStripSeparator toolStripSeparator11; private ToolStripMenuItem classViewToolStripMenuItem; private ToolStripMenuItem averageViewToolStripMenuItem; private ToolStripSeparator toolStripSeparator13; private ToolStripMenuItem histogramViewToolStripMenuItem; private ToolStripSeparator toolStripSeparator14; private ToolStripMenuItem currentPlate3DToolStripMenuItem; + private ToolStripMenuItem toolStripMenuItem4; + private ToolStripMenuItem loadSingleImageToolStripMenuItem; + private ToolStripMenuItem bioFormatsToolStripMenuItem; + private ToolStripMenuItem testSingleImageToolStripMenuItem; + private ToolStripMenuItem newOptionMenuToolStripMenuItem; + private ToolTip toolTip; + private Panel PanelForMultipleClassesSelection; + private ToolStripMenuItem singleCellsSimulatorToolStripMenuItem; private ToolStripSeparator toolStripSeparator15; - private ToolStripMenuItem generateDRCsToolStripMenuItem; - private GroupBox groupBox6; - private NumericUpDown numericUpDownManualThreshold; - private RadioButton radioButtonManualLowerThan; - private ComboBox comboBoxManualClassToBeAnalyzed; - private RadioButton radioButtonManualHigherThan; - private Label label13; - private RichTextBox richTextBoxForManualSelection; - private ComboBox comboBoxdescriptorToBeAnalyzed; - private Button buttonStartManualSelection; - private Label label14; + private ToolStripSeparator toolStripSeparator8; + private Button ButtonClustering; + private Button buttonNewClassificationProcess; + private Panel panelTMPForFeedBack; + private SplitContainer splitContainer1; + private ToolStripMenuItem testDisplayToolStripMenuItem; + private ToolStripMenuItem heatMapToolStripMenuItem; + private ToolStripMenuItem createAveragePlateToolStripMenuItem; + private ToolStripMenuItem testRStatsToolStripMenuItem; + private ToolStripTextBox toolStripTextBox1; + private ToolStripMenuItem testNewProjectorsToolStripMenuItem; + private ToolStrip toolStripMain; + private ToolStripButton toolStripButtonZoomOut; + private ToolStripButton toolStripButtonZoomIn; + private ToolStripSeparator toolStripSeparator11; + private ToolStripDropDownButton toolStripDropDownButtonApplyClass; + private ToolStripMenuItem globalToolStripMenuItem; + private ToolStripMenuItem globalIfOnlyActiveToolStripMenuItem; + private ToolStripSeparator toolStripSeparator16; + private ToolStripMenuItem ProcessModeCurrentPlateOnlyToolStripMenuItem; + public ToolStripMenuItem ProcessModeplateByPlateToolStripMenuItem; + public ToolStripMenuItem ProcessModeEntireScreeningToolStripMenuItem; + public ListBox listBoxSelectedWells; + public ComboBox comboBoxDescriptorToDisplay; + private ToolStripMenuItem testBoxPlotToolStripMenuItem; + private ToolStripMenuItem qualityControlsToolStripMenuItem; + private ToolStripMenuItem zScoreToolStripMenuItem; + private ToolStripMenuItem normalProbabilityPlotToolStripMenuItem2; + private ToolStripMenuItem systematicErrorsToolStripMenuItem; + private ToolStripMenuItem correlationAnalysisToolStripMenuItem; + private ToolStripMenuItem aToolStripMenuItem; + private ToolStripMenuItem correlationMatrixToolStripMenuItem1; + private ToolStripMenuItem ftestdescBasedToolStripMenuItem; + private ToolStripMenuItem stackedHistogramsToolStripMenuItem; + public ComboBox comboBoxClass; + private ToolStripMenuItem testLinearRegressionToolStripMenuItem; + private ToolStripMenuItem covarianceMatrixToolStripMenuItem; + private ToolStripMenuItem hitIdentificationToolStripMenuItem; + private ToolStripMenuItem mahalanobisDistanceToolStripMenuItem; + private ToolStripMenuItem projectionsToolStripMenuItem1; + private ToolStripMenuItem pCAToolStripMenuItem1; + private ToolStripMenuItem lDAToolStripMenuItem; + private ToolStripMenuItem testMultiScatterToolStripMenuItem; + public ToolStripDropDownButton toolStripDropDownButtonProcessMode; + private CheckBox checkBoxWellClassAsPhenoClass; + private ToolStripMenuItem statisticsToolStripMenuItem1; + private ToolStripMenuItem pathwayExpressionToolStripMenuItem; } } diff --git a/WindowHCSAnalyzer.cs b/WindowHCSAnalyzer.cs index 67a8133..4e2b72e 100644 --- a/WindowHCSAnalyzer.cs +++ b/WindowHCSAnalyzer.cs @@ -19,7 +19,6 @@ using LibPlateAnalysis; using weka.core; using System.IO; -using HCSAnalyzer.jp.genome.soap; using HCSAnalyzer.Forms; using HCSAnalyzer.Controls; using System.Reflection; @@ -42,9 +41,32 @@ using System.Diagnostics; using System.Threading.Tasks; using HCSAnalyzer.Forms.IO; - - - +using ImageAnalysis; +using HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection; +using HCSAnalyzer.Simulator.Classes; +using HCSAnalyzer.Simulator.Forms; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using HCSAnalyzer.Classes.Machine_Learning; +using HCSAnalyzer.Forms.FormsForOptions.ClassForOptions.Children; +using HCSAnalyzer.TMP_ToBeRemoved; +using HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic; +using HCSAnalyzer.Classes.Base_Classes.DataStructures; +using HCSAnalyzer.Classes.Base_Classes.Viewers; +using HCSAnalyzer.Classes.Base_Classes.Data; +using RDotNet; +using HCSAnalyzer.Classes.Base_Classes.DataAnalysis; +using HCSAnalyzer.Classes.Base_Classes; +using HCSAnalyzer.Classes.Base_Classes.DataProcessing; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.Base_Classes.GUI; +using HCSAnalyzer.Classes.MetaComponents; +using HCSAnalyzer.Classes.DataAnalysis; +using HCSAnalyzer.Classes.General; +using System.Net; +using Excel = Microsoft.Office.Interop.Excel; +using HCSAnalyzer.GUI.FormsForGraphsDisplay; ////////////////////////////////////////////////////////////////////////// // If you want to change Menu & Name of plugin // Go to "Properties->Resources" in Solution Explorer @@ -53,7 +75,7 @@ // You can also use your own Painter & Mouse event handler // ////////////////////////////////////////////////////////////////////////// - +// toto namespace HCSAnalyzer { public partial class HCSAnalyzer : Form @@ -63,13 +85,18 @@ public partial class HCSAnalyzer : Form FormConsole MyConsole; PlatesListForm PlateListWindow; cGlobalInfo GlobalInfo; + CheckBox checkBoxDisplayClasses = new CheckBox(); + CheckBox checkBoxApplyTo_AllPlates = new CheckBox(); + + ContextMenuStrip contextMenuStripStatOptions = new ContextMenuStrip(); + ToolStripMenuItem _StatCVItem; + ToolStripMenuItem _StatMeanItem; + ToolStripMenuItem _StatSumItem; public HCSAnalyzer() { InitializeComponent(); - - ToolTip toolTip1 = new ToolTip(); // Set up the delays for the ToolTip. @@ -84,8 +111,6 @@ public HCSAnalyzer() toolTip1.SetToolTip(this.radioButtonDimRedSupervised, "Supervised feature selection.\nThese approaches have learning porcess based on the well classes except for the neutral class."); comboBoxMethodForCorrection.SelectedIndex = 0; - - comboBoxClusteringMethod.SelectedIndex = 0; comboBoxCLassificationMethod.SelectedIndex = 0; comboBoxNeutralClassForClassif.SelectedIndex = 2; comboBoxReduceDimSingleClass.SelectedIndex = 0; @@ -103,14 +128,51 @@ public HCSAnalyzer() buttonReduceDim.Focus(); buttonReduceDim.Select(); + + + + // ToolStripMenuItem UnselectItem = new ToolStripMenuItem("Options"); + //UnselectItem.Click += new System.EventHandler(this.UnselectItem); + // contextMenuStripStatOptions.Items.Add(UnselectItem); + + // contextMenuStripStatOptions.Items.Add(new ToolStripSeparator()); + + _StatMeanItem = new ToolStripMenuItem("Mean"); + _StatMeanItem.CheckOnClick = true; + _StatMeanItem.Click += new System.EventHandler(this.StatMeanItem); + contextMenuStripStatOptions.Items.Add(_StatMeanItem); + + _StatCVItem = new ToolStripMenuItem("Coefficient of Variation"); + _StatCVItem.CheckOnClick = true; + _StatCVItem.CheckState = CheckState.Checked; + _StatCVItem.Click += new System.EventHandler(this.StatCVItem); + contextMenuStripStatOptions.Items.Add(_StatCVItem); + + + _StatSumItem = new ToolStripMenuItem("Sum"); + _StatSumItem.CheckOnClick = true; + _StatSumItem.Click += new System.EventHandler(this.StatSumItem); + contextMenuStripStatOptions.Items.Add(_StatSumItem); + + } + private void HCSAnalyzer_Load(object sender, EventArgs e) { GlobalInfo = new cGlobalInfo(CompleteScreening, this); + this.comboBoxClass.Items.Add("Inactive"); + foreach (var item in GlobalInfo.ListWellClasses) + { + this.comboBoxClass.Items.Add(item.Name); + //this.comboBoxClass.Items[this.comboBoxClass.Items.Count-1]. + } + + + // GlobalInfo.WindowName = this.Text; - this.Text = GlobalInfo.WindowName + String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString()) + " (Scalar Mode)"; + this.Text = GlobalInfo.WindowName + " (Scalar Mode)"; GlobalInfo.OptionsWindow.Visible = false; GlobalInfo.ComboForSelectedDesc = this.comboBoxDescriptorToDisplay; @@ -130,8 +192,96 @@ private void HCSAnalyzer_Load(object sender, EventArgs e) GlobalInfo.panelForPlate = this.panelForPlate; comboBoxClass.SelectedIndex = 1; + + + // CheckBox cb = new CheckBox(); + //cb.Text = "test"; + //cb.CheckStateChanged += (s, ex) => + //this.Text = cb.CheckState.ToString(); + //ToolStripControlHost host = new ToolStripControlHost(cb); + //toolStrip1.Items.Insert(0,host); + + + + // this.toolStripMain.DataBindings.Add("Checked", this.checkBox1, "Checked"); + + + checkBoxDisplayClasses.Text = "Display Class"; + checkBoxDisplayClasses.Appearance = Appearance.Button; + checkBoxDisplayClasses.FlatStyle = FlatStyle.Popup; + checkBoxDisplayClasses.CheckedChanged += new EventHandler(checkBoxDisplayClasses_CheckedChanged); + + ToolStripControlHost host = new ToolStripControlHost(checkBoxDisplayClasses); + toolStripMain.Items.Insert(0, host); + + checkBoxApplyTo_AllPlates.Text = "Apply to all plates"; + checkBoxApplyTo_AllPlates.Appearance = Appearance.Button; + checkBoxApplyTo_AllPlates.FlatStyle = FlatStyle.Popup; + checkBoxApplyTo_AllPlates.CheckedChanged += new EventHandler(checkBoxApplyTo_AllPlates_CheckedChanged); + + ToolStripControlHost hostcheckBoxApplyTo_AllPlates = new ToolStripControlHost(checkBoxApplyTo_AllPlates); + toolStripMain.Items.Insert(5, hostcheckBoxApplyTo_AllPlates); + + // check command line arguments and process them + if (System.Environment.GetCommandLineArgs().Length > 1) + { + List LArg = new List(); + int FileMode = 0; + foreach (string arg in System.Environment.GetCommandLineArgs()) + { + if (arg.ToLower() == "-todb") + { + FileMode = 1; + } + else + { + LArg.Add(System.Environment.GetCommandLineArgs()[1]); + } + } + + if (FileMode == 0) + { + FormForImportExcel CSVFeedBackWindow = LoadCSVAssay(LArg.ToArray(), false); + if (CSVFeedBackWindow == null) return; + if (CSVFeedBackWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + ProcessOK(CSVFeedBackWindow); + + UpdateUIAfterLoading(); + return; + } + else if (FileMode == 1) + { + CSVtoDB(LArg[0]); + + return; + } + + + } + } + + void checkBoxDisplayClasses_CheckedChanged(object sender, EventArgs e) + { + GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; + classViewToolStripMenuItem.Checked = checkBoxDisplayClasses.Checked; + + if (CompleteScreening == null) return; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + void checkBoxApplyTo_AllPlates_CheckedChanged(object sender, EventArgs e) + { + if (checkBoxApplyTo_AllPlates.Checked) + this.Cursor = Cursors.Default; + else + this.Cursor = Cursors.Cross; + if (CompleteScreening == null) return; + CompleteScreening.IsSelectionApplyToAllPlates = checkBoxApplyTo_AllPlates.Checked; + + } + + #region Math Tools public double std(double[] input) { @@ -278,7 +428,11 @@ private void tabControlMain_DragDrop(object sender, DragEventArgs e) string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if (files[0].Remove(0, files[0].Length - 4) == ".csv") { - LoadCSVAssay(files, false); + FormForImportExcel CSVFeedBackWindow = LoadCSVAssay(files, false); + if (CSVFeedBackWindow == null) return; + if (CSVFeedBackWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + ProcessOK(CSVFeedBackWindow); + UpdateUIAfterLoading(); } } @@ -297,31 +451,44 @@ private void checkedListBoxActiveDescriptors_MouseDown(object sender, MouseEvent ToolStripMenuItem UnselectItem = new ToolStripMenuItem("Unselect all"); UnselectItem.Click += new System.EventHandler(this.UnselectItem); + contextMenuStripActorPicker.Items.Add(UnselectItem); ToolStripMenuItem SelectAllItem = new ToolStripMenuItem("Select all"); SelectAllItem.Click += new System.EventHandler(this.SelectAllItem); + contextMenuStripActorPicker.Items.Add(SelectAllItem); + + ToolStripMenuItem RemoveSelectedItem = new ToolStripMenuItem("Remove Selected Descriptors"); + RemoveSelectedItem.Click += new System.EventHandler(this.RemoveSelectedItem); + contextMenuStripActorPicker.Items.Add(RemoveSelectedItem); - ToolStripMenuItem DescriptorsView = new ToolStripMenuItem("Descriptors View"); - DescriptorsView.Click += new System.EventHandler(this.DescriptorsView); + contextMenuStripActorPicker.Items.Add(new ToolStripSeparator()); + //ToolStripMenuItem DescriptorsView = new ToolStripMenuItem("Descriptors View"); + //DescriptorsView.Click += new System.EventHandler(this.DescriptorsView); + //contextMenuStripActorPicker.Items.Add(DescriptorsView); + ToolStripMenuItem ToolStripGenerateMenuItems = new ToolStripMenuItem("Generate descriptor"); ToolStripMenuItem ConcentrationToDescriptorItem = new ToolStripMenuItem("Concentration to descriptor"); ConcentrationToDescriptorItem.Click += new System.EventHandler(this.ConcentrationToDescriptorItem); + ToolStripGenerateMenuItems.DropDownItems.Add(ConcentrationToDescriptorItem); ToolStripMenuItem ColumnToDescriptorItem = new ToolStripMenuItem("Column to descriptor"); ColumnToDescriptorItem.Click += new System.EventHandler(this.ColumnToDescriptorItem); + ToolStripGenerateMenuItems.DropDownItems.Add(ColumnToDescriptorItem); ToolStripMenuItem RowToDescriptorItem = new ToolStripMenuItem("Row to descriptor"); RowToDescriptorItem.Click += new System.EventHandler(this.RowToDescriptorItem); + ToolStripGenerateMenuItems.DropDownItems.Add(RowToDescriptorItem); + ToolStripMenuItem ToolStripConvertMenuItems = new ToolStripMenuItem("Operations"); - ToolStripConvertMenuItems.DropDownItems.Add(ConcentrationToDescriptorItem); - ToolStripConvertMenuItems.DropDownItems.Add(ColumnToDescriptorItem); - ToolStripConvertMenuItems.DropDownItems.Add(RowToDescriptorItem); if (GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.CheckedItems.Count >= 2) { + // ToolStripSeparator ToolStripSep = new ToolStripSeparator(); + // ToolStripConvertMenuItems.DropDownItems.Add(ToolStripSep); + ToolStripMenuItem SumCheckedDescToDescriptorItem = new ToolStripMenuItem("Sum checked descriptors"); SumCheckedDescToDescriptorItem.Click += new System.EventHandler(this.SumCheckedDescToDescriptorItem); ToolStripConvertMenuItems.DropDownItems.Add(SumCheckedDescToDescriptorItem); @@ -330,15 +497,22 @@ private void checkedListBoxActiveDescriptors_MouseDown(object sender, MouseEvent MultiplyCheckedDescToDescriptorItem.Click += new System.EventHandler(this.MultiplyCheckedDescToDescriptorItem); ToolStripConvertMenuItems.DropDownItems.Add(MultiplyCheckedDescToDescriptorItem); - ToolStripMenuItem GenerateLADDescriptorItem = new ToolStripMenuItem("Generate LDA optimized descriptor"); + ToolStripMenuItem GenerateLADDescriptorItem = new ToolStripMenuItem("LDA optimized descriptor"); GenerateLADDescriptorItem.Click += new System.EventHandler(this.GenerateLADDescriptorItem); ToolStripConvertMenuItems.DropDownItems.Add(GenerateLADDescriptorItem); + ToolStripSeparator NewSep = new ToolStripSeparator(); + ToolStripConvertMenuItems.DropDownItems.Add(NewSep); - ToolStripMenuItem GeneratePCADescriptorItem = new ToolStripMenuItem("Generate PCA axis"); + ToolStripMenuItem GeneratePCADescriptorItem = new ToolStripMenuItem("PCA projection"); GeneratePCADescriptorItem.Click += new System.EventHandler(this.GeneratePCADescriptorItem); ToolStripConvertMenuItems.DropDownItems.Add(GeneratePCADescriptorItem); + ToolStripMenuItem GenerateRandomProjectionDescriptorItem = new ToolStripMenuItem("Random projection"); + GenerateRandomProjectionDescriptorItem.Click += new System.EventHandler(this.GenerateRandomProjectionDescriptorItem); + ToolStripConvertMenuItems.DropDownItems.Add(GenerateRandomProjectionDescriptorItem); + + } ToolStripSeparator SepratorStrip = new ToolStripSeparator(); @@ -348,80 +522,153 @@ private void checkedListBoxActiveDescriptors_MouseDown(object sender, MouseEvent int IdxItem = checkedListBoxActiveDescriptors.IndexFromPoint(e.Location);// locationOnForm.Y - 163; //int ItemHeight = checkedListBoxActiveDescriptors.GetItemHeight(0); // = VertPos / ItemHeight; + IntToTransfer = IdxItem; if ((IdxItem < CompleteScreening.ListDescriptors.Count) && ((IdxItem >= 0))) { - ToolStripMenuItem ToolStripMenuItems = new ToolStripMenuItem(CompleteScreening.ListDescriptors[IdxItem].GetName()); + List ToolStripMenuItems = CompleteScreening.ListDescriptors[IdxItem].GetExtendedContextMenu(); - ToolStripMenuItem InfoDescItem = new ToolStripMenuItem("Info"); - IntToTransfer = IdxItem; - InfoDescItem.Click += new System.EventHandler(this.InfoDescItem); - ToolStripMenuItems.DropDownItems.Add(InfoDescItem); + //new ToolStripMenuItem(CompleteScreening.ListDescriptors[IdxItem].GetName()); + + //ToolStripMenuItem InfoDescItem = new ToolStripMenuItem("Info"); + //IntToTransfer = IdxItem; + //InfoDescItem.Click += new System.EventHandler(this.InfoDescItem); + //ToolStripMenuItems.DropDownItems.Add(InfoDescItem); + + //ToolStripMenuItem StackedHistoDescItem = new ToolStripMenuItem("Stacked Histo."); + //StackedHistoDescItem.Click += new System.EventHandler(this.StackedHistoDescItem); + //ToolStripMenuItems.DropDownItems.Add(StackedHistoDescItem); - if (CompleteScreening.ListDescriptors.Count >= 2) - { - ToolStripMenuItem RemoveDescItem = new ToolStripMenuItem("Remove"); - RemoveDescItem.Click += new System.EventHandler(this.RemoveDescItem); - ToolStripMenuItems.DropDownItems.Add(RemoveDescItem); - } - if (CompleteScreening.ListDescriptors[IntToTransfer].GetBinNumber() > 1) + //if (CompleteScreening.ListDescriptors.Count >= 2) + //{ + // ToolStripMenuItem RemoveDescItem = new ToolStripMenuItem("Remove"); + // RemoveDescItem.Click += new System.EventHandler(this.RemoveDescItem); + // ToolStripMenuItems.DropDownItems.Add(RemoveDescItem); + //} + + if (CompleteScreening.ListDescriptors[IdxItem].GetBinNumber() > 1) { + ToolStripMenuItems[0].DropDownItems.Add(new ToolStripSeparator()); + ToolStripMenuItem SplitDescItem = new ToolStripMenuItem("Split"); + SplitDescItem.ToolTipText = "Split the histogram bins in individual descriptor"; SplitDescItem.Click += new System.EventHandler(this.SplitDescItem); - ToolStripMenuItems.DropDownItems.Add(SplitDescItem); + ToolStripMenuItems[0].DropDownItems.Add(SplitDescItem); ToolStripMenuItem AverageDescItem = new ToolStripMenuItem("Average"); + AverageDescItem.ToolTipText = "Generate a single value descriptor, resulting from the averaging of the single cell values over a defined phenotype"; AverageDescItem.Click += new System.EventHandler(this.AverageDescItem); - ToolStripMenuItems.DropDownItems.Add(AverageDescItem); + ToolStripMenuItems[0].DropDownItems.Add(AverageDescItem); } - if (CompleteScreening.ListDescriptors[IntToTransfer].GetBinNumber() == 1) + if (CompleteScreening.ListDescriptors[IdxItem].GetBinNumber() == 1) { + ToolStripGenerateMenuItems.DropDownItems.Add(new ToolStripSeparator()); + ToolStripMenuItem AddCorrelatedDescItem = new ToolStripMenuItem("Generate Square"); AddCorrelatedDescItem.Click += new System.EventHandler(this.AddCorrelatedSquareDescItem); - ToolStripMenuItems.DropDownItems.Add(AddCorrelatedDescItem); + ToolStripGenerateMenuItems.DropDownItems.Add(AddCorrelatedDescItem); ToolStripMenuItem AddCorrelatedSineDescItem = new ToolStripMenuItem("Generate Sine"); AddCorrelatedSineDescItem.Click += new System.EventHandler(this.AddCorrelatedSineDescItem); - ToolStripMenuItems.DropDownItems.Add(AddCorrelatedSineDescItem); + ToolStripGenerateMenuItems.DropDownItems.Add(AddCorrelatedSineDescItem); ToolStripMenuItem AddCorrelatedCosineDescItem = new ToolStripMenuItem("Generate Cosine"); AddCorrelatedCosineDescItem.Click += new System.EventHandler(this.AddCorrelatedCosineDescItem); - ToolStripMenuItems.DropDownItems.Add(AddCorrelatedCosineDescItem); + ToolStripGenerateMenuItems.DropDownItems.Add(AddCorrelatedCosineDescItem); + + //ToolStripMenuItem AddCorrelatedExpDescItem = new ToolStripMenuItem("Generate Exp."); + //AddCorrelatedExpDescItem.Click += new System.EventHandler(this.AddCorrelatedExpDescItem); + //ToolStripGenerateMenuItems.DropDownItems.Add(AddCorrelatedExpDescItem); + + ToolStripGenerateMenuItems.DropDownItems.Add(new ToolStripSeparator()); + + ToolStripMenuItem DuplicateDescItem = new ToolStripMenuItem("Duplicate"); + DuplicateDescItem.Click += new System.EventHandler(this.DuplicateDescItem); + ToolStripGenerateMenuItems.DropDownItems.Add(DuplicateDescItem); + } + if (GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.CheckedItems.Count >= 2) + { + contextMenuStripActorPicker.Items.Add(ToolStripGenerateMenuItems); + contextMenuStripActorPicker.Items.Add(ToolStripConvertMenuItems); + + foreach (var item in ToolStripMenuItems) + contextMenuStripActorPicker.Items.Add(item); + } + else + { + contextMenuStripActorPicker.Items.Add(ToolStripGenerateMenuItems); + foreach (var item in ToolStripMenuItems) + contextMenuStripActorPicker.Items.Add(item); } - contextMenuStripActorPicker.Items.AddRange(new ToolStripItem[] { UnselectItem, SelectAllItem, DescriptorsView, ToolStripConvertMenuItems, ToolStripMenuItems }); } else { - contextMenuStripActorPicker.Items.AddRange(new ToolStripItem[] { UnselectItem, SelectAllItem, DescriptorsView, ToolStripConvertMenuItems }); + if (GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.CheckedItems.Count >= 2) + contextMenuStripActorPicker.Items.AddRange(new ToolStripItem[] { ToolStripGenerateMenuItems, ToolStripConvertMenuItems }); + else + contextMenuStripActorPicker.Items.AddRange(new ToolStripItem[] { ToolStripGenerateMenuItems }); } contextMenuStripActorPicker.Show(Control.MousePosition); } static int IntToTransfer; - void RemoveDescItem(object sender, EventArgs e) + //void RemoveDescItem(object sender, EventArgs e) + //{ + // System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the selected descriptor will be definitively removed from this analysis ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + // if (ResWin == System.Windows.Forms.DialogResult.No) return; + // CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); + + + // //CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + // for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + // CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + // CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + //} + + + void RemoveSelectedItem(object sender, EventArgs e) { + if (checkedListBoxActiveDescriptors.Items.Count == CompleteScreening.ListDescriptors.GetListNameActives().Count) + { + MessageBox.Show("You cannot remove all the descriptors !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the selected descriptor will be definitively removed from this analysis ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (ResWin == System.Windows.Forms.DialogResult.No) return; - CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); + int NumDesc = checkedListBoxActiveDescriptors.Items.Count; + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + if ((CompleteScreening.ListDescriptors[i].IsActive())) + { + //CompleteScreening.ListDescriptors[i].; + CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[i], CompleteScreening); + i--; + } + } //CompleteScreening.UpDatePlateListWithFullAvailablePlate(); for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - void DescriptorsView(object sender, EventArgs e) - { - CompleteScreening.GetCurrentDisplayPlate().DisplayDescriptorsWindow(); - } - void InfoDescItem(object sender, EventArgs e) - { - CompleteScreening.ListDescriptors[IntToTransfer].WindowDescriptorInfo.ShowDialog(); - CompleteScreening.ListDescriptors.UpDateDisplay(); - } + + //void InfoDescItem(object sender, EventArgs e) + //{ + // CompleteScreening.ListDescriptors[IntToTransfer].WindowDescriptorInfo.ShowDialog(); + // CompleteScreening.ListDescriptors.UpDateDisplay(); + //} + + //void StackedHistoDescItem(object sender, EventArgs e) + //{ + // DisplayStackedHisto(IntToTransfer); + //} + void UnselectItem(object sender, EventArgs e) { @@ -473,6 +720,32 @@ private void ConcentrationToDescriptorItem(object sender, EventArgs e) CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); } + private void DuplicateDescItem(object sender, EventArgs e) + { + cDescriptorsType ColumnType = new cDescriptorsType("Duplicate(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo); + + CompleteScreening.ListDescriptors.AddNew(ColumnType); + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) + { + List LDesc = new List(); + + cDescriptor NewDesc = new cDescriptor(Tmpwell.ListDescriptors[IntToTransfer].GetValue(), ColumnType, CompleteScreening); + LDesc.Add(NewDesc); + + Tmpwell.AddDescriptors(LDesc); + } + } + + CompleteScreening.ListDescriptors.UpDateDisplay(); + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + } + private void AddCorrelatedCosineDescItem(object sender, EventArgs e) { cDescriptorsType ColumnType = new cDescriptorsType("Cosine(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo); @@ -499,6 +772,31 @@ private void AddCorrelatedCosineDescItem(object sender, EventArgs e) CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); } + private void AddCorrelatedExpDescItem(object sender, EventArgs e) + { + cDescriptorsType ColumnType = new cDescriptorsType("Exp(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo); + + CompleteScreening.ListDescriptors.AddNew(ColumnType); + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) + { + List LDesc = new List(); + + cDescriptor NewDesc = new cDescriptor(Math.Exp(Tmpwell.ListDescriptors[IntToTransfer].GetValue()), ColumnType, CompleteScreening); + LDesc.Add(NewDesc); + + Tmpwell.AddDescriptors(LDesc); + } + } + + CompleteScreening.ListDescriptors.UpDateDisplay(); + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + } private void AddCorrelatedSineDescItem(object sender, EventArgs e) { cDescriptorsType ColumnType = new cDescriptorsType("Sine(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo); @@ -604,16 +902,20 @@ private void SumCheckedDescToDescriptorItem(object sender, EventArgs e) private void GenerateLADDescriptorItem(object sender, EventArgs e) { - FormForPCAAxisGeneration WindowClassification = new FormForPCAAxisGeneration(CompleteScreening); + FormForProjections WindowClassification = new FormForProjections(CompleteScreening); //WindowClassification.buttonClassification.Text = "Process"; WindowClassification.label1.Text = "Neutral Class"; WindowClassification.Text = "LDA"; WindowClassification.IsPCA = false; WindowClassification.numericUpDownNumberOfAxis.Visible = false; WindowClassification.labelAxeNumber.Visible = false; - // - // int NeutralClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true, eClassType.WELL); + ClassSelectionPanel.Height = WindowClassification.panelForClasses.Height; + ClassSelectionPanel.UnSelectAll(); + ClassSelectionPanel.Select(0); + ClassSelectionPanel.Select(1); + WindowClassification.panelForClasses.Controls.Add(ClassSelectionPanel); cExtendPlateList PlatesToProcess = new cExtendPlateList(); if (WindowClassification.radioButtonFromCurrentPlate.Checked) @@ -628,18 +930,18 @@ private void GenerateLADDescriptorItem(object sender, EventArgs e) private void GeneratePCADescriptorItem(object sender, EventArgs e) { - - - FormForPCAAxisGeneration WindowClassification = new FormForPCAAxisGeneration(CompleteScreening); + FormForProjections WindowClassification = new FormForProjections(CompleteScreening); //WindowClassification.buttonClassification.Text = "Process"; WindowClassification.label1.Text = "Class of Interest"; WindowClassification.Text = "PCA"; WindowClassification.IsPCA = true; WindowClassification.numericUpDownNumberOfAxis.Maximum = CompleteScreening.GetNumberOfActiveDescriptor(); - // if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true, eClassType.WELL); + ClassSelectionPanel.Height = WindowClassification.panelForClasses.Height; + ClassSelectionPanel.UnSelectAll(); + ClassSelectionPanel.Select(2); + WindowClassification.panelForClasses.Controls.Add(ClassSelectionPanel); @@ -651,9 +953,25 @@ private void GeneratePCADescriptorItem(object sender, EventArgs e) WindowClassification.PlatesToProcess = PlatesToProcess; if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + } + private void GenerateRandomProjectionDescriptorItem(object sender, EventArgs e) + { + FormForProjections WindowClassification = new FormForProjections(CompleteScreening); + //WindowClassification.buttonClassification.Text = "Process"; + WindowClassification.label1.Text = "Class of Interest"; + WindowClassification.Text = "Random Projection"; + WindowClassification.IsPCA = true; + WindowClassification.numericUpDownNumberOfAxis.Maximum = CompleteScreening.GetNumberOfActiveDescriptor(); + cExtendPlateList PlatesToProcess = new cExtendPlateList(); + if (WindowClassification.radioButtonFromCurrentPlate.Checked) + PlatesToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); + else + PlatesToProcess = CompleteScreening.ListPlatesActive; + WindowClassification.PlatesToProcess = PlatesToProcess; + if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; } @@ -792,22 +1110,72 @@ private void AverageDescItem(object sender, EventArgs e) { //int NumBin = CompleteScreening.ListDescriptors[IntToTransfer].GetBinNumber(); + + + + // first we update the descriptor - cDescriptorsType NewAverageType = new cDescriptorsType("Average(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo); + cGUI_ListClasses GUILC = new cGUI_ListClasses(); + GUILC.ClassType = eClassType.PHENOTYPE; + GUILC.IsSelectAll = true; + GUILC.Run(GlobalInfo); + //GUILC. + // return; + + + List LCP = new List(); + for (int IdxPheno = 0; IdxPheno < GUILC.GetOutPut().Count; IdxPheno++) + { + if (GUILC.GetOutPut()[IdxPheno] == 1) + LCP.Add(GlobalInfo.ListCellularPhenotypes[IdxPheno]); + } + if (LCP.Count == 0) return; + + string description = "This descriptor has been generated using the following phenotypic sub-populations:\n"; + foreach (var item in LCP) + { + description += item.Name + "\n"; + } + cDescriptorsType NewAverageType = new cDescriptorsType("Average(" + CompleteScreening.ListDescriptors[IntToTransfer].GetName() + ")", true, 1, GlobalInfo, description); CompleteScreening.ListDescriptors.AddNew(NewAverageType); + FormForProgress ProgressWindow = new FormForProgress(); + ProgressWindow.Show(); + + int IdxProgress = 0; + int MaxProgress = 0; + + foreach (cPlate CurrentPlateToProcess in GlobalInfo.CurrentScreen.ListPlatesAvailable) + MaxProgress += (int)CurrentPlateToProcess.ListActiveWells.Count; + ProgressWindow.progressBar.Maximum = MaxProgress; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) { foreach (cWell Tmpwell in TmpPlate.ListActiveWells) { + TmpPlate.DBConnection = new cDBConnection(TmpPlate, Tmpwell.SQLTableName); + List LDT = new List(); + LDT.Add(CompleteScreening.ListDescriptors[IntToTransfer]); + + cExtendedTable CT = TmpPlate.DBConnection.GetWellValues(Tmpwell, LDT, LCP); List LDesc = new List(); - cDescriptor NewDesc = new cDescriptor(Tmpwell.ListDescriptors[IntToTransfer].Histogram.GetAverageValue(), NewAverageType, CompleteScreening); + + double Value = 0; + if (CT.Count == 1) + Value = CT[0].Average(); + + cDescriptor NewDesc = new cDescriptor(Value, NewAverageType, CompleteScreening); LDesc.Add(NewDesc); Tmpwell.AddDescriptors(LDesc); + TmpPlate.DBConnection.DB_CloseConnection(); + + ProgressWindow.progressBar.Value = IdxProgress++; } } + ProgressWindow.Close(); + CompleteScreening.ListDescriptors.UpDateDisplay(); CompleteScreening.UpDatePlateListWithFullAvailablePlate(); @@ -830,45 +1198,12 @@ private void buttonClearConsole_Click(object sender, EventArgs e) } - private void distributionToolStripMenuItem_Click(object sender, EventArgs e) - { - DisplayHistogram(false); - } - - private void checkBoxApplyToAllPlates_CheckedChanged(object sender, EventArgs e) - { - if (checkBoxApplyToAllPlates.Checked) - this.Cursor = Cursors.Default; - else - this.Cursor = Cursors.Cross; - if (CompleteScreening == null) return; - CompleteScreening.IsSelectionApplyToAllPlates = checkBoxApplyToAllPlates.Checked; - } - + //private void distributionToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // DisplayHistogram(false); + //} - /// - /// Zoom Out function - /// - /// - /// - private void buttonSizeDecrease_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - CompleteScreening.GlobalInfo.ChangeSize(0.8f); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - /// - /// Zoom In function - /// - /// - /// - private void buttonSizeIncrease_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - CompleteScreening.GlobalInfo.ChangeSize(1.2f); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } /// /// Change the slection mode (global or local) @@ -917,15 +1252,6 @@ private void GlobalSelection(bool OnlyOnSelected) CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); } - /// - /// Switch to global selection - /// - /// - /// - private void buttonGlobalOnlySelected_Click(object sender, EventArgs e) - { - GlobalSelection(true); - } /// /// Manage the event related to the active plate selection combo list @@ -937,7 +1263,7 @@ private void toolStripcomboBoxPlateList_SelectedIndexChanged(object sender, Even CompleteScreening.CurrentDisplayPlateIdx = this.toolStripcomboBoxPlateList.SelectedIndex; if (CompleteScreening.CurrentDisplayPlateIdx == -1) return; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } /// @@ -949,6 +1275,9 @@ private void comboBoxClass_SelectedIndexChanged(object sender, EventArgs e) { if (CompleteScreening == null) return; CompleteScreening.SetSelectionType(comboBoxClass.SelectedIndex - 1); + + if (comboBoxClass.SelectedIndex >= 1) + comboBoxClass.BackColor = GlobalInfo.ListWellClasses[comboBoxClass.SelectedIndex - 1].ColourForDisplay; CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); } @@ -989,10 +1318,17 @@ private void checkedListBoxDescriptorActive_SelectedIndexChanged(object sender, private void comboBoxDescriptorToDisplay_SelectedIndexChanged(object sender, EventArgs e) { - CompleteScreening.ListDescriptors.CurrentSelectedDescriptor = (int)comboBoxDescriptorToDisplay.SelectedIndex; + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx = (int)comboBoxDescriptorToDisplay.SelectedIndex; if ((!checkBoxDisplayClasses.Checked) && (GlobalInfo.ViewMode != eViewMode.PIE)) - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + + //ToolTip ToolTipFor1 = new ToolTip(); + //ToolTipFor1.AutoPopDelay = 5000; + //ToolTipFor1.InitialDelay = 500; + //ToolTipFor1.ReshowDelay = 500; + //ToolTipFor1.ShowAlways = true; + //ToolTipFor1.SetToolTip(comboBoxDescriptorToDisplay, comboBoxDescriptorToDisplay.Text); } @@ -1001,7 +1337,7 @@ private void StartingUpDateUI() MyConsole = new FormConsole(); GlobalInfo.CurrentRichTextBox = this.MyConsole.richTextBoxConsole; - CompleteScreening.ListDescriptors.CurrentSelectedDescriptor = 0; + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx = 0; CompleteScreening.CurrentDisplayPlateIdx = 0; GlobalInfo.LabelForClass = this.labelNumClasses; CompleteScreening.LabelForMin = this.labelMin; @@ -1017,7 +1353,7 @@ private void StartingUpDateUI() // CompleteScreening.ListBoxSelectedPlates = PlateListWindow.listBoxPlateNameToProcess; this.toolStripcomboBoxPlateList.Items.Clear(); - CompleteScreening.IsSelectionApplyToAllPlates = checkBoxApplyToAllPlates.Checked; + CompleteScreening.IsSelectionApplyToAllPlates = checkBoxApplyTo_AllPlates.Checked; GlobalInfo.CurrentScreen = CompleteScreening; } @@ -1026,7 +1362,7 @@ private void panelForLUT_Paint(object sender, PaintEventArgs e) if ((CompleteScreening == null) || (CompleteScreening.ListPlatesAvailable.Count == 0) || (CompleteScreening.ISLoading)) return; - CompleteScreening.GetCurrentDisplayPlate().DisplayLUT(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor); + CompleteScreening.GetCurrentDisplayPlate().DisplayLUT(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); } private void dataGridViewForQualityControl_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e) @@ -1042,15 +1378,15 @@ private void dataGridViewForQualityControl_CellContentDoubleClick(object sender, int PosDesc = this.comboBoxDescriptorToDisplay.FindStringExact(DescName); comboBoxDescriptorToDisplay.SelectedIndex = PosDesc; - CompleteScreening.ListDescriptors.CurrentSelectedDescriptor = (int)comboBoxDescriptorToDisplay.SelectedIndex; + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx = (int)comboBoxDescriptorToDisplay.SelectedIndex; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } private void comboBoxDimReductionNeutralClass_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxDimReductionNeutralClass.Items[e.Index].ToString(), comboBoxDimReductionNeutralClass.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -1060,7 +1396,7 @@ private void comboBoxDimReductionNeutralClass_DrawItem(object sender, DrawItemEv private void comboBoxNeutralClassForClassif_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); e.Graphics.DrawString(comboBoxNeutralClassForClassif.Items[e.Index].ToString(), comboBoxNeutralClassForClassif.Font, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); @@ -1100,44 +1436,37 @@ private void UpdateUIAfterLoading() pluginsToolStripMenuItem.Enabled = true; exportToolStripMenuItem.Enabled = true; appendDescriptorsToolStripMenuItem.Enabled = true; - linkToolStripMenuItem.Enabled = true; + //linkToolStripMenuItem.Enabled = true; copyAverageValuesToolStripMenuItem1.Enabled = true; copyClassesToolStripMenuItem.Enabled = true; swapClassesToolStripMenuItem.Enabled = true; applySelectionToScreenToolStripMenuItem.Enabled = true; visualizationToolStripMenuItem.Enabled = true; StatisticsToolStripMenuItem.Enabled = true; + hitIdentificationToolStripMenuItem.Enabled = true; buttonReduceDim.Enabled = true; - visualizationToolStripMenuItemPCA.Enabled = true; + visualizationToolStripMenuItemFullScreen.Enabled = true; qualityControlToolStripMenuItem.Enabled = true; buttonQualityControl.Enabled = true; buttonCorrectionPlateByPlate.Enabled = true; buttonRejectPlates.Enabled = true; buttonNormalize.Enabled = true; - buttonCluster.Enabled = true; + ButtonClustering.Enabled = true; buttonStartClassification.Enabled = true; buttonExport.Enabled = true; + buttonDisplayWellsSelectionData.Enabled = true; platesManagerToolStripMenuItem.Enabled = true; betaToolStripMenuItem.Enabled = true; toolStripMenuItemGeneAnalysis.Enabled = true; - projectionsToolStripMenuItem.Enabled = true; viewToolStripMenuItem.Enabled = true; - - CompleteScreening.ISLoading = false; comboBoxDescriptorToDisplay.SelectedIndex = 0; string NamePlate = PlateListWindow.listBoxAvaliableListPlates.Items[0].ToString(); toolStripcomboBoxPlateList.Text = NamePlate + " "; if (checkBoxDisplayClasses.Checked) - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - - listBoxSelectedWells.Items.Clear(); - - - GlobalInfo.WindowForDRCDesign.Reset(); - + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } } @@ -1179,7 +1508,7 @@ public void RefreshInfoScreeningRichBox() TmpText = "List Classes:\n\n"; for (int IdxClass = 0; IdxClass < ListClass.Length; IdxClass++) { - TmpText += "Class " + IdxClass; + TmpText += GlobalInfo.ListWellClasses[IdxClass].Name; double Percent = (100 * ListClass[IdxClass]) / (double)TotalWells; TmpText += " : " + ListClass[IdxClass] + "\t <=>\t " + Percent.ToString("N3") + " %\n"; @@ -1191,6 +1520,34 @@ public void RefreshInfoScreeningRichBox() private void tabControlMain_SelectedIndexChanged(object sender, EventArgs e) { RefreshInfoScreeningRichBox(); + RefreshSingleCellAnalysis(); + // RefreshClustering(); + } + + //void RefreshClustering() + //{ + // if (tabControlMain.SelectedTab.Name == "tabPageClassification") + // { + // panelForClassSelectionClustering.Controls.Clear(); + // PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo); + // ClassSelectionPanel.Height = panelForClassSelectionClustering.Height; + // ClassSelectionPanel.UnSelectAll(); + // panelForClassSelectionClustering.Controls.Add(ClassSelectionPanel); + // } + + //} + + void RefreshSingleCellAnalysis() + { + if (tabControlMain.SelectedTab.Name == "tabPageSingleCellAnalysis") + { + PanelForMultipleClassesSelection.Controls.Clear(); + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true, eClassType.WELL); + ClassSelectionPanel.Height = PanelForMultipleClassesSelection.Height; + ClassSelectionPanel.UnSelectAll(); + PanelForMultipleClassesSelection.Controls.Add(ClassSelectionPanel); + } + } @@ -1238,27 +1595,193 @@ private void panelForPlate_MouseDown(object sender, MouseEventArgs e) { if (CompleteScreening == null) return; + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + CompleteScreening.ClientPosFirst.X = e.X; + CompleteScreening.ClientPosFirst.Y = e.Y; + + // if (GlobalInfo.WindowForDRCDesign.Visible) return; + Point locationOnForm = this.panelForPlate.FindForm().PointToClient(Control.MousePosition); + // int VertPos = locationOnForm.Y - 163; + // Make a note that we "have the mouse". + bHaveMouse = true; - CompleteScreening.ClientPosFirst.X = e.X; - CompleteScreening.ClientPosFirst.Y = e.Y; + // Store the "starting point" for this rubber-band rectangle. + CompleteScreening.ptOriginal.X = locationOnForm.X;// e.X + this.panelForPlate.Location.X/* + 10*/; + CompleteScreening.ptOriginal.Y = locationOnForm.Y;// e.Y + this.panelForPlate.Location.Y/* + 76*/; + // Special value lets us know that no previous + // rectangle needs to be erased. + CompleteScreening.ptLast.X = -1; + CompleteScreening.ptLast.Y = -1; + } + else if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + int ScrollShiftY = this.panelForPlate.VerticalScroll.Value; + int ScrollShiftX = this.panelForPlate.HorizontalScroll.Value; + int Gutter = (int)GlobalInfo.OptionsWindow.numericUpDownGutter.Value; - // if (GlobalInfo.WindowForDRCDesign.Visible) return; + int PosX = (int)((e.X - ScrollShiftX) / (GlobalInfo.SizeHistoWidth + Gutter)); + int PosY = (int)((e.Y - ScrollShiftY) / (GlobalInfo.SizeHistoHeight + Gutter)); + bool OnlyOnSelected = false; - Point locationOnForm = this.panelForPlate.FindForm().PointToClient(Control.MousePosition); + cExtendedList cExL = new cExtendedList(); + List Names = new List(); + string CurrentName = ""; - // int VertPos = locationOnForm.Y - 163; + #region Display plate heat map + if ((PosX == 0) && (PosY == 0)) + { + List ListWellsToProcess = new List(); + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); - // Make a note that we "have the mouse". - bHaveMouse = true; + cDesignerTab DT = new cDesignerTab(); - // Store the "starting point" for this rubber-band rectangle. - CompleteScreening.ptOriginal.X = locationOnForm.X;// e.X + this.panelForPlate.Location.X/* + 10*/; - CompleteScreening.ptOriginal.Y = locationOnForm.Y;// e.Y + this.panelForPlate.Location.Y/* + 76*/; - // Special value lets us know that no previous - // rectangle needs to be erased. - CompleteScreening.ptLast.X = -1; - CompleteScreening.ptLast.Y = -1; + for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) + { + if (!CompleteScreening.ListDescriptors[IdxDesc].IsActive()) continue; + + bool IsMissing; + + cExtendedTable NewTable = null; + if (!checkBoxDisplayClasses.Checked) + NewTable = new cExtendedTable(CompleteScreening.GetCurrentDisplayPlate().GetAverageValueDescTable(IdxDesc, out IsMissing)); + else + NewTable = new cExtendedTable(CompleteScreening.GetCurrentDisplayPlate().GetWellClassesTable()); + + foreach (var item in NewTable) + item.ListTags = new List(); + + for (int i = 0; i < CompleteScreening.Columns; i++) + for (int j = 0; j < CompleteScreening.Rows; j++) + { + cWell currentWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(i, CompleteScreening.Rows - j - 1, true); + NewTable[j].ListTags.Add(currentWell); + } + + for (int IdxCol = 0; IdxCol < NewTable.Count; IdxCol++) + NewTable[IdxCol].Name = "Column " + (IdxCol + 1); + + List ListRow = new List(); + for (int IdxRow = 0; IdxRow < NewTable[0].Count; IdxRow++) + ListRow.Add("Row " + (NewTable[0].Count - IdxRow)); + + NewTable.ListRowNames = ListRow; + if (!checkBoxDisplayClasses.Checked) + NewTable.Name = CompleteScreening.ListDescriptors[IdxDesc].GetName() + " (" + ListWellsToProcess.Count + " wells)"; + else + NewTable.Name = CompleteScreening.GetCurrentDisplayPlate().Name + " - Well Associated Classes (" + ListWellsToProcess.Count + " wells)"; + + cViewerHeatMap VHM = new cViewerHeatMap(); + VHM.SetInputData(NewTable); + VHM.GlobalInfo = GlobalInfo; + VHM.IsDisplayValues = false; + if (!checkBoxDisplayClasses.Checked) + VHM.Title = CompleteScreening.ListDescriptors[IdxDesc].GetName() + " (" + ListWellsToProcess.Count + " wells)"; + else + { + //VHM.ChartToBeIncluded + VHM.CurrentLUT = GlobalInfo.ListWellClasses.BuildLUT(); + VHM.IsAutomatedMinMax = false; + VHM.Min = 0; + VHM.Max = GlobalInfo.ListWellClasses.Count - 1; + VHM.IsWellClassLegend = true; + VHM.Title = CompleteScreening.GetCurrentDisplayPlate().Name + " - Well Associated Classes (" + ListWellsToProcess.Count + " wells)"; + } + VHM.Run(); + + DT.SetInputData(VHM.GetOutPut()); + + if (checkBoxDisplayClasses.Checked) break; + + } + + DT.Run(); + + cDisplayToWindow DWForPlate = new cDisplayToWindow(); + DWForPlate.SetInputData(DT.GetOutPut()); + DWForPlate.Run(); + DWForPlate.Display(); + return; + } + #endregion + #region Display column or row graphs + else if ((PosX == 0) && (PosY > 0)) + { + cExL.ListTags = new List(); + for (int col = 0; col < CompleteScreening.Columns; col++) + { + cPlate CurrentPlateToProcess = CompleteScreening.GetCurrentDisplayPlate(); + cWell TmpWell = CurrentPlateToProcess.GetWell(col, PosY - 1, OnlyOnSelected); + if (TmpWell == null) continue; + cExL.ListTags.Add(TmpWell); + cExL.Add(TmpWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); + Names.Add("Column " + col); + } + CurrentName = "Row " + PosY; + } + else if ((PosY == 0) && (PosX > 0)) + { + cExL.ListTags = new List(); + for (int row = 0; row < CompleteScreening.Rows; row++) + { + cPlate CurrentPlateToProcess = CompleteScreening.GetCurrentDisplayPlate(); + cWell TmpWell = CurrentPlateToProcess.GetWell(PosX - 1, row, OnlyOnSelected); + if (TmpWell == null) continue; + cExL.ListTags.Add(TmpWell); + + cExL.Add(TmpWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); + Names.Add("Row " + row); + } + CurrentName = "Column " + PosX; + } + #endregion + else + { + ContextMenuStrip NewMenu = new ContextMenuStrip(); + NewMenu.Items.Add(CompleteScreening.GetCurrentDisplayPlate().GetExtendedContextMenu()); + NewMenu.Show(Control.MousePosition); + return; + } + + cExtendedTable cExT = new cExtendedTable(cExL); + cExT.ListRowNames = Names; + + cExT.Name = CurrentName; + cExT[0].Name = CurrentName; + + + cViewerGraph1D CV = new cViewerGraph1D(); + CV.Chart.IsSelectable = true; + CV.Chart.LabelAxisX = "Well Index"; + CV.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + //V1D.Chart.BackgroundColor = Color.LightYellow; + CV.Chart.IsXAxis = true; + CV.Chart.IsLine = true; + CV.SetInputData(cExT); + + cFeedBackMessage Mess = CV.Run(); + if (!Mess.IsSucceed) + { + MessageBox.Show(Mess.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + //cViewerGraph CV = new cViewerGraph(); + //CV.SetInputData(cExT); + //CV.Run(); + + cDesignerSinglePanel CD = new cDesignerSinglePanel(); + CD.SetInputData(CV.GetOutPut()); + CD.Run(); + + cDisplayToWindow DW = new cDisplayToWindow(); + DW.SetInputData(CD.GetOutPut()); + DW.Run(); + DW.Display(); + // CV.Display(); + } } private void panelForPlate_MouseMove(object sender, MouseEventArgs e) @@ -1309,6 +1832,7 @@ private void panelForPlate_MouseUp(object sender, MouseEventArgs e) if (!GlobalInfo.WindowForDRCDesign.Visible) { CompleteScreening.GetCurrentDisplayPlate().UpDateWellsSelection(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } else { @@ -1406,7 +1930,7 @@ private void panelForPlate_MouseUp(object sender, MouseEventArgs e) // if (CompleteScreening.GlobalInfo.IsDisplayClassOnly) - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + } // Set flags to know that there is no "previous" line to reverse. CompleteScreening.ptLast.X = -1; @@ -1415,7 +1939,6 @@ private void panelForPlate_MouseUp(object sender, MouseEventArgs e) CompleteScreening.ptOriginal.Y = -1; } - private void panelForPlate_MouseWheel(object sender, MouseEventArgs e) { // Update the drawing based upon the mouse wheel scrolling. @@ -1427,21 +1950,11 @@ private void panelForPlate_MouseWheel(object sender, MouseEventArgs e) else CompleteScreening.GlobalInfo.ChangeSize(1.0f / (-1 * numberOfTextLinesToMove)); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - - #endregion #region Selection management - private void buttonGlobalSelection_Click(object sender, EventArgs e) - { - GlobalSelection(false); - // CompleteScreening.GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; - - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - private void applySelectionToScreenToolStripMenuItem_Click(object sender, EventArgs e) { if (CompleteScreening == null) return; @@ -1453,13 +1966,20 @@ private void swapClassesToolStripMenuItem_Click(object sender, EventArgs e) if (CompleteScreening == null) return; FormForSwapClasses WindowSwapClasses = new FormForSwapClasses(GlobalInfo); + + PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true, eClassType.WELL); + ClassSelectionPanel.Height = WindowSwapClasses.panelToBeSwapped.Height; + //ClassSelectionPanel.Location.Y = ClassSelectionPanel.Location.Y+ 20; + ClassSelectionPanel.UnSelectAll(); + WindowSwapClasses.panelToBeSwapped.Controls.Add(ClassSelectionPanel); + if (WindowSwapClasses.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; int Idx = 0; int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - int OriginalIdx = WindowSwapClasses.comboBoxOriginalClass.SelectedIndex - 1; + // int OriginalIdx = WindowSwapClasses.comboBoxOriginalClass.SelectedIndex - 1; int DestinatonIdx = WindowSwapClasses.comboBoxDestinationClass.SelectedIndex - 1; // loop on all the plate @@ -1473,7 +1993,7 @@ private void swapClassesToolStripMenuItem_Click(object sender, EventArgs e) cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, false); if (TmpWell == null) continue; - if (TmpWell.GetClass() == OriginalIdx) + if ((TmpWell.GetClassIdx() > -1) && (ClassSelectionPanel.GetListSelectedClass()[TmpWell.GetClassIdx()])) { if (DestinatonIdx == -1) TmpWell.SetAsNoneSelected(); @@ -1485,168 +2005,213 @@ private void swapClassesToolStripMenuItem_Click(object sender, EventArgs e) } } - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); MessageBox.Show(Idx + " wells have been swapped !", "Process over !", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } #endregion #region Scatter point graphs section - private void scatterPointsToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - Series CurrentSeries = new Series("ScatterPoints"); - CurrentSeries.ShadowOffset = 1; - - int Idx = 0; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) - { - cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); - if (TmpWell == null) continue; - CurrentSeries.Points.Add(TmpWell.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetValue()); - CurrentSeries.Points[Idx].Color = TmpWell.GetColor(); - CurrentSeries.Points[Idx].MarkerStyle = MarkerStyle.Circle; - CurrentSeries.Points[Idx].MarkerSize = 6; - if (!GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.Points[Idx].ToolTip = TmpWell.AssociatedPlate.Name + "\n" + TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; - Idx++; - } - } - - SimpleForm NewWindow = new SimpleForm(CompleteScreening); - - if (Idx > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) - NewWindow.Width = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; - else - NewWindow.Width = Idx; - NewWindow.Height = 400; - - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - CurrentChartArea.CursorX.IsUserSelectionEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); + //private void scatterPointsToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // if (CompleteScreening == null) return; + // Series CurrentSeries = new Series("ScatterPoints"); + // CurrentSeries.ShadowOffset = 1; + + // int Idx = 0; + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // // loop on all the plate + // for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + // { + // cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + + // for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + // for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + // { + // cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); + // if (TmpWell == null) continue; + // CurrentSeries.Points.Add(TmpWell.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetValue()); + // CurrentSeries.Points[Idx].Color = TmpWell.GetClassColor(); + // CurrentSeries.Points[Idx].MarkerStyle = MarkerStyle.Circle; + // CurrentSeries.Points[Idx].MarkerSize = 6; + // if (!GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.Points[Idx].ToolTip = TmpWell.AssociatedPlate.Name + "\n" + TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; + // Idx++; + // } + // } + + // SimpleForm NewWindow = new SimpleForm(CompleteScreening); + + // if (Idx > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) + // NewWindow.Width = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; + // else + // NewWindow.Width = Idx; + // NewWindow.Height = 400; + + // ChartArea CurrentChartArea = new ChartArea(); + // CurrentChartArea.BorderColor = Color.Black; + // CurrentChartArea.CursorX.IsUserSelectionEnabled = true; + // NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + + // NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + // CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); + + // CurrentChartArea.Axes[1].Title = CompleteScreening.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetName(); + // CurrentChartArea.Axes[0].Title = "Index"; + // CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + + // CurrentSeries.ChartType = SeriesChartType.Point; + // if (GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.ChartType = SeriesChartType.FastPoint; + + // NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + + // double Av = NewWindow.chartForSimpleForm.DataManipulator.Statistics.Mean("ScatterPoints"); + // double Std = Math.Sqrt(NewWindow.chartForSimpleForm.DataManipulator.Statistics.Variance("ScatterPoints", true)); + + // StripLine StdLine = new StripLine(); + // StdLine.BackColor = Color.FromArgb(64, Color.BlanchedAlmond); + // StdLine.IntervalOffset = Av - 1.5 * Std; + // StdLine.StripWidth = 3 * Std; + + // CurrentChartArea.AxisY.StripLines.Add(StdLine); + + // StripLine AverageLine = new StripLine(); + // AverageLine.BackColor = Color.Red; + // AverageLine.IntervalOffset = Av; + // AverageLine.StripWidth = 0.0001; + // AverageLine.Text = Av.ToString("N2"); + // CurrentChartArea.AxisY.StripLines.Add(AverageLine); + + // NewWindow.Text = "Scatter Point / " + Idx + " points"; + // NewWindow.Show(); + // NewWindow.chartForSimpleForm.Update(); + // NewWindow.chartForSimpleForm.Show(); + // NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + // return; + //} - CurrentChartArea.Axes[1].Title = CompleteScreening.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetName(); - CurrentChartArea.Axes[0].Title = "Index"; + private void scatterPointsToolStripMenuItem1_Click(object sender, EventArgs e) + { + cFeedBackMessage MessageReturned; - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - CurrentSeries.ChartType = SeriesChartType.Point; - if (GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.ChartType = SeriesChartType.FastPoint; + cViewerGraph1D V1D = new cViewerGraph1D(); + V1D.Chart.IsSelectable = true; + V1D.Chart.LabelAxisX = "Well Index"; + V1D.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + //V1D.Chart.BackgroundColor = Color.LightYellow; + V1D.Chart.IsXAxis = true; - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + { + cExtendedTable DataFromPlate = new cExtendedTable(CompleteScreening.GetCurrentDisplayPlate().ListActiveWells, + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, ListClassSelected); - double Av = NewWindow.chartForSimpleForm.DataManipulator.Statistics.Mean("ScatterPoints"); - double Std = Math.Sqrt(NewWindow.chartForSimpleForm.DataManipulator.Statistics.Variance("ScatterPoints", true)); + DataFromPlate.Name = CompleteScreening.GetCurrentDisplayPlate().Name; + V1D.Chart.IsShadow = true; + V1D.Chart.IsBorder = true; + V1D.Chart.IsSelectable = true; + V1D.Chart.CurrentTitle.Tag = CompleteScreening.GetCurrentDisplayPlate(); + V1D.SetInputData(DataFromPlate); + V1D.Run(); + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(V1D.GetOutPut()); + Designer0.Run(); + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = "Scatter points graph - " + DataFromPlate[0].Count + " wells."; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); + } + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + V1D.Chart.MarkerSize = 5; + V1D.Chart.IsBorder = false; + List ListWell = new List(); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell TmpWell in TmpPlate.ListActiveWells) + ListWell.Add(TmpWell); - StripLine StdLine = new StripLine(); - StdLine.BackColor = Color.FromArgb(64, Color.BlanchedAlmond); - StdLine.IntervalOffset = Av - 1.5 * Std; - StdLine.StripWidth = 3 * Std; + cExtendedTable DataFromPlate = new cExtendedTable(ListWell, + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, ListClassSelected); - CurrentChartArea.AxisY.StripLines.Add(StdLine); + DataFromPlate.Name = CompleteScreening.Name + " - " + CompleteScreening.ListPlatesActive.Count + " plates"; - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Red; - AverageLine.IntervalOffset = Av; - AverageLine.StripWidth = 0.0001; - AverageLine.Text = String.Format("{0:0.###}", Av); - CurrentChartArea.AxisY.StripLines.Add(AverageLine); + V1D.SetInputData(DataFromPlate); + V1D.Run(); - NewWindow.Text = "Scatter Point / " + Idx + " points"; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); - return; - } + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(V1D.GetOutPut()); + Designer0.Run(); - private void scatterPointsToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - SimpleForm NewWindow = new SimpleForm(CompleteScreening); - Series CurrentSeries = new Series("ScatterPoints"); + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = "Scatter points graph - " + DataFromPlate[0].Count + " wells."; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); - CurrentSeries.ShadowOffset = 1; + } + else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + { + cDesignerTab CDT = new cDesignerTab(); - int Idx = 0; - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) { - cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(IdxValue, IdxValue0, true); - if (TmpWell != null) - { - CurrentSeries.Points.Add(TmpWell.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetValue()); - CurrentSeries.Points[Idx].Color = CompleteScreening.GetCurrentDisplayPlate().GetWell(IdxValue, IdxValue0, true).GetColor(); - CurrentSeries.Points[Idx].ToolTip = TmpWell.GetPosX() + "x" + TmpWell.GetPosY() + " :" + TmpWell.Name; - CurrentSeries.Points[Idx].Tag = TmpWell; - CurrentSeries.Points[Idx].MarkerStyle = MarkerStyle.Circle; - CurrentSeries.Points[Idx].MarkerSize = 8; - Idx++; - } + cExtendedTable DataFromPlate = new cExtendedTable(TmpPlate.ListActiveWells, + CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, ListClassSelected); + + DataFromPlate.Name = TmpPlate.Name; + + V1D = new cViewerGraph1D(); + V1D.Chart.IsSelectable = true; + V1D.Chart.LabelAxisX = "Well Index"; + V1D.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + V1D.Chart.BackgroundColor = Color.LightYellow; + V1D.Chart.IsXAxis = true; + V1D.Chart.CurrentTitle.Tag = TmpPlate; + V1D.SetInputData(DataFromPlate); + V1D.Title = TmpPlate.Name; + V1D.Run(); + + CDT.SetInputData(V1D.GetOutPut()); } - if (CurrentSeries.Points.Count < 2) - { - MessageBox.Show("Statistical Analyses - More than one data point needed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + CDT.Run(); + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(CDT.GetOutPut()); + Disp0.Title = "Scatter points graphs"; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); } - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.CursorX.IsUserSelectionEnabled = true; - CurrentChartArea.BorderColor = Color.Black; - - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); - - CurrentChartArea.Axes[1].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); - CurrentChartArea.Axes[0].Title = "Index"; - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentSeries.ChartType = SeriesChartType.Point; - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + //if (CurrentSeries.Points.Count < 2) + //{ + // MessageBox.Show("Statistical Analyses - More than one data point needed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; - double Av = NewWindow.chartForSimpleForm.DataManipulator.Statistics.Mean("ScatterPoints"); - double Std = Math.Sqrt(NewWindow.chartForSimpleForm.DataManipulator.Statistics.Variance("ScatterPoints", true)); + //} - StripLine StdLine = new StripLine(); - StdLine.BackColor = Color.FromArgb(64, Color.BlanchedAlmond); - StdLine.IntervalOffset = Av - 1.5 * Std; - StdLine.StripWidth = 3 * Std; - CurrentChartArea.AxisY.StripLines.Add(StdLine); + //StripLine AverageLine = new StripLine(); + //AverageLine.BackColor = Color.Red; + //AverageLine.IntervalOffset = Av; + //AverageLine.StripWidth = 0.01; + //AverageLine.Text = String.Format("{0:0.###}", Av); + //CurrentChartArea.AxisY.StripLines.Add(AverageLine); - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Red; - AverageLine.IntervalOffset = Av; - AverageLine.StripWidth = 0.01; - AverageLine.Text = String.Format("{0:0.###}", Av); - CurrentChartArea.AxisY.StripLines.Add(AverageLine); - NewWindow.Text = "Scatter Point / " + CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells() + " points"; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); - return; } #endregion @@ -1695,7 +2260,7 @@ private void platesManagerToolStripMenuItem_Click(object sender, EventArgs e) CompleteScreening.CurrentDisplayPlateIdx = 0; toolStripcomboBoxPlateList.SelectedIndex = 0; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) @@ -1727,7 +2292,7 @@ private void descriptorEvolutionToolStripMenuItem_Click(object sender, EventArgs FormClassification WindowClassification = new FormClassification(CompleteScreening); WindowClassification.label1.Text = "Class"; - WindowClassification.Text = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " evolution"; + WindowClassification.Text = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " evolution"; WindowClassification.buttonClassification.Text = "Display"; if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; @@ -1765,7 +2330,7 @@ private void descriptorEvolutionToolStripMenuItem_Click(object sender, EventArgs if (TempWell == null) continue; else { - if (TempWell.GetClass() == SelectedClass) + if (TempWell.GetClassIdx() == SelectedClass) { double Val = TempWell.ListDescriptors[Desc].GetValue(); if (double.IsNaN(Val)) continue; @@ -1791,7 +2356,7 @@ private void descriptorEvolutionToolStripMenuItem_Click(object sender, EventArgs CurrentSeries.Points[RealPlateIdx].AxisLabel = CurrentPlateToProcess.Name; CurrentSeries.Points[RealPlateIdx].Font = new Font("Arial", 8); - CurrentSeries.Points[RealPlateIdx].Color = CompleteScreening.GlobalInfo.GetColor(SelectedClass); + CurrentSeries.Points[RealPlateIdx].Color = CompleteScreening.GlobalInfo.ListWellClasses[SelectedClass].ColourForDisplay; SeriesLine.Points.AddXY(RealPlateIdx, Values[0]); @@ -1817,7 +2382,7 @@ private void descriptorEvolutionToolStripMenuItem_Click(object sender, EventArgs CurrentChartArea.AxisX.Interval = 1; CurrentChartArea.Axes[1].IsMarksNextToAxis = true; - CurrentChartArea.Axes[1].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); + CurrentChartArea.Axes[1].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); CurrentChartArea.Axes[0].MajorGrid.Enabled = false; CurrentChartArea.Axes[1].MajorGrid.Enabled = false; @@ -1848,64 +2413,53 @@ private void descriptorEvolutionToolStripMenuItem_Click(object sender, EventArgs return; } - private void zscoreToolStripMenuItem_Click_1(object sender, EventArgs e) - { - if (CompleteScreening == null) return; + //private void zscoreToolStripMenuItem_Click_1(object sender, EventArgs e) + //{ + // if (CompleteScreening == null) return; + + // BuildZFactor(this.comboBoxDescriptorToDisplay.SelectedIndex).Show(); + //} - BuildZFactor(this.comboBoxDescriptorToDisplay.SelectedIndex).Show(); - } - private void zscoreSinglePlateToolStripMenuItem_Click(object sender, EventArgs e) + private SimpleForm BuildZFactor(int Desc) { List Pos = new List(); List Neg = new List(); List ZFactorList = new List(); - int NumDesc = CompleteScreening.ListDescriptors.Count; - cWell TempWell; - // loop on all the desciptors - for (int Desc = 0; Desc < NumDesc; Desc++) + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // loop on all the plate + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) { + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + Pos.Clear(); Neg.Clear(); - if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; for (int row = 0; row < CompleteScreening.Rows; row++) for (int col = 0; col < CompleteScreening.Columns; col++) { - TempWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, row, true); + TempWell = CurrentPlateToProcess.GetWell(col, row, true); if (TempWell == null) continue; else { - if (TempWell.GetClass() == 0) + if (TempWell.GetClassIdx() == 0) Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); - if (TempWell.GetClass() == 1) + if (TempWell.GetClassIdx() == 1) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } } - if (Pos.Count < 3) - { - MessageBox.Show("No or not enough positive controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - if (Neg.Count < 3) - { - MessageBox.Show("No or not enough negative controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - double ZScore = 1 - 3 * (std(Pos.ToArray()) + std(Neg.ToArray())) / (Math.Abs(Mean(Pos.ToArray()) - Mean(Neg.ToArray()))); - GlobalInfo.ConsoleWriteLine(CompleteScreening.ListDescriptors[Desc].GetName() + ", Z-Score = " + ZScore); - cSimpleSignature TmpDesc = new cSimpleSignature(CompleteScreening.ListDescriptors[Desc].GetName(), ZScore); + GlobalInfo.ConsoleWriteLine(CurrentPlateToProcess.Name + ", Z-Score = " + ZScore); + cSimpleSignature TmpDesc = new cSimpleSignature(CurrentPlateToProcess.Name, ZScore); ZFactorList.Add(TmpDesc); } - ZFactorList.Sort(delegate(cSimpleSignature p1, cSimpleSignature p2) { return p1.AverageValue.CompareTo(p2.AverageValue); }); - Series CurrentSeries = new Series(); CurrentSeries.ChartType = SeriesChartType.Column; CurrentSeries.ShadowOffset = 1; @@ -1918,8 +2472,7 @@ private void zscoreSinglePlateToolStripMenuItem_Click(object sender, EventArgs e int RealIdx = 0; for (int IdxValue = 0; IdxValue < ZFactorList.Count; IdxValue++) { - if (double.IsNaN(ZFactorList[IdxValue].AverageValue)) continue; - if (double.IsInfinity(ZFactorList[IdxValue].AverageValue)) continue; + if (ZFactorList[IdxValue].AverageValue.ToString() == "NaN") continue; CurrentSeries.Points.Add(ZFactorList[IdxValue].AverageValue); CurrentSeries.Points[RealIdx].Label = string.Format("{0:0.###}", ZFactorList[IdxValue].AverageValue); @@ -1934,9 +2487,10 @@ private void zscoreSinglePlateToolStripMenuItem_Click(object sender, EventArgs e RealIdx++; } - SimpleForm NewWindow = new SimpleForm(CompleteScreening); + SimpleForm NewWindow = new SimpleForm(); int thisWidth = 200 * RealIdx; - if (thisWidth > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; + if (thisWidth > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) + thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; NewWindow.Width = thisWidth; NewWindow.Height = 400; NewWindow.Text = "Z-factors"; @@ -1950,7 +2504,7 @@ private void zscoreSinglePlateToolStripMenuItem_Click(object sender, EventArgs e CurrentChartArea.AxisX.IsLabelAutoFit = true; NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[1].Maximum = 2; + CurrentChartArea.Axes[1].Maximum = 1.1; CurrentChartArea.Axes[1].IsMarksNextToAxis = true; CurrentChartArea.Axes[0].MajorGrid.Enabled = false; CurrentChartArea.Axes[1].MajorGrid.Enabled = false; @@ -1960,17 +2514,36 @@ private void zscoreSinglePlateToolStripMenuItem_Click(object sender, EventArgs e CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; CurrentChartArea.BackSecondaryColor = Color.White; - Title CurrentTitle = new Title(CompleteScreening.GetCurrentDisplayPlate().Name + " Z-factors"); + Title CurrentTitle = new Title(CompleteScreening.ListDescriptors[Desc].GetName() + " Z-factors"); CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + return NewWindow; } - private SimpleForm BuildZFactor(int Desc) + private void sSMDToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + BuildSSMD(this.comboBoxDescriptorToDisplay.SelectedIndex).Show(); + } + + + private class cSimpleSignature + { + public cSimpleSignature(string Name, double Value) + { + this.Name = Name; + this.AverageValue = Value; + + } + + + public string Name; + public double AverageValue; + + } + + private SimpleForm BuildSSMD(int Desc) { List Pos = new List(); List Neg = new List(); @@ -1987,7 +2560,6 @@ private SimpleForm BuildZFactor(int Desc) Pos.Clear(); Neg.Clear(); - for (int row = 0; row < CompleteScreening.Rows; row++) for (int col = 0; col < CompleteScreening.Columns; col++) { @@ -1995,16 +2567,18 @@ private SimpleForm BuildZFactor(int Desc) if (TempWell == null) continue; else { - if (TempWell.GetClass() == 0) + if (TempWell.GetClassIdx() == 0) Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); - if (TempWell.GetClass() == 1) + if (TempWell.GetClassIdx() == 1) Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); } } - double ZScore = 1 - 3 * (std(Pos.ToArray()) + std(Neg.ToArray())) / (Math.Abs(Mean(Pos.ToArray()) - Mean(Neg.ToArray()))); - GlobalInfo.ConsoleWriteLine(CurrentPlateToProcess.Name + ", Z-Score = " + ZScore); - cSimpleSignature TmpDesc = new cSimpleSignature(CurrentPlateToProcess.Name, ZScore); + double SSMDScore = (Mean(Pos.ToArray()) - Mean(Neg.ToArray())) / Math.Sqrt(std(Pos.ToArray()) * std(Pos.ToArray()) + std(Neg.ToArray()) * std(Neg.ToArray())); + GlobalInfo.ConsoleWriteLine(CurrentPlateToProcess.Name + ", SSMD = " + SSMDScore); + + //cDescriptor TmpDesc = new cDescriptor(SSMDScore, CurrentPlateToProcess.Name); + cSimpleSignature TmpDesc = new cSimpleSignature(CurrentPlateToProcess.Name, SSMDScore); ZFactorList.Add(TmpDesc); } @@ -2041,7 +2615,7 @@ private SimpleForm BuildZFactor(int Desc) thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; NewWindow.Width = thisWidth; NewWindow.Height = 400; - NewWindow.Text = "Z-factors"; + NewWindow.Text = "SSMD"; ChartArea CurrentChartArea = new ChartArea(); CurrentChartArea.BorderColor = Color.Black; @@ -2052,7 +2626,7 @@ private SimpleForm BuildZFactor(int Desc) CurrentChartArea.AxisX.IsLabelAutoFit = true; NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[1].Maximum = 1.1; + // CurrentChartArea.Axes[1].Maximum = 2; CurrentChartArea.Axes[1].IsMarksNextToAxis = true; CurrentChartArea.Axes[0].MajorGrid.Enabled = false; CurrentChartArea.Axes[1].MajorGrid.Enabled = false; @@ -2062,593 +2636,473 @@ private SimpleForm BuildZFactor(int Desc) CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; CurrentChartArea.BackSecondaryColor = Color.White; - Title CurrentTitle = new Title(CompleteScreening.ListDescriptors[Desc].GetName() + " Z-factors"); + Title CurrentTitle = new Title(CompleteScreening.ListDescriptors[Desc].GetName() + " SSMD"); CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); return NewWindow; } - private void sSMDToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - BuildSSMD(this.comboBoxDescriptorToDisplay.SelectedIndex).Show(); - } + #endregion - private class cSimpleSignature - { - public cSimpleSignature(string Name, double Value) - { - this.Name = Name; - this.AverageValue = Value; + #region Histograms section - } + //private void stackedHistogramToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // if (CompleteScreening == null) return; + // if ((CompleteScreening.ListDescriptors == null) || (CompleteScreening.ListDescriptors.Count == 0)) return; + // DisplayStackedHisto(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor); + //} + //public void DisplayStackedHisto(int IdxDesc) + //{ + // FormForMultipleClassSelection WindowForClassSelection = new FormForMultipleClassSelection(); + // PanelForClassSelection ClassSelectionPanel = new PanelForClassSelection(GlobalInfo, true); + // ClassSelectionPanel.Height = WindowForClassSelection.splitContainerForClassSelection.Panel1.Height; + // WindowForClassSelection.splitContainerForClassSelection.Panel1.Controls.Add(ClassSelectionPanel); + + // if (WindowForClassSelection.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + // // WindowForClassSelection.panelForClassesSelection = new + + // cExtendedList[] ListValuesForHisto = new cExtendedList[/*ClassSelectionPanel.GetListIndexSelectedClass().Count*/ GlobalInfo.GetNumberofDefinedWellClass()]; + + // List ListSelectedClass = ClassSelectionPanel.GetListSelectedClass(); + + // for (int i = 0; i < ListValuesForHisto.Length; i++) + // ListValuesForHisto[i] = new cExtendedList(); + + // cWell TempWell; + + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // double MinValue = double.MaxValue; + // double MaxValue = double.MinValue; + // double CurrentValue; + + // // loop on all the plate + // for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + // { + // cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + + // for (int row = 0; row < CompleteScreening.Rows; row++) + // for (int col = 0; col < CompleteScreening.Columns; col++) + // { + // TempWell = CurrentPlateToProcess.GetWell(col, row, false); + // if (TempWell == null) continue; + // else + // { + // if (TempWell.GetClassIdx() >= 0) + // { + // CurrentValue = TempWell.ListDescriptors[IdxDesc].GetValue(); + // ListValuesForHisto[TempWell.GetClassIdx()].Add(CurrentValue); + // if (CurrentValue < MinValue) MinValue = CurrentValue; + // if (CurrentValue > MaxValue) MaxValue = CurrentValue; + // } + // } + // } + // } + // SimpleForm NewWindow = new SimpleForm(); + // List[] HistoPos = new List[ListValuesForHisto.Length]; + // Series[] SeriesPos = new Series[ListValuesForHisto.Length]; + + + // for (int i = 0; i < ListValuesForHisto.Length; i++) + // { + // HistoPos[i] = new List(); + // if (ListSelectedClass[i]) + // HistoPos[i] = ListValuesForHisto[i].CreateHistogram(MinValue, MaxValue, (int)GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); + + // SeriesPos[i] = new Series(); + // } + + // for (int i = 0; i < SeriesPos.Length; i++) + // { + // int Max = 0; + // if (HistoPos[i].Count > 0) + // Max = HistoPos[i][0].Length; + + // for (int IdxValue = 0; IdxValue < Max; IdxValue++) + // { + // SeriesPos[i].Points.AddXY(MinValue + ((MaxValue - MinValue) * IdxValue) / Max, HistoPos[i][1][IdxValue]); + // SeriesPos[i].Points[IdxValue].ToolTip = HistoPos[i][1][IdxValue].ToString(); + // if (CompleteScreening.SelectedClass == -1) + // SeriesPos[i].Points[IdxValue].Color = Color.Black; + // else + // SeriesPos[i].Points[IdxValue].Color = CompleteScreening.GlobalInfo.ListWellClasses[i].ColourForDisplay; + // } + // } + // ChartArea CurrentChartArea = new ChartArea(); + // CurrentChartArea.BorderColor = Color.Black; + + // NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + // CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + // CurrentChartArea.Axes[0].Title = CompleteScreening.ListDescriptors[IdxDesc].GetName(); + // CurrentChartArea.Axes[1].Title = "Sum"; + // CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + + // NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + // CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + // CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; + // CurrentChartArea.BackSecondaryColor = Color.White; + + + // for (int i = 0; i < SeriesPos.Length; i++) + // { + // SeriesPos[i].ChartType = SeriesChartType.StackedColumn; + // // SeriesPos[i].Color = CompleteScreening.GlobalInfo.GetColor(1); + // if (ListSelectedClass[i]) + // NewWindow.chartForSimpleForm.Series.Add(SeriesPos[i]); + // } + // //Series SeriesGaussNeg = new Series(); + // //SeriesGaussNeg.ChartType = SeriesChartType.Spline; + + // //Series SeriesGaussPos = new Series(); + // //SeriesGaussPos.ChartType = SeriesChartType.Spline; + + // //if (HistoPos.Count != 0) + // //{ + // // double[] HistoGaussPos = CreateGauss(Mean(Pos.ToArray()), std(Pos.ToArray()), HistoPos[0].Length); + + // // SeriesGaussPos.Color = Color.Black; + // // SeriesGaussPos.BorderWidth = 2; + // //} + // //SeriesGaussNeg.Color = Color.Black; + // //SeriesGaussNeg.BorderWidth = 2; + + // //NewWindow.chartForSimpleForm.Series.Add(SeriesGaussNeg); + // //NewWindow.chartForSimpleForm.Series.Add(SeriesGaussPos); + // NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; + // NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; + // NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; + // NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; + + // Title CurrentTitle = null; + + // CurrentTitle = new Title(CompleteScreening.ListDescriptors[IdxDesc].GetName() + " Stacked histogram."); + + // CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); + // NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + // NewWindow.Text = CurrentTitle.Text; + // NewWindow.Show(); + // NewWindow.chartForSimpleForm.Update(); + // NewWindow.chartForSimpleForm.Show(); + // NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + // return; + //} + #endregion - public string Name; - public double AverageValue; + #region PCA - } - private SimpleForm BuildSSMD(int Desc) - { - List Pos = new List(); - List Neg = new List(); - List ZFactorList = new List(); + //private void pCAToolStripMenuItem2_Click(object sender, EventArgs e) + //{ + // ComputeAndDisplayPCA(CompleteScreening.ListPlatesActive); + //} - cWell TempWell; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + //private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) + //{ + // if (CompleteScreening == null) return; + // FormClassification WindowClassification = new FormClassification(CompleteScreening); + // WindowClassification.label1.Text = "Class of interest"; + // WindowClassification.Text = "PCA"; + // WindowClassification.buttonClassification.Text = "Process"; + + // if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + // int NeutralClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; + + // int NumWell = 0; + // int NumWellForLearning = 0; + // foreach (cPlate CurrentPlate in PlatesToProcess) + // { + // foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + // { + // if (CurrentWell.GetClassIdx() == NeutralClass) + // NumWellForLearning++; + // } + // NumWell += CurrentPlate.GetNumberOfActiveWells(); + // } + + // if (NumWellForLearning == 0) + // { + // MessageBox.Show("No well of the selected class identified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + // } + + + // int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); + + // if (NumDesc <= 1) + // { + // MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + // } + + // double[,] DataForPCA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; + + // // return; + // Matrix EigenVectors = PCAComputation(DataForPCA, NumWellForLearning, NumDesc, NeutralClass, PlatesToProcess); + // if (EigenVectors == null) return; + + // SimpleForm NewWindow = new SimpleForm(CompleteScreening); + // Series CurrentSeries = new Series(); + // CurrentSeries.ShadowOffset = 1; + + // Matrix CurrentPt = new Matrix(NumWell, NumDesc); + // DataForPCA = new double[NumWell, NumDesc + 1]; + + // for (int desc = 0; desc < NumDesc; desc++) + // { + // if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; + // List CurrentDesc = new List(); + // foreach (cPlate CurrentPlate in PlatesToProcess) + // { + // for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + // for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + // { + // cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); + // if (TmpWell == null) continue; + // CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); + // } + // } + // for (int i = 0; i < NumWell; i++) + // DataForPCA[i, desc] = CurrentDesc[i]; + // } + + // int IDx = 0; + // foreach (cPlate CurrentPlate in PlatesToProcess) + // { + // for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + // for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + // { + // cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); + // if (TmpWell == null) continue; + // DataForPCA[IDx++, NumDesc] = TmpWell.GetClassIdx(); + // } + // } + + // for (int i = 0; i < NumWell; i++) + // for (int j = 0; j < NumDesc; j++) CurrentPt.addElement(i, j, DataForPCA[i, j]); + + // Matrix NewPt = new Matrix(NumWell, NumDesc); + + // NewPt = CurrentPt.multiply(EigenVectors); + + // double MinY = double.MaxValue, MaxY = double.MinValue; + + // for (int IdxValue0 = 0; IdxValue0 < NumWell; IdxValue0++) + // { + // double CurrentY = NewPt.getElement(IdxValue0, 1); + + // if (CurrentY < MinY) MinY = CurrentY; + // if (CurrentY > MaxY) MaxY = CurrentY; + + // CurrentSeries.Points.AddXY(NewPt.getElement(IdxValue0, 0), CurrentY); + + // CurrentSeries.Points[IdxValue0].Color = CompleteScreening.GlobalInfo.ListWellClasses[(int)DataForPCA[IdxValue0, NumDesc]].ColourForDisplay; + // CurrentSeries.Points[IdxValue0].MarkerStyle = MarkerStyle.Circle; + // CurrentSeries.Points[IdxValue0].MarkerSize = 8; + // } + + // ChartArea CurrentChartArea = new ChartArea(); + // CurrentChartArea.BorderColor = Color.Black; + + // NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + // NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + // CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); + + // string AxeName = ""; + // int IDxDesc = 0; + // for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) + // { + // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Desc].GetName() + " + "; + // // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + // } + // CurrentChartArea.Axes[0].Title = AxeName.Remove(AxeName.Length - 3); + // CurrentChartArea.Axes[0].MajorGrid.Enabled = true; + + // AxeName = ""; + // IDxDesc = 0; + // for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) + // { + // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 1)) + "x" + CompleteScreening.ListDescriptors[Desc].GetName() + " + "; + // } + // //AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + + // CurrentChartArea.Axes[1].Title = AxeName.Remove(AxeName.Length - 3); + // CurrentChartArea.Axes[1].MajorGrid.Enabled = true; + // CurrentChartArea.Axes[1].Minimum = MinY; + // CurrentChartArea.Axes[1].Maximum = MaxY; + // CurrentChartArea.AxisX.LabelStyle.Format = "N2"; + // CurrentChartArea.AxisY.LabelStyle.Format = "N2"; + + + // CurrentSeries.ChartType = SeriesChartType.Point; + // if (GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.ChartType = SeriesChartType.FastPoint; + // NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + + + // NewWindow.Text = "PCA"; + // NewWindow.Show(); + // NewWindow.chartForSimpleForm.Update(); + // NewWindow.chartForSimpleForm.Show(); + // NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - Pos.Clear(); - Neg.Clear(); + //} - for (int row = 0; row < CompleteScreening.Rows; row++) - for (int col = 0; col < CompleteScreening.Columns; col++) - { - TempWell = CurrentPlateToProcess.GetWell(col, row, true); - if (TempWell == null) continue; - else - { - if (TempWell.GetClass() == 0) - Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); - if (TempWell.GetClass() == 1) - Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); - } - } + private Matrix PCAComputation(double[,] DataForPCA, int NumWellForLearning, int NumDesc, int NeutralClass, cExtendPlateList PlatesToProcess) + { - double SSMDScore = (Mean(Pos.ToArray()) - Mean(Neg.ToArray())) / Math.Sqrt(std(Pos.ToArray()) * std(Pos.ToArray()) + std(Neg.ToArray()) * std(Neg.ToArray())); - GlobalInfo.ConsoleWriteLine(CurrentPlateToProcess.Name + ", SSMD = " + SSMDScore); + for (int desc = 0; desc < NumDesc; desc++) + { + if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; + List CurrentDesc = new List(); - //cDescriptor TmpDesc = new cDescriptor(SSMDScore, CurrentPlateToProcess.Name); - cSimpleSignature TmpDesc = new cSimpleSignature(CurrentPlateToProcess.Name, SSMDScore); - ZFactorList.Add(TmpDesc); + foreach (cPlate CurrentPlate in PlatesToProcess) + { + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + { + cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); + if ((TmpWell == null) || (TmpWell.GetClassIdx() != NeutralClass)) continue; + CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); + } + } + for (int i = 0; i < NumWellForLearning; i++) + { + DataForPCA[i, desc] = CurrentDesc[i]; + } } + int IDx = 0; - Series CurrentSeries = new Series(); - CurrentSeries.ChartType = SeriesChartType.Column; - CurrentSeries.ShadowOffset = 1; - - Series SeriesLine = new Series(); - SeriesLine.Name = "SeriesLine"; - SeriesLine.ShadowOffset = 1; - SeriesLine.ChartType = SeriesChartType.Line; - - int RealIdx = 0; - for (int IdxValue = 0; IdxValue < ZFactorList.Count; IdxValue++) + foreach (cPlate CurrentPlate in PlatesToProcess) { - if (ZFactorList[IdxValue].AverageValue.ToString() == "NaN") continue; - - CurrentSeries.Points.Add(ZFactorList[IdxValue].AverageValue); - CurrentSeries.Points[RealIdx].Label = string.Format("{0:0.###}", ZFactorList[IdxValue].AverageValue); - CurrentSeries.Points[RealIdx].Font = new Font("Arial", 10); - CurrentSeries.Points[RealIdx].ToolTip = ZFactorList[IdxValue].Name; - CurrentSeries.Points[RealIdx].AxisLabel = ZFactorList[IdxValue].Name; - - SeriesLine.Points.Add(ZFactorList[IdxValue].AverageValue); - SeriesLine.Points[RealIdx].BorderColor = Color.Black; - SeriesLine.Points[RealIdx].MarkerStyle = MarkerStyle.Circle; - SeriesLine.Points[RealIdx].MarkerSize = 4; - RealIdx++; + foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + { + if (CurrentWell.GetClassIdx() == NeutralClass) + DataForPCA[IDx++, NumDesc] = NeutralClass;// CurrentWell.GetClassIdx(); + } + // NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); } - SimpleForm NewWindow = new SimpleForm(); - int thisWidth = 200 * RealIdx; - if (thisWidth > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) - thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; - NewWindow.Width = thisWidth; - NewWindow.Height = 400; - NewWindow.Text = "SSMD"; - - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - CurrentChartArea.AxisX.Interval = 1; - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); - NewWindow.chartForSimpleForm.Series.Add(SeriesLine); - - CurrentChartArea.AxisX.IsLabelAutoFit = true; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - - // CurrentChartArea.Axes[1].Maximum = 2; - CurrentChartArea.Axes[1].IsMarksNextToAxis = true; - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[1].MajorGrid.Enabled = false; - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; + double[,] Basis; + double[] s2; + int Info; - Title CurrentTitle = new Title(CompleteScreening.ListDescriptors[Desc].GetName() + " SSMD"); - CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + alglib.pcabuildbasis(DataForPCA, NumWellForLearning, NumDesc, out Info, out s2, out Basis); - return NewWindow; + Matrix EigenVectors = null; + if (Info > 0) + { + EigenVectors = new Matrix(NumDesc, NumDesc); + for (int row = 0; row < NumDesc; row++) + for (int col = 0; col < NumDesc; col++) + EigenVectors.addElement(row, col, Basis[row, col]); + } + return EigenVectors; } + #endregion - private void coeffOfVariationEvolutionToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - - FormClassification WinForClass = new FormClassification(CompleteScreening); - WinForClass.buttonClassification.Text = "Display"; - WinForClass.Text = "Select the class of interest"; - WinForClass.label1.Text = "Class"; - - if (WinForClass.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + #region LDA - BuildCV(this.comboBoxDescriptorToDisplay.SelectedIndex, WinForClass.comboBoxForNeutralClass.SelectedIndex).Show(); - } - private SimpleForm BuildCV(int Desc, int Class) + private Matrix LDAComputation(double[,] DataForLDA, int NumWellForLearning, int NumWell, int NumDesc, int NeutralClass, cExtendPlateList PlatesToProcess) { - cExtendedList ListValue = new cExtendedList(); - // List Neg = new List(); - List CVFactorList = new List(); - - cWell TempWell; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + int Info; + for (int desc = 0; desc < NumDesc; desc++) { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - - ListValue.Clear(); - + if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; + List CurrentDesc = new List(); - for (int row = 0; row < CompleteScreening.Rows; row++) - for (int col = 0; col < CompleteScreening.Columns; col++) - { - TempWell = CurrentPlateToProcess.GetWell(col, row, true); - if (TempWell == null) continue; - else + foreach (cPlate CurrentPlate in PlatesToProcess) + { + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) { - if (TempWell.GetClass() == Class) - ListValue.Add(TempWell.ListDescriptors[Desc].GetValue()); + cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); + if ((TmpWell == null) || (TmpWell.GetClassIdx() == NeutralClass)) continue; + CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); } + } + for (int i = 0; i < NumWellForLearning; i++) + { + DataForLDA[i, desc] = CurrentDesc[i]; + } + } + int IDx = 0; + foreach (cPlate CurrentPlate in PlatesToProcess) + { + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + { + cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); + if ((TmpWell == null) || (TmpWell.GetClassIdx() == NeutralClass)) continue; + DataForLDA[IDx++, NumDesc] = TmpWell.GetClassIdx(); } + } + double[,] Basis; - double CVScore = ListValue.Std() / ListValue.Mean(); - GlobalInfo.ConsoleWriteLine(CurrentPlateToProcess.Name + ", Coeff. of Variation = " + CVScore); - cSimpleSignature TmpDesc = new cSimpleSignature(CurrentPlateToProcess.Name, CVScore); - CVFactorList.Add(TmpDesc); + //alglib.pcabuildbasis(DataForLDA, NumWellForLearning, NumWellForLearning, out Info, out Basis); + alglib.fisherldan(DataForLDA, NumWellForLearning, NumDesc, NumWellForLearning, out Info, out Basis); + Matrix EigenVectors = null; + if (Info > 0) + { + EigenVectors = new Matrix(NumDesc, NumDesc); + for (int row = 0; row < NumDesc; row++) + for (int col = 0; col < NumDesc; col++) + EigenVectors.addElement(row, col, Basis[row, col]); } + return EigenVectors; + } - Series CurrentSeries = new Series(); - CurrentSeries.ChartType = SeriesChartType.Column; - CurrentSeries.ShadowOffset = 1; + private void ComputeAndDisplayLDA(cExtendPlateList PlatesToProcess) + { - Series SeriesLine = new Series(); - SeriesLine.Name = "SeriesLine"; - SeriesLine.ShadowOffset = 1; - SeriesLine.ChartType = SeriesChartType.Line; + FormClassification WindowClassification = new FormClassification(CompleteScreening); + WindowClassification.buttonClassification.Text = "Process"; + WindowClassification.Text = "LDA"; + if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - int RealIdx = 0; - for (int IdxValue = 0; IdxValue < CVFactorList.Count; IdxValue++) + int NeutralClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; + + int NumWell = 0; + int NumWellForLearning = 0; + foreach (cPlate CurrentPlate in PlatesToProcess) { - if (CVFactorList[IdxValue].AverageValue.ToString() == "NaN") continue; + NumWellForLearning += CurrentPlate.GetNumberOfActiveWellsButClass(NeutralClass); + NumWell += CurrentPlate.GetNumberOfActiveWells(); + } + // return; + if (NumWellForLearning == 0) + { + MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - CurrentSeries.Points.Add(CVFactorList[IdxValue].AverageValue); - CurrentSeries.Points[RealIdx].Label = string.Format("{0:0.###}", CVFactorList[IdxValue].AverageValue); - CurrentSeries.Points[RealIdx].Font = new Font("Arial", 10); - CurrentSeries.Points[RealIdx].ToolTip = CVFactorList[IdxValue].Name; - CurrentSeries.Points[RealIdx].AxisLabel = CVFactorList[IdxValue].Name; - CurrentSeries.Points[RealIdx].Color = CompleteScreening.GlobalInfo.GetColor(Class); + int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); - SeriesLine.Points.Add(CVFactorList[IdxValue].AverageValue); - SeriesLine.Points[RealIdx].BorderColor = Color.Black; - SeriesLine.Points[RealIdx].MarkerStyle = MarkerStyle.Circle; - SeriesLine.Points[RealIdx].MarkerSize = 4; - RealIdx++; + if (NumDesc <= 1) + { + MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - SimpleForm NewWindow = new SimpleForm(); - int thisWidth = 200 * RealIdx; - if (thisWidth > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) - thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; - NewWindow.Width = thisWidth; - NewWindow.Height = 400; - NewWindow.Text = "Coeff. of Variation"; + double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - CurrentChartArea.AxisX.Interval = 1; - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); - NewWindow.chartForSimpleForm.Series.Add(SeriesLine); + // return; + Matrix EigenVectors = LDAComputation(DataForLDA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); + if (EigenVectors == null) return; - CurrentChartArea.AxisX.IsLabelAutoFit = true; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - - // CurrentChartArea.Axes[1].Maximum = 2; - CurrentChartArea.Axes[1].IsMarksNextToAxis = true; - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[1].MajorGrid.Enabled = false; - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; - - Title CurrentTitle = new Title(CompleteScreening.ListDescriptors[Desc].GetName() + " Coeff. of Variation"); - CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); - - return NewWindow; - } - #endregion - - #region Histograms section - public void DisplayHistogram(bool IsFullScreen) - { - if (CompleteScreening == null) return; - if ((CompleteScreening.ListDescriptors == null) || (CompleteScreening.ListDescriptors.Count == 0)) return; - - cExtendedList Pos = new cExtendedList(); - cWell TempWell; - - if (IsFullScreen == false) - { - for (int row = 0; row < CompleteScreening.Rows; row++) - for (int col = 0; col < CompleteScreening.Columns; col++) - { - TempWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, row, false); - if (TempWell == null) continue; - else - { - if (TempWell.GetClass() == CompleteScreening.SelectedClass) - Pos.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue()); - } - } - } - else - { - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - - for (int row = 0; row < CompleteScreening.Rows; row++) - for (int col = 0; col < CompleteScreening.Columns; col++) - { - TempWell = CurrentPlateToProcess.GetWell(col, row, false); - if (TempWell == null) continue; - else - { - if (TempWell.GetClass() == CompleteScreening.SelectedClass) - Pos.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue()); - } - } - } - } - - - if (Pos.Count == 0) - { - MessageBox.Show("No well of class " + CompleteScreening.SelectedClass + " selected !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - List HistoPos = CreateHistogram(Pos.ToArray(), (int)GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); - SimpleForm NewWindow = new SimpleForm(); - - Series SeriesPos = new Series(); - SeriesPos.ShadowOffset = 1; - - if (HistoPos.Count == 0) return; - - for (int IdxValue = 0; IdxValue < HistoPos[0].Length; IdxValue++) - { - SeriesPos.Points.AddXY(HistoPos[0][IdxValue], HistoPos[1][IdxValue]); - SeriesPos.Points[IdxValue].ToolTip = HistoPos[1][IdxValue].ToString(); - if (CompleteScreening.SelectedClass == -1) - SeriesPos.Points[IdxValue].Color = Color.Black; - else - SeriesPos.Points[IdxValue].Color = CompleteScreening.GlobalInfo.GetColor(CompleteScreening.SelectedClass); - - } - - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[0].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); - CurrentChartArea.Axes[1].Title = "Sum"; - CurrentChartArea.AxisX.LabelStyle.Format = "N2"; - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; - - SeriesPos.ChartType = SeriesChartType.Column; - SeriesPos.Color = CompleteScreening.GlobalInfo.GetColor(1); - NewWindow.chartForSimpleForm.Series.Add(SeriesPos); - - //Series SeriesGaussNeg = new Series(); - //SeriesGaussNeg.ChartType = SeriesChartType.Spline; - - //Series SeriesGaussPos = new Series(); - //SeriesGaussPos.ChartType = SeriesChartType.Spline; - - //if (HistoPos.Count != 0) - //{ - // double[] HistoGaussPos = CreateGauss(Mean(Pos.ToArray()), std(Pos.ToArray()), HistoPos[0].Length); - - // SeriesGaussPos.Color = Color.Black; - // SeriesGaussPos.BorderWidth = 2; - //} - //SeriesGaussNeg.Color = Color.Black; - //SeriesGaussNeg.BorderWidth = 2; - - //NewWindow.chartForSimpleForm.Series.Add(SeriesGaussNeg); - // NewWindow.chartForSimpleForm.Series.Add(SeriesGaussPos); - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; - - if (GlobalInfo.OptionsWindow.checkBoxDisplayHistoStats.Checked) - { - StripLine AverageLine = new StripLine(); - AverageLine.BackColor = Color.Black; - AverageLine.IntervalOffset = Pos.Mean(); - AverageLine.StripWidth = double.Epsilon; - CurrentChartArea.AxisX.StripLines.Add(AverageLine); - AverageLine.Text = String.Format("{0:0.###}", AverageLine.IntervalOffset); - - StripLine StdLine = new StripLine(); - StdLine.BackColor = Color.FromArgb(64, Color.Black); - double Std = Pos.Std(); - StdLine.IntervalOffset = AverageLine.IntervalOffset - 0.5 * Std; - StdLine.StripWidth = Std; - CurrentChartArea.AxisX.StripLines.Add(StdLine); - AverageLine.StripWidth = 0.0001; - } - - Title CurrentTitle = null; - - if (IsFullScreen) - CurrentTitle = new Title("Class " + CompleteScreening.SelectedClass + " - " + CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " histogram."); - else - CurrentTitle = new Title("Class " + CompleteScreening.SelectedClass + " - " + CompleteScreening.GetCurrentDisplayPlate().Name + " - " + CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " histogram."); - - CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); - NewWindow.Text = CurrentTitle.Text; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); - return; - } - - private void histogramToolStripMenuItem_Click(object sender, EventArgs e) - { - DisplayHistogram(true); - } - - - private void stackedHistogramToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - if ((CompleteScreening.ListDescriptors == null) || (CompleteScreening.ListDescriptors.Count == 0)) return; - - cExtendedList[] ListValuesForHisto = new cExtendedList[GlobalInfo.GetNumberofDefinedClass()]; - for (int i = 0; i < ListValuesForHisto.Length; i++) - ListValuesForHisto[i] = new cExtendedList(); - - cWell TempWell; - - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - - double MinValue = double.MaxValue; - double MaxValue = double.MinValue; - double CurrentValue; - - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - - for (int row = 0; row < CompleteScreening.Rows; row++) - for (int col = 0; col < CompleteScreening.Columns; col++) - { - TempWell = CurrentPlateToProcess.GetWell(col, row, false); - if (TempWell == null) continue; - else - { - if (TempWell.GetClass() >= 0) - { - CurrentValue = TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue(); - ListValuesForHisto[TempWell.GetClass()].Add(CurrentValue); - if (CurrentValue < MinValue) MinValue = CurrentValue; - if (CurrentValue > MaxValue) MaxValue = CurrentValue; - } - } - } - } - SimpleForm NewWindow = new SimpleForm(); - List[] HistoPos = new List[ListValuesForHisto.Length]; - Series[] SeriesPos = new Series[GlobalInfo.GetNumberofDefinedClass()]; - - - for (int i = 0; i < ListValuesForHisto.Length; i++) - { - HistoPos[i] = new List(); - HistoPos[i] = ListValuesForHisto[i].CreateHistogram(MinValue, MaxValue, (int)GlobalInfo.OptionsWindow.numericUpDownHistoBin.Value); - - SeriesPos[i] = new Series(); - } - - for (int i = 0; i < SeriesPos.Length; i++) - { - int Max = 0; - if (HistoPos[i].Count > 0) - Max = HistoPos[i][0].Length; - - for (int IdxValue = 0; IdxValue < Max; IdxValue++) - { - SeriesPos[i].Points.AddXY(MinValue + ((MaxValue - MinValue) * IdxValue) / Max, HistoPos[i][1][IdxValue]); - SeriesPos[i].Points[IdxValue].ToolTip = HistoPos[i][1][IdxValue].ToString(); - if (CompleteScreening.SelectedClass == -1) - SeriesPos[i].Points[IdxValue].Color = Color.Black; - else - SeriesPos[i].Points[IdxValue].Color = CompleteScreening.GlobalInfo.GetColor(i); - - } - } - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - CurrentChartArea.Axes[0].MajorGrid.Enabled = false; - CurrentChartArea.Axes[0].Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); - CurrentChartArea.Axes[1].Title = "Sum"; - CurrentChartArea.AxisX.LabelStyle.Format = "N2"; - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; - CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; - CurrentChartArea.BackSecondaryColor = Color.White; - - - for (int i = 0; i < SeriesPos.Length; i++) - { - SeriesPos[i].ChartType = SeriesChartType.StackedColumn; - // SeriesPos[i].Color = CompleteScreening.GlobalInfo.GetColor(1); - NewWindow.chartForSimpleForm.Series.Add(SeriesPos[i]); - } - //Series SeriesGaussNeg = new Series(); - //SeriesGaussNeg.ChartType = SeriesChartType.Spline; - - //Series SeriesGaussPos = new Series(); - //SeriesGaussPos.ChartType = SeriesChartType.Spline; - - //if (HistoPos.Count != 0) - //{ - // double[] HistoGaussPos = CreateGauss(Mean(Pos.ToArray()), std(Pos.ToArray()), HistoPos[0].Length); - - // SeriesGaussPos.Color = Color.Black; - // SeriesGaussPos.BorderWidth = 2; - //} - //SeriesGaussNeg.Color = Color.Black; - //SeriesGaussNeg.BorderWidth = 2; - - //NewWindow.chartForSimpleForm.Series.Add(SeriesGaussNeg); - //NewWindow.chartForSimpleForm.Series.Add(SeriesGaussPos); - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScaleView.Zoomable = true; - NewWindow.chartForSimpleForm.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true; - - Title CurrentTitle = null; - - CurrentTitle = new Title(CompleteScreening.GetCurrentDisplayPlate().Name + " - " + CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " Stacked histogram."); - - CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); - NewWindow.Text = CurrentTitle.Text; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); - return; - } - #endregion - - #region PCA - private void aToolStripMenuItem_Click(object sender, EventArgs e) - { - cExtendPlateList ListToProcess = new cExtendPlateList(); - ListToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); - ComputeAndDisplayPCA(ListToProcess); - } - - private void pCAToolStripMenuItem2_Click(object sender, EventArgs e) - { - ComputeAndDisplayPCA(CompleteScreening.ListPlatesActive); - } - - private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) - { - if (CompleteScreening == null) return; - FormClassification WindowClassification = new FormClassification(CompleteScreening); - WindowClassification.label1.Text = "Class of interest"; - WindowClassification.Text = "PCA"; - WindowClassification.buttonClassification.Text = "Process"; - - if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - - int NeutralClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; - - int NumWell = 0; - int NumWellForLearning = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) - { - foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) - { - if (CurrentWell.GetClass() == NeutralClass) - NumWellForLearning++; - } - NumWell += CurrentPlate.GetNumberOfActiveWells(); - } - - if (NumWellForLearning == 0) - { - MessageBox.Show("No well of the selected class identified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - - int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); - - if (NumDesc <= 1) - { - MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - double[,] DataForPCA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; - - // return; - Matrix EigenVectors = PCAComputation(DataForPCA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); - if (EigenVectors == null) return; - - SimpleForm NewWindow = new SimpleForm(CompleteScreening); - Series CurrentSeries = new Series(); - CurrentSeries.ShadowOffset = 1; + SimpleForm NewWindow = new SimpleForm(); + Series CurrentSeries = new Series(); + CurrentSeries.ShadowOffset = 1; Matrix CurrentPt = new Matrix(NumWell, NumDesc); - DataForPCA = new double[NumWell, NumDesc + 1]; + DataForLDA = new double[NumWell, NumDesc + 1]; for (int desc = 0; desc < NumDesc; desc++) { @@ -2665,7 +3119,7 @@ private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) } } for (int i = 0; i < NumWell; i++) - DataForPCA[i, desc] = CurrentDesc[i]; + DataForLDA[i, desc] = CurrentDesc[i]; } int IDx = 0; @@ -2676,12 +3130,12 @@ private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) { cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); if (TmpWell == null) continue; - DataForPCA[IDx++, NumDesc] = TmpWell.GetClass(); + DataForLDA[IDx++, NumDesc] = TmpWell.GetClassIdx(); } } for (int i = 0; i < NumWell; i++) - for (int j = 0; j < NumDesc; j++) CurrentPt.addElement(i, j, DataForPCA[i, j]); + for (int j = 0; j < NumDesc; j++) CurrentPt.addElement(i, j, DataForLDA[i, j]); Matrix NewPt = new Matrix(NumWell, NumDesc); @@ -2698,7 +3152,7 @@ private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) CurrentSeries.Points.AddXY(NewPt.getElement(IdxValue0, 0), CurrentY); - CurrentSeries.Points[IdxValue0].Color = CompleteScreening.GlobalInfo.GetColor((int)DataForPCA[IdxValue0, NumDesc]); + CurrentSeries.Points[IdxValue0].Color = CompleteScreening.GlobalInfo.ListWellClasses[(int)DataForLDA[IdxValue0, NumDesc]].ColourForDisplay; CurrentSeries.Points[IdxValue0].MarkerStyle = MarkerStyle.Circle; CurrentSeries.Points[IdxValue0].MarkerSize = 8; } @@ -2740,10 +3194,11 @@ private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) CurrentSeries.ChartType = SeriesChartType.Point; if (GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.ChartType = SeriesChartType.FastPoint; + NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); - NewWindow.Text = "PCA"; + NewWindow.Text = "LDA"; NewWindow.Show(); NewWindow.chartForSimpleForm.Update(); NewWindow.chartForSimpleForm.Show(); @@ -2751,423 +3206,866 @@ private void ComputeAndDisplayPCA(cExtendPlateList PlatesToProcess) } + #endregion - private Matrix PCAComputation(double[,] DataForPCA, int NumWellForLearning, int NumWell, int NumDesc, int NeutralClass, cExtendPlateList PlatesToProcess) + #region Genes Analysis + public class cPathWay { + public string Name; + public int Occurence = 0; + public List Genesincluded = new List(); + public int GenesActive = 0; + public double ratio = 0; + public double pValue = 0; - for (int desc = 0; desc < NumDesc; desc++) + } + + private void findGeneToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + FormForNameRequest FormForRequest = new FormForNameRequest(); + if (FormForRequest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // loop on all the plate + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) { - if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; - List CurrentDesc = new List(); + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - foreach (cPlate CurrentPlate in PlatesToProcess) - { - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + { + cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); + if (TmpWell == null) continue; + + if (TmpWell.Name == FormForRequest.textBoxForName.Text) { - cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if ((TmpWell == null) || (TmpWell.GetClass() != NeutralClass)) continue; - CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); + + CurrentPlateToProcess.DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + int Col = IdxValue + 1; + int row = IdxValue0 + 1; + MessageBox.Show("Column " + Col + " x Row " + row, TmpWell.Name, MessageBoxButtons.OK, MessageBoxIcon.Information); + return; } - } - for (int i = 0; i < NumWellForLearning; i++) - { - DataForPCA[i, desc] = CurrentDesc[i]; - } + } } - int IDx = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) + MessageBox.Show("Gene not found !", FormForRequest.textBoxForName.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + private void pathwayExpressionToolStripMenuItem_Click(object sender, EventArgs e) + { + + // GET PATHWAYS + string getpathways = "http://rest.kegg.jp/list/pathway/hsa"; + + HttpWebRequest req = WebRequest.Create(string.Format(getpathways)) as HttpWebRequest; + req.Method = "GET"; + + HttpWebResponse response = req.GetResponse() as HttpWebResponse; + StreamReader reader = new StreamReader(response.GetResponseStream()); + string PathInfo = reader.ReadToEnd(); + + reader.Close(); + + if (CompleteScreening == null) return; + FormForNameRequest FormForRequest = new FormForNameRequest(); + + + string[] path = PathInfo.Split('\n'); + + for (int i = 0; i < path.Length - 1; i++) { - foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) - { - if (CurrentWell.GetClass() == NeutralClass) - DataForPCA[IDx++, NumDesc] = CurrentWell.GetClass(); - } - NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); + path[i] = path[i].Remove(0, 5); + FormForRequest.listBox1.Items.Add(path[i]); } + FormForRequest.listBox1.EndUpdate(); + FormForRequest.ShowDialog(); - double[,] Basis; - double[] s2; - int Info; + string pathwayselected = FormForRequest.listBox1.SelectedItem.ToString(); - alglib.pcabuildbasis(DataForPCA, NumWellForLearning, NumDesc, out Info, out s2, out Basis); + response.Close(); - Matrix EigenVectors = null; - if (Info > 0) + //if (FormForRequest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + + string[] PathwayName = pathwayselected.Split('\t'); + + + + + + + string getvar = "/link/genes/" + PathwayName[0];// "hsa05010"; + HttpWebRequest req2 = WebRequest.Create(string.Format("http://rest.kegg.jp" + getvar)) as HttpWebRequest; + req2.Method = "GET"; + + HttpWebResponse response2 = req2.GetResponse() as HttpWebResponse; + StreamReader reader2 = new StreamReader(response2.GetResponseStream()); + + + string GenInfo = reader2.ReadToEnd(); + + reader2.Close(); + + response2.Close(); + + string[] genesarraytmp = GenInfo.Split('\n'); + List genesarray = new List(); + foreach (string item in genesarraytmp) { - EigenVectors = new Matrix(NumDesc, NumDesc); - for (int row = 0; row < NumDesc; row++) - for (int col = 0; col < NumDesc; col++) - EigenVectors.addElement(row, col, Basis[row, col]); + if (item.Contains('\t')) + { + genesarray.Add(item.Split('\t')[1]); + } + } - return EigenVectors; - } - #endregion - #region LDA + string[] ListGenesinPathway = genesarray.ToArray(); + double[] ListValues = new double[ListGenesinPathway.Length]; - private Matrix LDAComputation(double[,] DataForLDA, int NumWellForLearning, int NumWell, int NumDesc, int NeutralClass, cExtendPlateList PlatesToProcess) - { - int Info; - for (int desc = 0; desc < NumDesc; desc++) - { - if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; - List CurrentDesc = new List(); - foreach (cPlate CurrentPlate in PlatesToProcess) + //StreamWriter stw = new StreamWriter(@"C:\alzheimer.csv"); + //stw.WriteLine("Genes" + "," + "Value"); + + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + List ListPathway = new List(); + + + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) { - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; + + for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) + { + + //if (CurrentLID == ListGenesinPathway[IdxGene]) + // IDxGeneOfInterest = IdxGene; + + if (CurrentLID == ListGenesinPathway[IdxGene]) { - cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if ((TmpWell == null) || (TmpWell.GetClass() == NeutralClass)) continue; - CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); + ListValues[IdxGene] = CurrentWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + //stw.Write(CurrentWell.Name); stw.Write(","); stw.Write(ListValues[IdxGene]); stw.WriteLine(); + break; } - } - for (int i = 0; i < NumWellForLearning; i++) - { - DataForLDA[i, desc] = CurrentDesc[i]; + } } } - int IDx = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) - { - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + //stw.Close(); + string webpage = "http://www.kegg.jp/kegg-bin/show_pathway?" + PathwayName[0] + "+"; + + List Pos = new List(); + List Neg = new List(); + + + int NumDesc = CompleteScreening.ListDescriptors.Count; + + cWell TempWell; + + + for (int row = 0; row < CompleteScreening.Rows; row++) + for (int col = 0; col < CompleteScreening.Columns; col++) + { + TempWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, row, true); + if (TempWell == null) continue; + else { - cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if ((TmpWell == null) || (TmpWell.GetClass() == NeutralClass)) continue; - DataForLDA[IDx++, NumDesc] = TmpWell.GetClass(); + if (TempWell.GetClassIdx() == (int)FormForRequest.numericUpDown1.Value) + Pos.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); + if (TempWell.GetClassIdx() == (int)FormForRequest.numericUpDown2.Value) + Neg.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); } + } + if (Pos.Count < 3) + { + MessageBox.Show("No or not enough positive controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; } - double[,] Basis; - - //alglib.pcabuildbasis(DataForLDA, NumWellForLearning, NumWellForLearning, out Info, out Basis); - alglib.fisherldan(DataForLDA, NumWellForLearning, NumDesc, NumWellForLearning, out Info, out Basis); - Matrix EigenVectors = null; - if (Info > 0) + if (Neg.Count < 3) { - EigenVectors = new Matrix(NumDesc, NumDesc); - for (int row = 0; row < NumDesc; row++) - for (int col = 0; col < NumDesc; col++) - EigenVectors.addElement(row, col, Basis[row, col]); + MessageBox.Show("No or not enough negative controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; } - return EigenVectors; - } - private void ComputeAndDisplayLDA(cExtendPlateList PlatesToProcess) - { - FormClassification WindowClassification = new FormClassification(CompleteScreening); - WindowClassification.buttonClassification.Text = "Process"; - WindowClassification.Text = "LDA"; - if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - int NeutralClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; - int NumWell = 0; - int NumWellForLearning = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) + double MinValue = Neg.Average(); + //MinValue = ListValues.Min(); + double MaxValue = Pos.Average(); + string[] bg_list = new string[ListGenesinPathway.Length]; + string[] fg_list = new string[ListGenesinPathway.Length]; + for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) { - NumWellForLearning += CurrentPlate.GetNumberOfActiveWellsButClass(NeutralClass); - NumWell += CurrentPlate.GetNumberOfActiveWells(); + + int ConvertedValue = (int)((((CompleteScreening.GlobalInfo.LUTs.LUT_JET[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); + if (ConvertedValue > 63) + { + ConvertedValue = 63; + } + if (ConvertedValue < 0) + { + ConvertedValue = 0; + } + Color Coul = Color.FromArgb(CompleteScreening.GlobalInfo.LUTs.LUT_JET[0][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_JET[1][ConvertedValue], + CompleteScreening.GlobalInfo.LUTs.LUT_JET[2][ConvertedValue]); + + + fg_list[IdxCol] = "000000"; + bg_list[IdxCol] = Coul.Name.Remove(0, 2); + if (ListValues[IdxCol] == 0) + bg_list[IdxCol] = "ffffff"; } - // return; - if (NumWellForLearning == 0) + int ad = 0; + foreach (string item in genesarray) { - MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + webpage += item + "%09%23" + bg_list[ad] + "+"; + ad++; } - int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); + Process.Start("chrome.exe", webpage); - if (NumDesc <= 1) - { - MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } + //FormForKeggGene KeggWin = new FormForKeggGene(); - double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; + //KeggWin.webBrowser.Navigate(webpage); + ////KeggWin.richTextBox.Text = GenInfo; + ////KeggWin.Text = "Gene Infos"; + //KeggWin.Show(); - // return; - Matrix EigenVectors = LDAComputation(DataForLDA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); - if (EigenVectors == null) return; - SimpleForm NewWindow = new SimpleForm(); - Series CurrentSeries = new Series(); - CurrentSeries.ShadowOffset = 1; - Matrix CurrentPt = new Matrix(NumWell, NumDesc); - DataForLDA = new double[NumWell, NumDesc + 1]; - for (int desc = 0; desc < NumDesc; desc++) + } + + static public List Find_Pathways(double LocusID) + { + string getvars = "/link/pathway/hsa:" + LocusID; + HttpWebRequest req = WebRequest.Create(string.Format("http://rest.kegg.jp" + getvars)) as HttpWebRequest; + req.Method = "GET"; + + + HttpWebResponse response2 = req.GetResponse() as HttpWebResponse; + StreamReader reader = new StreamReader(response2.GetResponseStream()); + + + + List Pathways2 = new List(); + + // Console application output + while (reader.Peek() >= 0) { - if (CompleteScreening.ListDescriptors[desc].IsActive() == false) continue; - List CurrentDesc = new List(); - foreach (cPlate CurrentPlate in PlatesToProcess) + + string[] resukt = reader.ReadLine().Split('\t'); + if (resukt.Length > 1) { - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) - { - cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if (TmpWell == null) continue; - CurrentDesc.Add(TmpWell.ListDescriptors[desc].GetValue()); - } + Pathways2.Add(resukt[1]); } - for (int i = 0; i < NumWell; i++) - DataForLDA[i, desc] = CurrentDesc[i]; + } - int IDx = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) + reader.Close(); + response2.Close(); + + List ListPathway = new List(); + foreach (string item in Pathways2) + ListPathway.Add(item.Remove(0, 5)); + + return ListPathway; + } + + + public string Find_Info(string Path) + { + HttpWebRequest req2 = WebRequest.Create(string.Format("http://rest.kegg.jp/get/" + Path)) as HttpWebRequest; + req2.Method = "GET"; + + HttpWebResponse response = req2.GetResponse() as HttpWebResponse; + StreamReader reader2 = new StreamReader(response.GetResponseStream()); + + string GenInfo = reader2.ReadToEnd(); + reader2.Close(); + + return GenInfo; + } + + private FormForPie PathWayAnalysis(int Class) + { + + #region ExtractGenesHits (var=LocusinClass) + + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + List LocusinClass = new List(); + List LocusID = new List(); + + // loop on all the plate + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) { + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) { - cWell TmpWell = CurrentPlate.GetWell(IdxValue, IdxValue0, true); - if (TmpWell == null) continue; - DataForLDA[IDx++, NumDesc] = TmpWell.GetClass(); + cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); + if ((TmpWell != null) && (TmpWell.LocusID != -1) && (TmpWell.LocusID != 0)) + LocusID.Add("hsa:" + TmpWell.LocusID); + if ((TmpWell == null) || (TmpWell.GetClassIdx() != Class) || (TmpWell.LocusID == -1) || (TmpWell.LocusID == 0)) continue; + + LocusinClass.Add("hsa:" + TmpWell.LocusID); + } } + #endregion - for (int i = 0; i < NumWell; i++) - for (int j = 0; j < NumDesc; j++) CurrentPt.addElement(i, j, DataForLDA[i, j]); - Matrix NewPt = new Matrix(NumWell, NumDesc); + #region Request HTTP (var=GenInfo2 && PathInfo) - NewPt = CurrentPt.multiply(EigenVectors); - double MinY = double.MaxValue, MaxY = double.MinValue; + //HttpWebRequest req2 = WebRequest.Create(string.Format("http://rest.kegg.jp/list/hsa")) as HttpWebRequest; + //req2.Method = "GET"; - for (int IdxValue0 = 0; IdxValue0 < NumWell; IdxValue0++) - { - double CurrentY = NewPt.getElement(IdxValue0, 1); + //HttpWebResponse response2 = req2.GetResponse() as HttpWebResponse; + //StreamReader reader2 = new StreamReader(response2.GetResponseStream()); - if (CurrentY < MinY) MinY = CurrentY; - if (CurrentY > MaxY) MaxY = CurrentY; + //string GenInfo2 = reader2.ReadToEnd(); + //reader2.Close(); - CurrentSeries.Points.AddXY(NewPt.getElement(IdxValue0, 0), CurrentY); + //string[] ListofGenes = GenInfo2.Split('\n'); + //List GenesList = ListofGenes.Select(x => x.Split('\t')[0]).ToList(); - CurrentSeries.Points[IdxValue0].Color = CompleteScreening.GlobalInfo.GetColor((int)DataForLDA[IdxValue0, NumDesc]); - CurrentSeries.Points[IdxValue0].MarkerStyle = MarkerStyle.Circle; - CurrentSeries.Points[IdxValue0].MarkerSize = 8; - } + //List CommonGenes = GenesList.Intersect(LocusID).ToList(); - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; + HttpWebRequest req = WebRequest.Create(string.Format("http://rest.kegg.jp/link/hsa/pathway")) as HttpWebRequest; + req.Method = "GET"; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); + HttpWebResponse response = req.GetResponse() as HttpWebResponse; + StreamReader reader = new StreamReader(response.GetResponseStream()); - string AxeName = ""; - int IDxDesc = 0; - for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) - { - if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; - AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Desc].GetName() + " + "; - // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; - } - CurrentChartArea.Axes[0].Title = AxeName.Remove(AxeName.Length - 3); - CurrentChartArea.Axes[0].MajorGrid.Enabled = true; + string PathInfo = reader.ReadToEnd(); + reader.Close(); + #endregion - AxeName = ""; - IDxDesc = 0; - for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) - { - if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; - AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 1)) + "x" + CompleteScreening.ListDescriptors[Desc].GetName() + " + "; - } - //AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + //HttpWebRequest req3 = WebRequest.Create(string.Format("http://rest.kegg.jp/link/pathway/hsa")) as HttpWebRequest; + //req3.Method = "GET"; - CurrentChartArea.Axes[1].Title = AxeName.Remove(AxeName.Length - 3); - CurrentChartArea.Axes[1].MajorGrid.Enabled = true; - CurrentChartArea.Axes[1].Minimum = MinY; - CurrentChartArea.Axes[1].Maximum = MaxY; - CurrentChartArea.AxisX.LabelStyle.Format = "N2"; - CurrentChartArea.AxisY.LabelStyle.Format = "N2"; + //HttpWebResponse response3 = req3.GetResponse() as HttpWebResponse; + //StreamReader reader3 = new StreamReader(response3.GetResponseStream()); + //string GenesInfo = reader3.ReadToEnd(); + //reader3.Close(); + //string[] GenesinPathways = GenesInfo.Split('\n'); - CurrentSeries.ChartType = SeriesChartType.Point; - if (GlobalInfo.OptionsWindow.checkBoxDisplayFastPerformance.Checked) CurrentSeries.ChartType = SeriesChartType.FastPoint; + #region numberofgenesbypathways - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + string[] PathwayGenes = PathInfo.Split('\n');// extract the number of genes by Pathway for p-values + IEnumerable> NumberofGenesByPathways = PathwayGenes.GroupBy(x => x.Split('\t')[0]).ToList(); + IEnumerable> Numberofpathwaybygenes = PathwayGenes.Where(x => x.Count() > 0).GroupBy(x => x.Split('\t')[1]).ToList(); + //IEnumerable> NumberofGenesby = GenesinPathways.Where(x => x.Count() > 0).GroupBy(x => x.Split('\t')[0]).ToList(); - NewWindow.Text = "LDA"; - NewWindow.Show(); - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + #endregion - } - #endregion + #region ExtractNumberofpatways - #region Genes Analysis - public class cPathWay - { - public string Name; - public int Occurence = 0; + //string[] GenePathways = GenInfo2.Split('\n'); - } + List ListPathway = new List(); - private void findGeneToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - FormForNameRequest FormForRequest = new FormForNameRequest(); - if (FormForRequest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + foreach (IGrouping item in Numberofpathwaybygenes) { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + if (LocusinClass.Contains(item.Key)) + { + foreach (string PathName in item) { - cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); - if (TmpWell == null) continue; - if (TmpWell.Name == FormForRequest.textBoxForName.Text) + if (ListPathway.Count == 0) { - - CurrentPlateToProcess.DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - int Col = IdxValue + 1; - int row = IdxValue0 + 1; - MessageBox.Show("Column " + Col + " x Row " + row, TmpWell.Name, MessageBoxButtons.OK, MessageBoxIcon.Information); - return; + cPathWay CurrPath = new cPathWay(); + CurrPath.Name = PathName.Split('\t')[0]; + CurrPath.Occurence = 1; + ListPathway.Add(CurrPath); + continue; } - } - } - - MessageBox.Show("Gene not found !", FormForRequest.textBoxForName.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - private FormForPie PathWayAnalysis(int Class) - { - //int Idx = 0; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - KEGG ServKegg = new KEGG(); - List ListPathway = new List(); + bool DidIt = false; + for (int i = 0; i < ListPathway.Count; i++) + { + if (PathName.Split('\t')[0] == ListPathway[i].Name) + { + ListPathway[i].Occurence++; + DidIt = true; + break; + } + } - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + if (DidIt == false) + { + cPathWay CurrPath1 = new cPathWay(); + CurrPath1.Name = PathName.Split('\t')[0]; + CurrPath1.Occurence = 1; + ListPathway.Add(CurrPath1); + } - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) - { - cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); - if ((TmpWell == null) || (TmpWell.GetClass() != Class) || (TmpWell.LocusID == -1)) continue; + } - string[] intersection_gene_pathways = new string[1]; - intersection_gene_pathways[0] = "hsa:" + TmpWell.LocusID; - string[] Pathways = ServKegg.get_pathways_by_genes(intersection_gene_pathways); - if ((Pathways == null) || (Pathways.Length == 0)) continue; - for (int Idx = 0; Idx < Pathways.Length; Idx++) - { - // string PathName = Pathways[Idx].Remove(0, 8); - string GenInfo = ServKegg.bget(Pathways[Idx]); - string[] Genes = GenInfo.Split(new char[] { '\n' }); - string PathName = ""; - foreach (string item in Genes) - { - string[] fre = item.Split(' '); - string[] STRsection = fre[0].Split('_'); + } + } - if (STRsection[0] == "NAME") - { - for (int i = 1; i < fre.Length; i++) - { - if (fre[i] == "") continue; - PathName += fre[i] + " "; - } - break; - } - } + int thu = 0; + foreach (cPathWay item in ListPathway) + { - if (ListPathway.Count == 0) - { - cPathWay CurrPath = new cPathWay(); - CurrPath.Name = PathName; - CurrPath.Occurence = 1; - ListPathway.Add(CurrPath); - continue; - } + thu += item.Occurence; - bool DidIt = false; - for (int i = 0; i < ListPathway.Count; i++) - { - if (PathName == ListPathway[i].Name) - { - ListPathway[i].Occurence++; - DidIt = true; - break; - } - } - if (DidIt == false) - { - cPathWay CurrPath1 = new cPathWay(); - CurrPath1.Name = PathName; - CurrPath1.Occurence = 1; - ListPathway.Add(CurrPath1); - } - } - } } + #endregion - // now draw the pie + #region now draw the pie if (ListPathway.Count == 0) { MessageBox.Show("No pathway identified !", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } + FormForPie Pie = new FormForPie(); Series CurrentSeries = Pie.chartForPie.Series[0]; + Pie.chartForPie.Titles.Add("Pathways Enrichment Ratio"); - // loop on all the plate - int MaxOccurence = int.MinValue; - int MaxIdx = 0; - int TotalOcurrence = 0; - for (int Idx = 0; Idx < ListPathway.Count; Idx++) + List newPathway = new List(); + newPathway = ListPathway.OrderByDescending(p => p.Occurence).ToList(); + List Pathwaynamehit = new List(); + //List numberofgenesinPathway = new List(); + + foreach (var item in newPathway) + foreach (IGrouping item2 in NumberofGenesByPathways) + { + + if (item.Name.Contains(item2.Key) && item2.Key != "") + { + item.Genesincluded.AddRange(item2); + + } + + + } + + List FinalPathway = new List(); + foreach (cPathWay item in newPathway) + { + cPathWay temp = new cPathWay(); + List tempgenes = new List(); + foreach (string item2 in item.Genesincluded) + { + tempgenes.Add(item2.Replace(item2, item2.Split('\t')[1])); + } + temp.Genesincluded.AddRange(tempgenes); + temp.Name = item.Name; + temp.Occurence = item.Occurence; + + FinalPathway.Add(temp); + } + + foreach (cPathWay item in FinalPathway) { - if (ListPathway[Idx].Occurence > MaxOccurence) + int cpt = 0; + foreach (string item2 in item.Genesincluded) + { + if (LocusinClass.Contains(item2)) + { + cpt++; + } + } + item.GenesActive = cpt; + item.ratio = (double)item.GenesActive / (double)item.Genesincluded.Count(); + + for (int i = item.GenesActive-1; i < item.Genesincluded.Count(); i++) { - MaxOccurence = ListPathway[Idx].Occurence; - MaxIdx = Idx; + item.pValue += Pvalue(i, Numberofpathwaybygenes.Count() - item.Genesincluded.Count(), item.Genesincluded.Count(), LocusinClass.Count() - item.GenesActive); } - TotalOcurrence += ListPathway[Idx].Occurence; } + List AfterFinal = new List(); - //CurrentSeries.CustomProperties = "PieLabelStyle=Outside"; - for (int Idx = 0; Idx < ListPathway.Count; Idx++) + + AfterFinal = FinalPathway.OrderBy(p => (p.pValue)).ToList(); + cExtendedList ratioac = new cExtendedList(); + + foreach (cPathWay item in AfterFinal) + { + + ratioac.Add(item.pValue); + + + } + + cViewerHistogram toto = new cViewerHistogram(); + cExtendedTable data = new cExtendedTable(ratioac); + toto.SetInputData(data); + + toto.Chart.LabelAxisX = "pValue"; + toto.Chart.LabelAxisY = "Distribution"; + toto.Run(); + + + + + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(toto.GetOutPut()); + Designer0.Run(); + + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = "Histo- "; + Disp0.Run(); + Disp0.Display(); + + + + + //for (int Idx = 0; Idx < 40; Idx++) + //{ + + int Idx = 0; + FormForNameRequest FormForRequest = new FormForNameRequest(); + while (AfterFinal[Idx].pValue < (double)FormForRequest.numericUpDown4.Value) { - CurrentSeries.Points.Add(ListPathway[Idx].Occurence); - CurrentSeries.Points[Idx].Label = String.Format("{0:0.###}", ((100.0 * ListPathway[Idx].Occurence) / TotalOcurrence)) + " %"; + CurrentSeries.Points.Add(AfterFinal[Idx].pValue); + CurrentSeries.Points[Idx].Label = String.Format("{0:0.##}", ((AfterFinal[Idx].pValue))); - CurrentSeries.Points[Idx].LegendText = ListPathway[Idx].Name; - CurrentSeries.Points[Idx].ToolTip = ListPathway[Idx].Name; - if (Idx == MaxIdx) + CurrentSeries.Points[Idx].LegendText = AfterFinal[Idx].Name + " (" + AfterFinal[Idx].GenesActive + "/" + + AfterFinal[Idx].Genesincluded.Count() + ")"; + + CurrentSeries.Points[Idx].ToolTip = AfterFinal[Idx].Name + "\n" + (LocusID.Count()) + "\n" + (LocusinClass.Count() + "\n" + AfterFinal[Idx].pValue); + if (Idx == 0) CurrentSeries.Points[Idx].SetCustomProperty("Exploded", "True"); + //MathNet.Numerics.Distributions.Hypergeometric T = + // new MathNet.Numerics.Distributions.Hypergeometric(Numberofpathwaybygenes.Count(), AfterFinal[Idx].Genesincluded.Count(), LocusinClass.Count()); + + Idx++; } + + #endregion + + #region Display Pathways + List namepathwaypvalue = new List(); + for (int i = 0; i < Idx; i++) + { + namepathwaypvalue.Add(AfterFinal[i].Name.Remove(0, 5)); + } + + PathwayDisplayforpvalue(namepathwaypvalue); + #endregion return Pie; } + public double Pvalue(int x, int m, int k, int n) + { + double p = 0; + double a = MathNet.Numerics.SpecialFunctions.GammaLn(k + 1) - MathNet.Numerics.SpecialFunctions.GammaLn(x + 1) + - MathNet.Numerics.SpecialFunctions.GammaLn(k - x + 1); + + double b = MathNet.Numerics.SpecialFunctions.GammaLn(m + 1) - MathNet.Numerics.SpecialFunctions.GammaLn(n + 1) - + MathNet.Numerics.SpecialFunctions.GammaLn(m - n + 1); + + double c = MathNet.Numerics.SpecialFunctions.GammaLn(m - k + 1) - MathNet.Numerics.SpecialFunctions.GammaLn(n - x + 1) + - MathNet.Numerics.SpecialFunctions.GammaLn(m - k - (n - x) + 1); + + p = Math.Exp(a + c - b); + + + + return p; + } + + public void PathwayDisplayforpvalue(List Pathway) + { + + FormForNameRequest FormForRequest = new FormForNameRequest(); + // FormForRequest.Size = new Size(150, 150); + FormForRequest.ShowDialog(); + int h = (Pathway.Count() < (int)FormForRequest.numericUpDown3.Value) ? Pathway.Count() : (int)FormForRequest.numericUpDown3.Value; + //int h=Pathway.Count()>FormForRequest.numericUpDown3.Value?: + for (int i = 0; i < h; i++) + { + + + + string getvar = "/link/genes/" + Pathway[i];// "hsa05010"; + HttpWebRequest req2 = WebRequest.Create(string.Format("http://rest.kegg.jp" + getvar)) as HttpWebRequest; + req2.Method = "GET"; + + HttpWebResponse response2 = req2.GetResponse() as HttpWebResponse; + StreamReader reader2 = new StreamReader(response2.GetResponseStream()); + + + string GenInfo = reader2.ReadToEnd(); + + reader2.Close(); + + response2.Close(); + + string[] genesarraytmp = GenInfo.Split('\n'); + List genesarray = new List(); + foreach (string item in genesarraytmp) + { + if (item.Contains('\t')) + { + genesarray.Add(item.Split('\t')[1]); + } + + } + + + string[] ListGenesinPathway = genesarray.ToArray(); + double[] ListValues = new double[ListGenesinPathway.Length]; + + + //StreamWriter stw = new StreamWriter(@"C:\alzheimer.csv"); + //stw.WriteLine("Genes" + "," + "Value"); + + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + List ListPathway = new List(); + + + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + { + string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; + + for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) + { + + //if (CurrentLID == ListGenesinPathway[IdxGene]) + // IDxGeneOfInterest = IdxGene; + + if (CurrentLID == ListGenesinPathway[IdxGene]) + { + ListValues[IdxGene] = CurrentWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + //stw.Write(CurrentWell.Name); stw.Write(","); stw.Write(ListValues[IdxGene]); stw.WriteLine(); + break; + } + } + } + } + //stw.Close(); + string webpage = "http://www.kegg.jp/kegg-bin/show_pathway?" + Pathway[i] + "+"; + + List Pos = new List(); + List Neg = new List(); + + + int NumDesc = CompleteScreening.ListDescriptors.Count; + + cWell TempWell; + + if (CompleteScreening == null) return; + + + + for (int row = 0; row < CompleteScreening.Rows; row++) + for (int col = 0; col < CompleteScreening.Columns; col++) + { + TempWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, row, true); + if (TempWell == null) continue; + else + { + if (TempWell.GetClassIdx() == (int)FormForRequest.numericUpDown1.Value) + Pos.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); + if (TempWell.GetClassIdx() == (int)FormForRequest.numericUpDown2.Value) + Neg.Add(TempWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue()); + } + } + if (Pos.Count < 3) + { + MessageBox.Show("No or not enough positive controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + if (Neg.Count < 3) + { + MessageBox.Show("No or not enough negative controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + + + + + double MinValue = Neg.Average(); + //MinValue = ListValues.Min(); + double MaxValue = Pos.Average(); + string[] bg_list = new string[ListGenesinPathway.Length]; + string[] fg_list = new string[ListGenesinPathway.Length]; + for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) + { + + int ConvertedValue = (int)((((CompleteScreening.GlobalInfo.LUTs.LUT_JET[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); + if (ConvertedValue > 63) + { + ConvertedValue = 63; + } + if (ConvertedValue < 0) + { + ConvertedValue = 0; + } + Color Coul = Color.FromArgb(CompleteScreening.GlobalInfo.LUTs.LUT_JET[0][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_JET[1][ConvertedValue], + CompleteScreening.GlobalInfo.LUTs.LUT_JET[2][ConvertedValue]); + + + fg_list[IdxCol] = "000000"; + bg_list[IdxCol] = Coul.Name.Remove(0, 2); + if (ListValues[IdxCol] == 0) + bg_list[IdxCol] = "ffffff"; + + } + int ad = 0; + foreach (string item in genesarray) + { + webpage += item + "%09%23" + bg_list[ad] + "+"; + ad++; + } + + Process.Start("chrome.exe", webpage); + } + } + + + + //private FormForPie PathWayAnalysis(int Class) + //{ + // //int Idx = 0; + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // KEGG ServKegg = new KEGG(); + + // List ListPathway = new List(); + + // // loop on all the plate + // for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + // { + // cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + + // for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + // for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + // { + // cWell TmpWell = CurrentPlateToProcess.GetWell(IdxValue, IdxValue0, true); + // if ((TmpWell == null) || (TmpWell.GetClassIdx() != Class) || (TmpWell.LocusID == -1)) continue; + + + // string[] intersection_gene_pathways = new string[1]; + // intersection_gene_pathways[0] = "hsa:" + TmpWell.LocusID; + // string[] Pathways = ServKegg.get_pathways_by_genes(intersection_gene_pathways); + // if ((Pathways == null) || (Pathways.Length == 0)) continue; + + // for (int Idx = 0; Idx < Pathways.Length; Idx++) + // { + // // string PathName = Pathways[Idx].Remove(0, 8); + // string GenInfo = ServKegg.bget(Pathways[Idx]); + // string[] Genes = GenInfo.Split(new char[] { '\n' }); + // string PathName = ""; + // foreach (string item in Genes) + // { + // string[] fre = item.Split(' '); + // string[] STRsection = fre[0].Split('_'); + + // if (STRsection[0] == "NAME") + // { + // for (int i = 1; i < fre.Length; i++) + // { + // if (fre[i] == "") continue; + // PathName += fre[i] + " "; + // } + // break; + // } + // } + + // if (ListPathway.Count == 0) + // { + // cPathWay CurrPath = new cPathWay(); + // CurrPath.Name = PathName; + // CurrPath.Occurence = 1; + // ListPathway.Add(CurrPath); + // continue; + // } + + // bool DidIt = false; + // for (int i = 0; i < ListPathway.Count; i++) + // { + // if (PathName == ListPathway[i].Name) + // { + // ListPathway[i].Occurence++; + // DidIt = true; + // break; + // } + // } + + // if (DidIt == false) + // { + // cPathWay CurrPath1 = new cPathWay(); + // CurrPath1.Name = PathName; + // CurrPath1.Occurence = 1; + // ListPathway.Add(CurrPath1); + // } + // } + // } + // } + + // // now draw the pie + // if (ListPathway.Count == 0) + // { + // MessageBox.Show("No pathway identified !", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + // return null; + + // } + // FormForPie Pie = new FormForPie(); + + // Series CurrentSeries = Pie.chartForPie.Series[0]; + + // // loop on all the plate + // int MaxOccurence = int.MinValue; + // int MaxIdx = 0; + // int TotalOcurrence = 0; + // for (int Idx = 0; Idx < ListPathway.Count; Idx++) + // { + // if (ListPathway[Idx].Occurence > MaxOccurence) + // { + // MaxOccurence = ListPathway[Idx].Occurence; + // MaxIdx = Idx; + // } + // TotalOcurrence += ListPathway[Idx].Occurence; + // } + + + + // //CurrentSeries.CustomProperties = "PieLabelStyle=Outside"; + // for (int Idx = 0; Idx < ListPathway.Count; Idx++) + // { + // CurrentSeries.Points.Add(ListPathway[Idx].Occurence); + // CurrentSeries.Points[Idx].Label = String.Format("{0:0.###}", ((100.0 * ListPathway[Idx].Occurence) / TotalOcurrence)) + " %"; + + // CurrentSeries.Points[Idx].LegendText = ListPathway[Idx].Name; + // CurrentSeries.Points[Idx].ToolTip = ListPathway[Idx].Name; + // if (Idx == MaxIdx) + // CurrentSeries.Points[Idx].SetCustomProperty("Exploded", "True"); + // } + + // return Pie; + //} + private void pahtwaysAnalysisToolStripMenuItem_Click(object sender, EventArgs e) { if (CompleteScreening == null) return; @@ -3376,17 +4274,6 @@ private List GenerateArtifactMessage(cPlate PlateToProcess, int CurrentD return Messages; } - private void systematicErrorsToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - - System.Windows.Forms.DialogResult Res = MessageBox.Show("By applying this process, classes will be definitively modified ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (Res == System.Windows.Forms.DialogResult.No) return; - - List Result = GenerateArtifactMessage(CompleteScreening.GetCurrentDisplayPlate(), comboBoxDescriptorToDisplay.SelectedIndex); - MessageBox.Show(Result[1], "Systematic Error Identification", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } private DataTable ComputeSystematicErrorsTable() { @@ -3479,20 +4366,21 @@ private void correlationMatrixToolStripMenuItem_Click(object sender, EventArgs e ComputeAndDisplayCorrelationMatrix(true, true, null); } - private void toolStripMenuItem2_Click(object sender, EventArgs e) - { - ComputeAndDisplayCorrelationMatrix(false, true, null); - } - private void ComputeAndDisplayCorrelationMatrix(bool IsFullScreen, bool IsToBeDisplayed, string PathForImage) { if (CompleteScreening == null) return; + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) + { + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } bool IsDisplayRanking = CompleteScreening.GlobalInfo.OptionsWindow.checkBoxCorrelationMatrixDisplayRanking.Checked; //bool IsPearson = CompleteScreening.GlobalInfo.OptionsWindow.radioButtonPearson.Checked; Boolean IsDisplayValues = false; + List[] ListValueDesc = ExtractDesciptorAverageValuesList(IsFullScreen); double[,] CorrelationMatrix = ComputeCorrelationMatrix(ListValueDesc); @@ -3522,7 +4410,15 @@ private void ComputeAndDisplayCorrelationMatrix(bool IsFullScreen, bool IsToBeDi DisplayMatrix(CorrelationMatrix, NameX, NameY, IsDisplayValues, TitleForGraph, SquareSize, IsToBeDisplayed, PathForImage); //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- if (IsDisplayRanking == false) return; + else + DisplayCorrelationRanking(ListValueDesc, CorrelationMatrix); + } + + + public void DisplayCorrelationRanking(List[] ListValueDesc, double[,] CorrelationMatrix) + { + string TitleForGraph; Series CurrentSeries1 = new Series("Data1"); CurrentSeries1.ShadowOffset = 1; CurrentSeries1.ChartType = SeriesChartType.Column; @@ -3534,7 +4430,7 @@ private void ComputeAndDisplayCorrelationMatrix(bool IsFullScreen, bool IsToBeDi for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) { if (CompleteScreening.ListDescriptors[i].IsActive()) realPos++; - if (i == CompleteScreening.ListDescriptors.CurrentSelectedDescriptor) + if (i == CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx) { RealPosSelectedDesc = i - 2; break; @@ -3551,10 +4447,10 @@ private void ComputeAndDisplayCorrelationMatrix(bool IsFullScreen, bool IsToBeDi if (GlobalInfo.OptionsWindow.checkBoxCorrelationRankChangeColorForActiveDesc.Checked) { - if (CompleteScreening.ListDescriptors.CurrentSelectedDescriptor < CompleteScreening.ListDescriptors.GetListNameActives().Count) + if (CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx < CompleteScreening.ListDescriptors.GetListNameActives().Count) { - if ((CompleteScreening.ListDescriptors.GetListNameActives()[iDesc] == CompleteScreening.ListDescriptors.GetListNameActives()[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor]) || - (CompleteScreening.ListDescriptors.GetListNameActives()[jDesc] == CompleteScreening.ListDescriptors.GetListNameActives()[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor])) + if ((CompleteScreening.ListDescriptors.GetListNameActives()[iDesc] == CompleteScreening.ListDescriptors.GetListNameActives()[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx]) || + (CompleteScreening.ListDescriptors.GetListNameActives()[jDesc] == CompleteScreening.ListDescriptors.GetListNameActives()[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx])) CurrentSeries1.Points[IdxValue].Color = Color.LightGreen; } } @@ -3593,15 +4489,16 @@ private void ComputeAndDisplayCorrelationMatrix(bool IsFullScreen, bool IsToBeDi if (GlobalInfo.OptionsWindow.radioButtonPearson.Checked) TitleForGraph = "Pearson's "; else if (GlobalInfo.OptionsWindow.radioButtonPearson.Checked) TitleForGraph = "Spearman's "; - else if (GlobalInfo.OptionsWindow.radioButtonMIC.Checked) TitleForGraph = "MIC's "; + else TitleForGraph = "MIC's "; TitleForGraph += "correlation ranking"; Title CurrentTitle1 = new Title(TitleForGraph); - if (IsToBeDisplayed) NewWindow1.Show(); - else - NewWindow1.chartForSimpleForm.SaveImage(PathForImage + "_Ranking.png", ChartImageFormat.Png); + /* if (IsToBeDisplayed) */ + NewWindow1.Show(); + //else + // NewWindow1.chartForSimpleForm.SaveImage(PathForImage + "_Ranking.png", ChartImageFormat.Png); NewWindow1.chartForSimpleForm.Titles.Add(CurrentTitle1); NewWindow1.Text = "Quality Control: Corr. ranking"; @@ -3826,2263 +4723,4699 @@ private void DisplayMatrix(double[,] Matrix, List ListLabelX, List + /// Draw normal probability plot a complete screening + /// + /// + /// + private void normalProbabilityPlotToolStripMenuItem1_Click(object sender, EventArgs e) + { + ComputeAndDisplayMormalProbabilityPlot(true); + } + + + private void ComputeAndDisplayMormalProbabilityPlot(bool IsFullScreen) + { + if (CompleteScreening == null) return; + + + int CurrentDescSel = comboBoxDescriptorToDisplay.SelectedIndex; + + //if(CurrentDes + if (CompleteScreening.SelectedClass < 0) return; + + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + List PlatesToProcess = new List(); + if (IsFullScreen) + { + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + { + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); + PlatesToProcess.Add(CurrentPlateToProcess); + } + } + else + { + PlatesToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); + } + + List CurrentDesc = new List(); + + // loop on all the plate + for (int PlateIdx = 0; PlateIdx < PlatesToProcess.Count; PlateIdx++) + { + cPlate CurrentPlateToProcess = PlatesToProcess[PlateIdx]; + + for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) + for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) + { + cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(IdxValue, IdxValue0, true); + if (TmpWell != null) + { + if (TmpWell.GetClassIdx() == CompleteScreening.SelectedClass) + CurrentDesc.Add(TmpWell.ListDescriptors[CurrentDescSel].GetValue()); + } + } + } + + if (CurrentDesc.Count < 3) + { + MessageBox.Show("Not enough data of class " + CompleteScreening.SelectedClass, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + CurrentDesc.Sort(); + double[] CenterNormDesc = new double[CurrentDesc.Count]; + CenterNormDesc = MeanCenteringStdStandarization(CurrentDesc.ToArray()); + + int N = CurrentDesc.Count; + double[] CumulativeProba = new double[CurrentDesc.Count]; + for (int i = 1; i < N - 1; i++) + CumulativeProba[i] = (i - 0.3175) / (N + 0.365); + + CumulativeProba[N - 1] = Math.Pow(0.5, 1.0 / N); + CumulativeProba[0] = 1 - CumulativeProba[N - 1]; + + double[] PercentPointFunction = new double[CurrentDesc.Count]; + + for (int i = 0; i < N; i++) + PercentPointFunction[i] = alglib.normaldistr.invnormaldistribution(CumulativeProba[i]); + + SimpleForm NewWindow = new SimpleForm(); + NewWindow.Width = 600; + NewWindow.Height = 600; + + NewWindow.Name = CompleteScreening.ListDescriptors[CurrentDescSel].GetName() + " normality plot : " + CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells() + " points"; + Series CurrentSeries = new Series(); + CurrentSeries.ShadowOffset = 1; + for (int Pt = 0; Pt < CurrentDesc.Count; Pt++) + { + CurrentSeries.Points.AddXY(PercentPointFunction[Pt], CenterNormDesc[Pt]); + CurrentSeries.Points[Pt].Color = CompleteScreening.GlobalInfo.ListWellClasses[CompleteScreening.SelectedClass].ColourForDisplay; + CurrentSeries.Points[Pt].MarkerStyle = MarkerStyle.Circle; + CurrentSeries.Points[Pt].MarkerSize = 6; + } + + ChartArea CurrentChartArea = new ChartArea(); + CurrentChartArea.BorderColor = Color.Black; + NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + + NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); + CurrentChartArea.Axes[0].MajorGrid.Enabled = true; + CurrentChartArea.Axes[1].MajorGrid.Enabled = true; + CurrentChartArea.AxisY.Minimum = CenterNormDesc[0]; + CurrentChartArea.AxisY.Maximum = CenterNormDesc[CurrentDesc.Count - 1]; + CurrentChartArea.AxisX.Minimum = -3; + CurrentChartArea.AxisX.Maximum = 3; + CurrentChartArea.AxisY.LabelStyle.Format = "N1"; + CurrentChartArea.AxisX.LabelStyle.Format = "N1"; + + CurrentSeries.ChartType = SeriesChartType.Point; + NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + + double Anderson_DarlingValue = Anderson_Darling(CurrentDesc.ToArray()); + GlobalInfo.ConsoleWriteLine("Anderson-Darling Test: " + Anderson_DarlingValue); - if (tabControlMain.SelectedTab.Name == tabPageQualityQtrl.Name) + Title AndersonLegend = new Title(); + if (CurrentDesc.Count >= 5) { + double Jarque_BeraValue; + alglib.jarqueberatest(CurrentDesc.ToArray(), CurrentDesc.Count, out Jarque_BeraValue); + GlobalInfo.ConsoleWriteLine("Jarque-Bera Test: " + Jarque_BeraValue); + // AndersonLegend.Text = "Jarque-Bera: " + String.Format("{0:0.####}", Jarque_BeraValue); + } + + AndersonLegend.Text += "Anderson-Darling: " + String.Format("{0:0.##}", Anderson_DarlingValue); + AndersonLegend.Alignment = ContentAlignment.MiddleCenter; + AndersonLegend.Docking = Docking.Bottom; + AndersonLegend.TextOrientation = TextOrientation.Horizontal; + + NewWindow.chartForSimpleForm.Titles.Add(AndersonLegend); + + Title MainLegend = new Title(); + MainLegend.Text = CompleteScreening.ListDescriptors[CurrentDescSel].GetName(); + MainLegend.Docking = Docking.Top; + MainLegend.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); + NewWindow.chartForSimpleForm.Titles.Add(MainLegend); + NewWindow.chartForSimpleForm.Series.Add("TrendLine"); + NewWindow.chartForSimpleForm.Series["TrendLine"].ChartType = SeriesChartType.Line; + NewWindow.chartForSimpleForm.Series["TrendLine"].BorderWidth = 1; + NewWindow.chartForSimpleForm.Series["TrendLine"].Color = Color.Red; + // Line of best fit is linear + string typeRegression = "Linear";//"Exponential";// + // The number of days for Forecasting + string forecasting = "1"; + // Show Error as a range chart. + string error = "false"; + // Show Forecasting Error as a range chart. + string forecastingError = "false"; + // Formula parameters + string parameters = typeRegression + ',' + forecasting + ',' + error + ',' + forecastingError; + NewWindow.chartForSimpleForm.Series[0].Sort(PointSortOrder.Ascending, "X"); + // Create Forecasting Series. + NewWindow.chartForSimpleForm.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, NewWindow.chartForSimpleForm.Series[0], NewWindow.chartForSimpleForm.Series["TrendLine"]); + // NewWindow.Text = "Normal Probability Plot / " +; + NewWindow.Show(); + if (IsFullScreen) + { + NewWindow.Text = CurrentDesc.Count + " points"; } else { - sb.Append(String.Format(CompleteScreening.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetName() + "\t")); - //sb.Append("\t"); - for (int i = 0; i < CompleteScreening.Columns - 1; i++) + NewWindow.Text = CompleteScreening.GetCurrentDisplayPlate().Name + " : " + CurrentDesc.Count + " points"; + } + NewWindow.chartForSimpleForm.Update(); + NewWindow.chartForSimpleForm.Show(); + NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + } + #endregion + + #region XY scatter points + private void xYScatterPointsToolStripMenuItem_Click(object sender, EventArgs e) + { + cFeedBackMessage MessageReturned; + + cViewer2DScatterPoint V1D = new cViewer2DScatterPoint(); + V1D.Chart.IsSelectable = true; + //V1D.Chart.LabelAxisX = "Well Index"; + //V1D.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); + //V1D.Chart.BackgroundColor = Color.LightYellow; + //V1D.Chart.IsXAxis = true; + + + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + + if (ListClassSelected.Sum() < 1) + { + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + //cDisplayToWindow CDW1 = new cDisplayToWindow(); + // cListWell ListWellsToProcess = new cListWell(); + + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + { + //cExtendedTable DataFromPlate = new cExtendedTable(CompleteScreening.GetCurrentDisplayPlate().ListActiveWells, + // CompleteScreening.ListDescriptors.CurrentSelectedDescriptor); + + List ListWellsToProcess = new List(); + + //foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (item.GetClassIdx() != -1) + if (ListClassSelected[item.GetClassIdx()] == 1) ListWellsToProcess.Add(item); + + cExtendedTable DataFromPlate = new cExtendedTable(ListWellsToProcess, true); + DataFromPlate.Name = CompleteScreening.GetCurrentDisplayPlate().Name; + + V1D.Chart.IsShadow = true; + V1D.Chart.IsBorder = true; + V1D.Chart.IsSelectable = true; + V1D.Chart.CurrentTitle.Tag = CompleteScreening.GetCurrentDisplayPlate(); + V1D.SetInputData(DataFromPlate); + V1D.Run(); + + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(V1D.GetOutPut()); + Designer0.Run(); + + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = "2D Scatter points graph - " + DataFromPlate[0].Count + " wells."; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); + } + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + V1D.Chart.MarkerSize = 5; + V1D.Chart.IsBorder = false; + + //List ListWell = new List(); + //foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + // foreach (cWell TmpWell in TmpPlate.ListActiveWells) + // ListWell.Add(TmpWell); + + //cExtendedTable DataFromPlate = new cExtendedTable(ListWell, + // CompleteScreening.ListDescriptors.CurrentSelectedDescriptor); + + List ListWellsToProcess = new List(); + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) + if (ListClassSelected[item.GetClassIdx()] == 1) ListWellsToProcess.Add(item); + + cExtendedTable DataFromPlate = new cExtendedTable(ListWellsToProcess, true); + + DataFromPlate.Name = CompleteScreening.Name + " - " + CompleteScreening.ListPlatesActive.Count + " plates"; + + V1D.SetInputData(DataFromPlate); + V1D.Run(); + + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(V1D.GetOutPut()); + Designer0.Run(); + + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = "2D Scatter points graph - " + DataFromPlate[0].Count + " wells."; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); + + } + else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + { + cDesignerTab CDT = new cDesignerTab(); + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) { - int IdxCol = i + 1; - sb.Append(String.Format("{0}\t", IdxCol)); + //cExtendedTable DataFromPlate = new cExtendedTable(TmpPlate.ListActiveWells, + // CompleteScreening.ListDescriptors.CurrentSelectedDescriptor); + + List ListWellsToProcess = new List(); + + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) + if (ListClassSelected[item.GetClassIdx()] == 1) ListWellsToProcess.Add(item); + + cExtendedTable DataFromPlate = new cExtendedTable(ListWellsToProcess, true); + + DataFromPlate.Name = TmpPlate.Name; + + V1D = new cViewer2DScatterPoint(); + V1D.Chart.IsSelectable = true; + V1D.Chart.LabelAxisX = "Well Index"; + V1D.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + V1D.Chart.BackgroundColor = Color.LightYellow; + V1D.Chart.IsXAxis = true; + V1D.Chart.CurrentTitle.Tag = TmpPlate; + V1D.SetInputData(DataFromPlate); + V1D.Title = TmpPlate.Name; + V1D.Run(); + + CDT.SetInputData(V1D.GetOutPut()); } - sb.Append(String.Format("{0}", CompleteScreening.Columns - 1)); - sb.AppendLine(); - for (int j = 0; j < CompleteScreening.Rows; j++) - { - byte[] strArray = new byte[1]; - strArray[0] = (byte)(j + 65); + CDT.Run(); - string Chara = Encoding.UTF7.GetString(strArray); - sb.Append(String.Format("{0}\t", Chara)); + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(CDT.GetOutPut()); + Disp0.Title = "2D Scatter points graphs"; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); + } - for (int i = 0; i < CompleteScreening.Columns - 1; i++) - { - cWell CurrentWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(i, j, false); - if (CurrentWell == null) - sb.Append("\t"); - else - sb.Append(String.Format("{0}\t", CurrentWell.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetValue())); - } + //if (CompleteScreening == null) return; + + //SimpleFormForXY FormToDisplayXY = new SimpleFormForXY(false); + //FormToDisplayXY.CompleteScreening = CompleteScreening; + + //for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) + //{ + // FormToDisplayXY.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + // FormToDisplayXY.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + //} + + //FormToDisplayXY.comboBoxDescriptorX.SelectedIndex = 0; + //FormToDisplayXY.comboBoxDescriptorY.SelectedIndex = 0; + + + //FormToDisplayXY.DisplayXY(); + //FormToDisplayXY.ShowDialog(); + + //return; + } + + + #endregion + + #region Plugins Management + private void HCSAnalyzer_Shown(object sender, EventArgs e) + { + BuildPluginMenu(); + } + + private void BuildPluginMenu() + { + List paList = null; + try + { + paList = PluginDescriptor.GetList(Application.StartupPath + @"\Plugins"); + } + catch (DirectoryNotFoundException e) + { + Directory.CreateDirectory("Plugins"); + paList = PluginDescriptor.GetList(Application.StartupPath + @"\Plugins"); + //MessageBox.Show("Error: " + e.Message, "Plugin's directory not Found" + "\n No Plugin will be loaded", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + ToolStripMenuItem currentMenu = null; + + foreach (PluginDescriptor pluginDescriptor in paList) + { + currentMenu = pluginsToolStripMenuItem; + + string[] subMenu = pluginDescriptor.MenuPath.Split('|'); + if (pluginDescriptor.MenuPath.Length != 0) + { + foreach (string sm in subMenu) + { + string menuName = sm.Trim(); + + //if submenu exist , get in + if (currentMenu.DropDownItems.ContainsKey(menuName)) + { + currentMenu = (ToolStripMenuItem)currentMenu.DropDownItems[menuName]; + } + else//if not, create it first. + { + ToolStripMenuItem tsmMenu = new ToolStripMenuItem(menuName); + currentMenu.DropDownItems.Add(tsmMenu); + tsmMenu.Name = menuName; + currentMenu = tsmMenu; + } + } + } + + ToolStripMenuItem tsmiName = + new ToolStripMenuItem(pluginDescriptor.Name + @" - " + pluginDescriptor.Author); + currentMenu.DropDownItems.Add(tsmiName); + tsmiName.Tag = pluginDescriptor; + tsmiName.Name = pluginDescriptor.Name; + currentMenu = tsmiName; + currentMenu.Click += new EventHandler(toolMenuItem_Click); + } + } + + private void toolMenuItem_Click(object sender, EventArgs e) + { + try + { + ToolStripMenuItem s = (ToolStripMenuItem)sender; + + PluginDescriptor p = (PluginDescriptor)s.Tag; + Plugin.CurrentScreen = CompleteScreening; + p.Instanciate(); + } + catch (PluginException ex) + { + MessageBox.Show(ex.Message, "Plugin information", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + #endregion + + + private void HCSAnalyzer_FormClosed(object sender, FormClosedEventArgs e) + { + if (GlobalInfo.CurrentScreen != null) + GlobalInfo.CurrentScreen.Close3DView(); + this.Dispose(); + } + + private void SwitchVizuMode(object sender, EventArgs e) + { + GlobalInfo.SwitchVisuMode(); + } + + #region DRC management + + private void doseResponseDesignerToolStripMenuItem_Click(object sender, EventArgs e) + { + if (GlobalInfo.WindowForDRCDesign.IsDisposed) GlobalInfo.WindowForDRCDesign = new FormForDRCDesign(); + GlobalInfo.WindowForDRCDesign.Visible = true; + } + + private void convertDRCToWellToolStripMenuItem1_Click(object sender, EventArgs e) + { + + System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (ResWin == System.Windows.Forms.DialogResult.No) return; + //foreach (cDescriptorsType DescType in CompleteScreening.ListDescriptors) + //{ + // CompleteScreening.ListDescriptors.RemoveDescUnSafe(DescType, CompleteScreening); + //} + + + if (CompleteScreening != null) CompleteScreening.Close3DView(); + + // CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); + cScreening MergedScreening = new cScreening("Merged Screen", GlobalInfo); + MergedScreening.PanelForPlate = this.panelForPlate; + + MergedScreening.Rows = CompleteScreening.Rows; + MergedScreening.Columns = CompleteScreening.Columns; + MergedScreening.ListPlatesAvailable = new cExtendPlateList(); + + // create the descriptor + MergedScreening.ListDescriptors.Clean(); + + int Idesc = 0; + + List ListDescType = new List(); + + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + if (!CompleteScreening.ListDescriptors[i].IsActive()) continue; + + cDescriptorsType DescEC50 = new cDescriptorsType("EC50_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); + ListDescType.Add(DescEC50); + MergedScreening.ListDescriptors.AddNew(DescEC50); + + cDescriptorsType DescTop = new cDescriptorsType("Top_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); + ListDescType.Add(DescTop); + MergedScreening.ListDescriptors.AddNew(DescTop); + + cDescriptorsType DescBottom = new cDescriptorsType("Bottom_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); + ListDescType.Add(DescBottom); + MergedScreening.ListDescriptors.AddNew(DescBottom); + + cDescriptorsType DescSlope = new cDescriptorsType("Slope_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); + ListDescType.Add(DescSlope); + MergedScreening.ListDescriptors.AddNew(DescSlope); + + Idesc++; + } + + MergedScreening.ListDescriptors.CurrentSelectedDescriptorIdx = 0; + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesAvailable) + { + + cPlate NewPlate = new cPlate("Cpds", CurrentPlate.Name + " Merged", MergedScreening); + // check if the plate exist already + MergedScreening.AddPlate(NewPlate); + + foreach (cDRC_Region CurrentRegion in CurrentPlate.ListDRCRegions) + { + + List LDesc = new List(); + + Idesc = 0; + int IDESCBase = 0; + + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + if (!CompleteScreening.ListDescriptors[i].IsActive()) continue; + + cDRC CurrentDRC = CurrentRegion.GetDRC(CompleteScreening.ListDescriptors[IDESCBase++]); + + cDescriptor Desc_EC50 = new cDescriptor(CurrentDRC.EC50, ListDescType[Idesc++], CompleteScreening); + LDesc.Add(Desc_EC50); + + cDescriptor Desc_Top = new cDescriptor(CurrentDRC.Top, ListDescType[Idesc++], CompleteScreening); + LDesc.Add(Desc_Top); + + cDescriptor Desc_Bottom = new cDescriptor(CurrentDRC.Bottom, ListDescType[Idesc++], CompleteScreening); + LDesc.Add(Desc_Bottom); + + cDescriptor Desc_Slope = new cDescriptor(CurrentDRC.Slope, ListDescType[Idesc++], CompleteScreening); + LDesc.Add(Desc_Slope); + } + cWell NewWell = new cWell(LDesc, CurrentRegion.PosXMin + 1, CurrentRegion.PosYMin + 1, MergedScreening, NewPlate); + NewWell.Name = "DRC [" + CurrentRegion.PosXMin + ":" + CurrentRegion.PosYMin + "]"; + NewPlate.AddWell(NewWell); + } + } + + // PanelList[0].CurrentScreening.ListPlatesActive.Clear(); + // PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.RefreshInfoScreeningRichBox(); + MergedScreening.ListPlatesActive = new cExtendPlateList(); + + for (int i = 0; i < MergedScreening.ListPlatesAvailable.Count; i++) + { + MergedScreening.ListPlatesActive.Add(MergedScreening.ListPlatesAvailable[i]); + // MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Add(PanelList[0].CurrentScreening.ListPlatesActive[i].Name); + } + //PanelList[0].CurrentScreening.CurrentDisplayPlateIdx = 0; + //PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = 0; + + //PanelList[0].CurrentScreening.GetCurrentDisplayPlate().DisplayDistribution(PanelList[0].CurrentScreening.ListDescriptors.CurrentSelectedDescriptor, false); + + + + + CompleteScreening.ListDescriptors = MergedScreening.ListDescriptors; + CompleteScreening.ListPlatesAvailable = MergedScreening.ListPlatesAvailable; + CompleteScreening.ListPlatesActive = MergedScreening.ListPlatesActive; + + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); + } + + private void displayDRCToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions == null) return; + + int h = 0; + FormToDisplayDRC WindowforDRCsDisplay = new FormToDisplayDRC(); + List imagenames = new List(); + int cpt = 0; + foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) + { + + List ListDRC = new List(); + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + if (CompleteScreening.ListDescriptors[i].IsActive()) + { + cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); + + ListDRC.Add(CurrentDRC); + + + } + + } + if (ListDRC.Count != 0) + { + + cDRCDisplay DRCDisplay = new cDRCDisplay(ListDRC, GlobalInfo); + + imagenames.Add(@"C:\" + cpt + ".jpg"); + + if (DRCDisplay.CurrentChart.Series.Count == 0) continue; + + DRCDisplay.CurrentChart.Location = new Point((DRCDisplay.CurrentChart.Width + 50) * 0, (DRCDisplay.CurrentChart.Height + 10 + DRCDisplay.CurrentRichTextBox.Height) * h++); + DRCDisplay.CurrentRichTextBox.Location = new Point(DRCDisplay.CurrentChart.Location.X, DRCDisplay.CurrentChart.Location.Y + DRCDisplay.CurrentChart.Height + 5); + + WindowforDRCsDisplay.LChart.Add(DRCDisplay.CurrentChart); + WindowforDRCsDisplay.LRichTextBox.Add(DRCDisplay.CurrentRichTextBox); + DRCDisplay.CurrentChart.SaveImage(@"C:\" + cpt + ".jpg", ChartImageFormat.Jpeg); + } + cpt++; + } + + + + + + + + + + + //Clipboard.SetDataObject(Image.FromFile(@"c:\1.jpg")); + //xlWorkSheet.Range["A1"].Select(); + //xlWorkSheet.PasteSpecial(); + //add some text + //xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com"; + //xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File"; + for (int i = 0; i < imagenames.Count; i++) + { + + + // xlWorkSheet.Shapes.AddPicture(imagenames[i], Microsoft.Office.Core.MsoTriState.msoFalse, + //Microsoft.Office.Core.MsoTriState.msoCTrue, 50, 1+50*i, 300, 45); + + } + + + + + StreamWriter filecsv = null; + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + + Excel.Application xlApp = new Excel.Application(); + Excel.Workbook xlWorkBook; + Excel.Worksheet xlWorkSheet; + object misValue = System.Reflection.Missing.Value; + + // xlApp = new Excel.ApplicationClass(); + xlWorkBook = xlApp.Workbooks.Add(misValue); + xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); + // Microsoft.Office.Interop.Excel.Range cell = GetMyPictureCELL(taperSheet); + + List ListDRC = new List(); + foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) + { + + + if (CompleteScreening.ListDescriptors[i].IsActive()) + { + cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); + + ListDRC.Add(CurrentDRC); + + + } + + } + + + string str = CompleteScreening.ListDescriptors[i].GetName(); + str = str.Replace("\\", " "); + str = str.Replace("/", " "); + //filecsv = new StreamWriter(@"C:\" + str + ".xls"); + //String name = CompleteScreening.GlobalInfo.CurrentScreen.CurrentDisplayPlateIdx.ToString(); + //filecsv.WriteLine("Pos" + "," + "EC50" + "," + "Bottom" + "," + "Top" + "," + "Slope" + "," + "RelativeError"); + + xlWorkSheet.Cells[1, 1] = "Pos"; xlWorkSheet.Cells[1, 2] = "EC50"; xlWorkSheet.Cells[1, 3] = "Top"; xlWorkSheet.Cells[1, 4] = "Bottom"; + xlWorkSheet.Cells[1, 5] = "Slope"; + + for (int j = 0; j < ListDRC.Count; j++) + { + + + + xlWorkSheet.Cells[j + 2, 1] = ListDRC[j].AssociatedDRCRegion.PosXMin + ":" + ListDRC[j].AssociatedDRCRegion.PosYMin; + xlWorkSheet.Cells[j + 2, 2] = ListDRC[j].EC50; + xlWorkSheet.Cells[j + 2, 2].AddComment(" "); + xlWorkSheet.Cells[j + 2, 2].Comment.Shape.Fill.UserPicture(imagenames[j]); + xlWorkSheet.Cells[j + 2, 3] = ListDRC[j].Top; + xlWorkSheet.Cells[j + 2, 4] = ListDRC[j].Bottom; + xlWorkSheet.Cells[j + 2, 5] = ListDRC[j].Slope; + + + //filecsv.Write(ListDRC[j].AssociatedDRCRegion.PosXMin + ":" + ListDRC[j].AssociatedDRCRegion.PosYMin); filecsv.Write(","); + //filecsv.Write(ListDRC[j].EC50); filecsv.Write(","); filecsv.Write(ListDRC[j].Bottom); filecsv.Write(","); filecsv.Write(ListDRC[j].Top); + //filecsv.Write(","); filecsv.Write(ListDRC[j].Slope); filecsv.Write(","); filecsv.Write(ListDRC[j].RelativeError); filecsv.WriteLine(); + + } + + // filecsv.Close(); + xlWorkBook.SaveAs(@"C:\" + str + ".xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, + Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); + xlWorkBook.Close(true, misValue, misValue); + xlApp.Quit(); + releaseObject(xlWorkSheet); + releaseObject(xlWorkBook); + releaseObject(xlApp); + } + + + + + + + + WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LChart.ToArray()); + WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LRichTextBox.ToArray()); + WindowforDRCsDisplay.Show(); + } + + private void releaseObject(object obj) + { + try + { + System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); + obj = null; + } + catch (Exception ex) + { + obj = null; + MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); + } + finally + { + GC.Collect(); + } + } + + + + + private void displayRespondingDRCToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions == null) return; + + FormForDRCSelection WindowSelectionDRC = new FormForDRCSelection(); + if (WindowSelectionDRC.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + if (WindowSelectionDRC.checkBoxMOAClassification.Checked == false) + { + int h = 0; + FormToDisplayDRC WindowforDRCsDisplay = new FormToDisplayDRC(); + + foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) + { + int cpt = 0; + List ListDRC = new List(); + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + if (CompleteScreening.ListDescriptors[i].IsActive()) + { + cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); + if (CurrentDRC.IsResponding(WindowSelectionDRC) == 1) + { + ListDRC.Add(CurrentDRC); + cpt++; + } + } + } + if (ListDRC.Count != 0) + { + cDRCDisplay DRCDisplay = new cDRCDisplay(ListDRC, GlobalInfo); + + + if (DRCDisplay.CurrentChart.Series.Count == 0) continue; + + DRCDisplay.CurrentChart.Location = new Point((DRCDisplay.CurrentChart.Width + 50) * 0, (DRCDisplay.CurrentChart.Height + 10 + DRCDisplay.CurrentRichTextBox.Height) * h++); + DRCDisplay.CurrentRichTextBox.Location = new Point(DRCDisplay.CurrentChart.Location.X, DRCDisplay.CurrentChart.Location.Y + DRCDisplay.CurrentChart.Height + 5); + + WindowforDRCsDisplay.LChart.Add(DRCDisplay.CurrentChart); + WindowforDRCsDisplay.LRichTextBox.Add(DRCDisplay.CurrentRichTextBox); + } + } + + WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LChart.ToArray()); + WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LRichTextBox.ToArray()); + WindowforDRCsDisplay.Show(); + return; + } + + + System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (ResWin == System.Windows.Forms.DialogResult.No) return; + + + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + foreach (cDRC_Region TmpRegion in CurrentPlate.ListDRCRegions) + { + int cpt = 0; + //List ListDRC = new List(); + //for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + //{ + // if (CompleteScreening.ListDescriptors[i].IsActive()) + // { + // cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); + // if (CurrentDRC.IsResponding(WindowSelectionDRC)) + // { + // ListDRC.Add(CurrentDRC); + // cpt++; + // } + // } + + + //} + List ResDescActive = TmpRegion.GetListRespondingDescritpors(CompleteScreening, WindowSelectionDRC); + + for (int j = 0; j < TmpRegion.NumReplicate; j++) + for (int i = 0; i < TmpRegion.NumConcentrations; i++) + { + + cWell CurrentWell = TmpRegion.GetListWells()[j][i]; + if (CurrentWell == null) continue; + + for (int IdxDesc = 0; IdxDesc < ResDescActive.Count; IdxDesc++) + { + if (ResDescActive[IdxDesc] == -1) continue; + + //CurrentWell.ListDescriptors[IdxDesc].HistoValues = new double[1]; + CurrentWell.ListDescriptors[IdxDesc].SetHistoValues((double)ResDescActive[IdxDesc]); + if ((i == 0) && (j == 0)) + CurrentWell.SetClass(0); + else + CurrentWell.SetAsNoneSelected(); + //[0] = ResDescActive[IdxDesc]; + CurrentWell.ListDescriptors[IdxDesc].UpDateDescriptorStatistics(); + + } + + } + } + CurrentPlate.UpDataMinMax(); + } + } + + #endregion + + private void xYZScatterPointsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + + GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = false; + FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(false, CompleteScreening); + for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) + { + FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + } + FormToDisplayXYZ.Show(); + FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + return; + } + + private void xYZScatterPointsToolStripMenuItemFullScreen_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + + GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = false; + FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(true, CompleteScreening); + for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) + { + FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + } + FormToDisplayXYZ.Show(); + FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + return; + + } + + #region Distributions + private void distributionsModeToolStripMenuItem_Click(object sender, EventArgs e) + { + GlobalInfo.SwitchDistributionMode(); + } + + private void displayReferenceToolStripMenuItem_Click(object sender, EventArgs e) + { + + if (CompleteScreening.Reference == null) + { + MessageBox.Show("No reference curve generated. Switch to Distribution mode.\n", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + FormTMP TMPWin = new FormTMP(); + cExtendedList ListValues = CompleteScreening.Reference.GetValues(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); + ListValues.Name = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + + cPanelHisto PanelHisto = new cPanelHisto(ListValues, eGraphType.HISTOGRAM, eOrientation.HORIZONTAL); + + // cDisplayHisto CpdToDisplayHisto = new cDisplayHisto(); + TMPWin.Controls.Add(PanelHisto.WindowForPanelHisto.panelForGraphContainer); + + //TMPWin.panel.Controls.Add(CpdToDisplayHisto); + TMPWin.ShowDialog(); + + + // cWindowToDisplayHisto NewWindow = new cWindowToDisplayHisto(CompleteScreening,CompleteScreening.Reference.GetValues(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor)); + // NewWindow.Show(); + // NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); + + // cWindowToDisplayScatter NewWindow = new cWindowToDisplayScatter(); + // NewWindow.chartForSimpleForm.Controls.Add(CompleteScreening.Reference.GetChart(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor)); + // NewWindow.Show(); + //cDisplayGraph DispGraph = new cDisplayGraph(CompleteScreening.Reference[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].ToArray(), + // CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " - Reference distribution."); + } + #endregion + + + + + + + + //public void DisplayMINE(List[] ListValueDesc) + //{ + // int NumDesc = ListValueDesc.Length; + + // double[,] CorrelationMatrix = new double[NumDesc, NumDesc]; + + // double[][] dataset1 = new double[NumDesc][]; + // string[] VarNames = new string[NumDesc]; + + // for (int iDesc = 0; iDesc < NumDesc; iDesc++) + // { + // dataset1[iDesc] = new double[ListValueDesc[iDesc].Count]; + + // Array.Copy(ListValueDesc[iDesc].ToArray(), dataset1[iDesc], ListValueDesc[iDesc].Count); + // VarNames[iDesc] = iDesc.ToString(); + // } + // data.Dataset data1 = new data.Dataset(dataset1, VarNames, 0); + // VarPairQueue Qu = new VarPairQueue(data1); + + // for (int iDesc = 0; iDesc < NumDesc; iDesc++) + // for (int jDesc = 0; jDesc < iDesc; jDesc++) + // { + // Qu.addPair(iDesc, jDesc); + // } + // Analysis ana = new Analysis(data1, Qu); + // AnalysisParameters param = new AnalysisParameters(); + // double resparam = param.commonValsThreshold; + + // // analysis.results.FullResult Full = new analysis.results.FullResult(); + // //List Brief = new List(); + // //analysis.results.BriefResult Brief = new analysis.results.BriefResult(); + + + + // java.lang.Class t = java.lang.Class.forName("analysis.results.BriefResult"); + + // //java.lang.Class restype = null; + // ana.analyzePairs(t, param); + + // // object o = (ana.varPairQueue().peek()); + // // ana.getClass(); + // // int resNum = ana.numResults(); + // analysis.results.Result[] res = ana.getSortedResults(); + + // List ListValues = new List(); + // List NameX = CompleteScreening.ListDescriptors.GetListNameActives(); + + // List ListIscolor = new List(); + + // for (int Idx = 0; Idx < res.Length; Idx++) + // { + // ListValues.Add(res[Idx].toString().Split(',')); + // ListValues[Idx][0] = NameX[int.Parse(ListValues[Idx][0])]; + // ListValues[Idx][1] = NameX[int.Parse(ListValues[Idx][1])]; + // } + // string[] ListNames = res[0].getHeader().Split(','); + + + // ListNames[0] = "Descriptor A"; + // ListNames[1] = "Descriptor B"; + + + // for (int NIdx = 0; NIdx < ListNames.Length; NIdx++) + // { + // if (NIdx == 0) ListIscolor.Add(false); + // else if (NIdx == 1) ListIscolor.Add(false); + // else ListIscolor.Add(true); + + // } + + // cDisplayTable DisplayForTable = new cDisplayTable("MINE Analysis results", ListNames, ListValues, GlobalInfo, true); + + //} + + private void findPathwayToolStripMenuItem_Click(object sender, EventArgs e) + { + + // if (CompleteScreening == null) return; + // FormForNameRequest FormForRequest = new FormForNameRequest(); + // if (FormForRequest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + // int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + // FormForKeggGene KeggWin = new FormForKeggGene(); + + // string[] intersection_gene_pathways = new string[1]; + // string[] Pathways = { FormForRequest.textBoxForName.Text }; + // intersection_gene_pathways = ServKegg.get_genes_by_pathway("path:" + Pathways[0]); + // if ((Pathways == null) || (Pathways.Length == 0) || (Pathways[0] == "")) + // { + // MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } + + // string[] fg_list = { "black" }; + // string[] bg_list = { "orange" }; + + // string pathway_map_html = ""; + // // KEGG ServKegg = new KEGG(); + // string[] ListGenesinPathway = ServKegg.get_genes_by_pathway("path:" + Pathways[0]); + // if (ListGenesinPathway.Length == 0) + // { + // return; + // } + // double[] ListValues = new double[ListGenesinPathway.Length]; + // int IDxGeneOfInterest = 0; + // foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + // { + // foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) + // { + // string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; + + // for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) + // { + + // if (CurrentLID == intersection_gene_pathways[0]) + // IDxGeneOfInterest = IdxGene; + + // if (CurrentLID == ListGenesinPathway[IdxGene]) + // { + // ListValues[IdxGene] = CurrentWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetValue(); + // break; + // } + // } + // } + // } + + // bg_list = new string[ListGenesinPathway.Length]; + // fg_list = new string[ListGenesinPathway.Length]; + + // double MinValue = ListValues.Min(); + // double MaxValue = ListValues.Max(); + + // for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) + // { + + // int ConvertedValue = (int)((((CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); + + // Color Coul = Color.FromArgb(CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[0][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[1][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[2][ConvertedValue]); + + // if (IdxCol == IDxGeneOfInterest) + // fg_list[IdxCol] = "white"; + // else + // fg_list[IdxCol] = "#000000"; + // bg_list[IdxCol] = "#" + Coul.Name.Remove(0, 2); + + // } + + // // foreach (string item in ListP.listBoxPathways.SelectedItems) + // { + // pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects(Pathways[0], ListGenesinPathway, fg_list, bg_list); + // } + + // pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)(Pathways[0]), intersection_gene_pathways, fg_list, bg_list); + + // // FormForKegg KeggWin = new FormForKegg(); + // if (pathway_map_html.Length == 0) return; + + // // + // //KeggWin.Show(); + // //ListP.listBoxPathways.MouseDoubleClick += new MouseEventHandler(listBox1_MouseDoubleClick); + // KeggWin.webBrowser.Navigate(pathway_map_html); + + // KeggWin.Show(); + } + + + + private void panelForPlate_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (CompleteScreening == null) return; + + + int ScrollShiftY = this.panelForPlate.VerticalScroll.Value; + int ScrollShiftX = this.panelForPlate.HorizontalScroll.Value; + int Gutter = (int)GlobalInfo.OptionsWindow.numericUpDownGutter.Value; + + int PosX = (int)((e.X - ScrollShiftX) / (GlobalInfo.SizeHistoWidth + Gutter)); + int PosY = (int)((e.Y - ScrollShiftY) / (GlobalInfo.SizeHistoHeight + Gutter)); + + + bool OnlyOnSelected = false; + if ((PosX == 0) && (PosY == 0)) + { + GlobalSelection(false); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + return; + } + + + if ((PosX == 0) && (PosY > 0)) + { + for (int col = 0; col < CompleteScreening.Columns; col++) + { + if (CompleteScreening.IsSelectionApplyToAllPlates) + { + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + { + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(PlateIdx); + cWell TmpWell = CurrentPlateToProcess.GetWell(col, PosY - 1, OnlyOnSelected); + if (TmpWell == null) continue; + + if (CompleteScreening.GetSelectionType() == -1) + TmpWell.SetAsNoneSelected(); + else + TmpWell.SetClass(CompleteScreening.GetSelectionType()); + } + } + else + { + cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, PosY - 1, OnlyOnSelected); + if (TmpWell != null) + { + if (CompleteScreening.GetSelectionType() == -1) TmpWell.SetAsNoneSelected(); + else + TmpWell.SetClass(CompleteScreening.GetSelectionType()); + } + } + } + CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + return; + } + + if ((PosY == 0) && (PosX > 0)) + { + for (int row = 0; row < CompleteScreening.Rows; row++) + { + if (CompleteScreening.IsSelectionApplyToAllPlates) + { + int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + + for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + { + cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(PlateIdx); + cWell TmpWell = CurrentPlateToProcess.GetWell(PosX - 1, row, OnlyOnSelected); + if (TmpWell == null) continue; + + if (CompleteScreening.GetSelectionType() == -1) + TmpWell.SetAsNoneSelected(); + else + TmpWell.SetClass(CompleteScreening.GetSelectionType()); + } + } + else + { + cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(PosX - 1, row, OnlyOnSelected); + if (TmpWell != null) + { + if (CompleteScreening.GetSelectionType() == -1) TmpWell.SetAsNoneSelected(); + else + TmpWell.SetClass(CompleteScreening.GetSelectionType()); + } + } + } + CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + return; + } + } + + private void displayGraphToolStripMenuItem_Click(object sender, EventArgs e) + { + cExtendPlateList ListToProcess = new cExtendPlateList(); + ListToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); + ComputeAndDisplayLDA(ListToProcess); + } + + + public string GenerateLDADescriptor(cExtendPlateList PlatesToProcess, int NeutralClass) + { + + int NumWell = 0; + int NumWellForLearning = 0; + foreach (cPlate CurrentPlate in PlatesToProcess) + { + NumWellForLearning += CurrentPlate.GetNumberOfActiveWellsButClass(NeutralClass); + NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); + } + + if (NumWellForLearning == 0) + { + MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return ""; + } + + int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); + + if (NumDesc <= 1) + { + MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return ""; + } + + double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; + + // return; + Matrix EigenVectors = LDAComputation(DataForLDA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); + + + string AxeName = ""; + int IDxDesc = 0; + //for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) + //{ + // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + + // // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + //} + + for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; Idx++) + { + + if (CompleteScreening.ListDescriptors[Idx].IsActive()) + if (CompleteScreening.ListDescriptors[Idx].GetBinNumber() == 1) + { + AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; + } + else + { + MessageBox.Show("Descriptor length not consistent (" + CompleteScreening.ListDescriptors[Idx].GetName() + " : " + CompleteScreening.ListDescriptors[Idx].GetBinNumber() + " bins", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } + } + + + cDescriptorsType ColumnType = new cDescriptorsType(AxeName.Remove(AxeName.Length - 3), true, 1, GlobalInfo); + + CompleteScreening.ListDescriptors.AddNew(ColumnType); + + + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) + { + List LDesc = new List(); + + double NewValue = 0; + IDxDesc = 0; + for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count - 1; Idx++) + { + if (CompleteScreening.ListDescriptors[Idx].IsActive()) + // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; + NewValue += EigenVectors.getElement(IDxDesc++, 0) * Tmpwell.ListDescriptors[Idx].GetValue(); + } + + cDescriptor NewDesc = new cDescriptor(NewValue, ColumnType, CompleteScreening); + LDesc.Add(NewDesc); + Tmpwell.AddDescriptors(LDesc); + } + } + + CompleteScreening.ListDescriptors.UpDateDisplay(); + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + + StartingUpDateUI(); + + return AxeName; + + } + + public string GeneratePCADescriptor(cExtendPlateList PlatesToProcess, int NumberOfAxis, int NeutralClass) + { + int NumWell = 0; + int NumWellForLearning = 0; + foreach (cPlate CurrentPlate in PlatesToProcess) + { + NumWellForLearning += CurrentPlate.GetNumberOfWellOfClass(NeutralClass); + NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); + } + + if (NumWellForLearning == 0) + { + MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } + + int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); + + if (NumDesc <= 1) + { + MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } + + double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; + + // return; + Matrix EigenVectors = PCAComputation(DataForLDA, NumWellForLearning, NumDesc, NeutralClass, PlatesToProcess); + + + string AxeName = ""; + int IDxDesc = 0; + //for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) + //{ + // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + + // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + //} + + int OriginalDescNumber = CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; + + + for (int AxesIdx = 0; AxesIdx < NumberOfAxis; AxesIdx++) + { + + //for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; Idx++) + //{ + + // if (CompleteScreening.ListDescriptors[Idx].IsActive()) + // if (CompleteScreening.ListDescriptors[Idx].GetBinNumber() == 1) + // { + // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, AxesIdx)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; + // } + // else + // { + // MessageBox.Show("Descriptor length not consistent (" + CompleteScreening.ListDescriptors[Idx].GetName() + " : " + CompleteScreening.ListDescriptors[Idx].GetBinNumber() + " bins", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return ""; + // } + //} + + //cDescriptorsType ColumnType = new cDescriptorsType(AxeName.Remove(AxeName.Length - 3), true, 1); + + cDescriptorsType ColumnType = new cDescriptorsType("PCA_" + (AxesIdx + 1), true, 1, GlobalInfo); + + while (CompleteScreening.ListDescriptors.AddNew(ColumnType) == false) + { + FormForNewDescName NewNameWindow = new FormForNewDescName(); + NewNameWindow.textBoxName.Text = ColumnType.GetName(); + + if (NewNameWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) + return ColumnType.GetName(); + + ColumnType.ChangeName(NewNameWindow.textBoxName.Text); + } + //CompleteScreening.ListDescriptors.AddNew(ColumnType); + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + { + foreach (cWell Tmpwell in TmpPlate.ListActiveWells) + { + List LDesc = new List(); + + double NewValue = 0; + IDxDesc = 0; + + // AxeName += "\nPCA_" + (AxesIdx + 1); + for (int Idx = 0; Idx < OriginalDescNumber - 1; Idx++) + { + if (CompleteScreening.ListDescriptors[Idx].IsActive()) + // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc, AxesIdx)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; + NewValue += EigenVectors.getElement(IDxDesc++, AxesIdx) * Tmpwell.ListDescriptors[Idx].GetValue(); + } + + cDescriptor NewDesc = new cDescriptor(NewValue, ColumnType, CompleteScreening); + LDesc.Add(NewDesc); + Tmpwell.AddDescriptors(LDesc); + } + } + } + CompleteScreening.ListDescriptors.UpDateDisplay(); + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + + StartingUpDateUI(); + + return AxeName; + } + + private void displayGraphToolStripMenuItem_Click_1(object sender, EventArgs e) + { + cExtendPlateList ListToProcess = new cExtendPlateList(); + ListToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); + ComputeAndDisplayLDA(ListToProcess); + } + + + //private void displayGraphToolStripMenuItem1_Click(object sender, EventArgs e) + //{ + // ComputeAndDisplayLDA(CompleteScreening.ListPlatesActive); + //} + + + + private void buttonNextPlate_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + if ((toolStripcomboBoxPlateList.SelectedIndex == -1) && (CompleteScreening.ListPlatesActive.Count > 1)) + { + toolStripcomboBoxPlateList.SelectedIndex = 1; return; + } + if (toolStripcomboBoxPlateList.SelectedIndex >= (toolStripcomboBoxPlateList.Items.Count - 1)) return; + + toolStripcomboBoxPlateList.SelectedIndex++; + } + + private void buttonPreviousPlate_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + if (toolStripcomboBoxPlateList.SelectedIndex <= 0) return; + + toolStripcomboBoxPlateList.SelectedIndex--; + } + + private void distanceMatrixToolStripMenuItem_Click(object sender, EventArgs e) + { + cPlate CurrentPlate = CompleteScreening.ListPlatesActive[CompleteScreening.CurrentDisplayPlateIdx]; + + //double[][] Values = new double[CurrentPlate.ListActiveWells.Count][]; + + //for (int i = 0; i < Values.Length; i++) + // Values[i] = new double[CurrentPlate.ListActiveWells.Count]; + + + //for (int j = 0; j < Values.Length; j++) + //{ + // cWell SourceWell = CurrentPlate.ListActiveWells[j]; + // for (int i = j; i < Values[0].Length; i++) + // { + // cWell DestinationWell = CurrentPlate.ListActiveWells[i]; + // Values[i][j] = Values[j][i] = SourceWell.DistanceTo(DestinationWell, CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, eDistances.EUCLIDEAN); + // } + //} + FormToDisplayDistanceMap SingleMatrix = new FormToDisplayDistanceMap(CurrentPlate, CompleteScreening); + cWindowToDisplaySingleMatrix WindowForSingleArray = new cWindowToDisplaySingleMatrix(SingleMatrix, eDistances.EUCLIDEAN); + } + + + private void buttonDisplayWellsSelectionData_Click(object sender, EventArgs e) + { + DataTable FinalDataTable = new DataTable(); + cExtendedList ListClasses = new cExtendedList(); + + foreach (cWell TmpWell in GlobalInfo.ListSelectedWell) + { + if (TmpWell.AssociatedPlate.DBConnection == null) + { + MessageBox.Show("No Database connection.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + TmpWell.AssociatedPlate.DBConnection = new cDBConnection(TmpWell.AssociatedPlate, TmpWell.SQLTableName); + int NumCells = TmpWell.AssociatedPlate.DBConnection.AddWellToDataTable(TmpWell, FinalDataTable, GlobalInfo); + + cListSingleBiologicalObjects LSO = TmpWell.AssociatedPlate.DBConnection.GetWellBiologicalPhenotypes(TmpWell); + TmpWell.AssociatedPlate.DBConnection.DB_CloseConnection(); + + int CurrentWellClass = TmpWell.GetClassIdx(); + + if (checkBoxWellClassAsPhenoClass.Checked) + { + for (int IdxCell = 0; IdxCell < NumCells; IdxCell++) + ListClasses.Add(CurrentWellClass); + } + else + { + for (int IdxCell = 0; IdxCell < NumCells; IdxCell++) + ListClasses.Add(LSO[IdxCell].GetAssociatedPhenotype().Idx); + } + } + + FormForSingleCellsDisplay WindowForTable = new FormForSingleCellsDisplay(FinalDataTable, GlobalInfo, ListClasses); + + if (FinalDataTable.Columns.Count == 0) + { + MessageBox.Show("Data corrupted !", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + for (int IdxCol = 0; IdxCol < FinalDataTable.Columns.Count; IdxCol++) + { + WindowForTable.comboBoxAxeX.Items.Add(FinalDataTable.Columns[IdxCol].ColumnName); + WindowForTable.comboBoxAxeY.Items.Add(FinalDataTable.Columns[IdxCol].ColumnName); + WindowForTable.comboBoxVolume.Items.Add(FinalDataTable.Columns[IdxCol].ColumnName); + } + + WindowForTable.comboBoxAxeX.Text = WindowForTable.comboBoxAxeX.GetItemText(WindowForTable.comboBoxAxeX.Items[0]); + WindowForTable.comboBoxAxeY.Text = WindowForTable.comboBoxAxeX.GetItemText(WindowForTable.comboBoxAxeX.Items[0]); + WindowForTable.comboBoxVolume.Text = WindowForTable.comboBoxAxeX.GetItemText(WindowForTable.comboBoxAxeX.Items[0]); + + WindowForTable.Text = GlobalInfo.ListSelectedWell.Count + " selected wells - " + FinalDataTable.Rows.Count + " points.";// Well.AssociatedPlate.Name + " [" + Well.GetPosX() + "x" + Well.GetPosY() + "]"; + WindowForTable.Show(); + + } + + private void comboBoxClassForWellSelection_DrawItem(object sender, DrawItemEventArgs e) + { + e.DrawBackground(); + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index].ColourForDisplay); + e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); + e.Graphics.DrawString(comboBoxNeutralClassForClassif.Items[e.Index].ToString(), comboBoxNeutralClassForClassif.Font, + System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); + e.DrawFocusRectangle(); + } + + private void buttonToSelectWellsFromClass_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + List ListClassSelected = ((PanelForClassSelection)PanelForMultipleClassesSelection.Controls[0]).GetListSelectedClass(); + + foreach (cWell TmpWell in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + { + if (ListClassSelected[TmpWell.GetClassIdx()]) + { + TmpWell.AddToSingleCellAnalysis(); + //listBoxSelectedWells.Items.Add(CompleteScreening.GetCurrentDisplayPlate().Name + " : " + TmpWell.GetPosX() + "x" + TmpWell.GetPosY()); + //GlobalInfo.ListSelectedWell.Add(TmpWell); + } + } + } + + + + private void cellBasedClassificationTreeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening.CellBasedClassification.J48Model == null) return; + CompleteScreening.CellBasedClassification.DisplayTree(GlobalInfo).Show(); + } + + //private void button_Trees_Click(object sender, EventArgs e) + //{ + // if (CompleteScreening == null) return; + + // FormForClassificationTree WindowForTree = new FormForClassificationTree(); + + // WindowForTree.Text = CompleteScreening.GetCurrentDisplayPlate().Name; + // string StringForTree = CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().StringForTree; + // if ((StringForTree == null) || (StringForTree.Length == 0)) + // { + // MessageBox.Show("No tree avaliable for the selected plate !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + // } + // WindowForTree.gViewerForTreeClassif.Graph = ComputeAndDisplayGraph(StringForTree.Remove(StringForTree.Length - 3, 3)); + + // WindowForTree.richTextBoxConsoleForClassification.Clear(); + // WindowForTree.richTextBoxConsoleForClassification.AppendText(CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().StringForQuality); + // WindowForTree.richTextBoxConsoleForClassification.AppendText(CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().ConfusionMatrix); + + // WindowForTree.Show(); + //} + + private void comboBoxClass_DrawItem_1(object sender, DrawItemEventArgs e) + { + e.DrawBackground(); + + if (e.Index > 0) + { + SolidBrush BrushForColor = new SolidBrush(GlobalInfo.ListWellClasses[e.Index - 1].ColourForDisplay); + e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); + } + e.Graphics.DrawString(comboBoxClass.Items[e.Index].ToString(), comboBoxClass.Font, + System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); + e.DrawFocusRectangle(); + } + + private void classesDistributionToolStripMenuItem_Click(object sender, EventArgs e) + { + FormForPie WindowForClassesDistribution = new FormForPie(); + WindowForClassesDistribution.Text = "Classes Distributions"; + + int[] ListClasses = CompleteScreening.GetClassPopulation(); + + Series CurrentSeries = WindowForClassesDistribution.chartForPie.Series[0]; + + int NumberOfWells = CompleteScreening.GetNumberOfActiveWells(); + int IdxPt = 0; + // CurrentSeries.CustomProperties = "PieLabelStyle=Outside"; + for (int Idx = 0; Idx < ListClasses.Length; Idx++) + { + + if (ListClasses[Idx] == 0) + { + + continue; + } + CurrentSeries.Points.Add(ListClasses[Idx]); + CurrentSeries.Points[IdxPt].Color = GlobalInfo.ListWellClasses[Idx].ColourForDisplay; + CurrentSeries.Points[IdxPt].Label = String.Format("{0:0.###}", ((100.0 * ListClasses[Idx]) / NumberOfWells)) + " %"; + + CurrentSeries.Points[IdxPt].LegendText = "Class " + Idx; + CurrentSeries.Points[IdxPt].ToolTip = ListClasses[Idx] + " / " + NumberOfWells; + IdxPt++; + } + + WindowForClassesDistribution.Show(); + } + + private void hierarchicalTreeToolStripMenuItem_Click(object sender, EventArgs e) + { + FormForHierarchical WindowHierarchical = new FormForHierarchical(this.GlobalInfo); + WindowHierarchical.richTextBoxWarning.AppendText("Warning:\nHierarchical tree visualization is not adpated for large number of experiments !\nIt can rapidly generate out-of-memory exception!"); + + System.Windows.Forms.DialogResult Res = WindowHierarchical.ShowDialog();// MessageBox.Show("Hierarchical tree is not adpated for large number of experiments !\n It can rapidly generate out-of-memory exception!\n Proceed anyway ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (Res != System.Windows.Forms.DialogResult.OK) return; + cDendoGram DendoGram = new cDendoGram(GlobalInfo, WindowHierarchical.radioButtonFullScreen.Checked, 1); + //cDendoGram DendoGram = new cDendoGram(GlobalInfo, + // CompleteScreening.ListPlatesActive[CompleteScreening.CurrentDisplayPlateIdx].CreateInstancesWithoutClass(), + // 1); + return; + } + + private void extractPhenotypesOfInterestToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + + FormClassification WindowClassification = new FormClassification(CompleteScreening); + WindowClassification.label1.Text = "Class"; + WindowClassification.Text = "Phenotypes of Interest"; + WindowClassification.buttonClassification.Text = "Display"; + + if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + int SelectedClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; + + List ListDescName = new List(); + ListDescName.Add("Idx"); + ListDescName.Add("Plate"); + ListDescName.Add("Pos X"); + ListDescName.Add("Pos Y"); + ListDescName.AddRange(CompleteScreening.ListDescriptors.GetListNameActives()); + + List ListValues = new List(); + int Idx = 0; + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell TmpWell in TmpPlate.ListActiveWells) + { + if (TmpWell.GetClassIdx() == SelectedClass) + { + List LValues = new List(); + LValues.Add(Idx.ToString()); + LValues.Add(TmpPlate.Name); + LValues.Add(TmpWell.GetPosX().ToString()); + LValues.Add(TmpWell.GetPosY().ToString()); + + for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) + { + if (CompleteScreening.ListDescriptors[IdxDesc].IsActive()) + { + double Value = TmpWell.GetAverageValuesList(false)[IdxDesc]; + LValues.Add(Value.ToString()); + + } + + } + + ListValues.Add(LValues.ToArray()); + + Idx++; + } + } + + } + cDisplayTable WindowDisplayTable = new cDisplayTable("Phenotypes of Interest. Class " + SelectedClass, ListDescName.ToArray(), ListValues, GlobalInfo, false); + WindowDisplayTable.Show(); + + + + } + + private void plateViewToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + List ListPlates = new List(); + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + ListPlates.Add(new FormToDisplayPlate(CurrentPlate, CompleteScreening)); + } + + cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(), 6, GlobalInfo); + + WindowToDisplayArray.Show(); + } + + private void descriptorViewToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + CompleteScreening.GetCurrentDisplayPlate().DisplayDescriptorsWindow(); + } + + private void ThreeDVisualizationToolStripMenuItem_Click(object sender, EventArgs e) + { + GlobalInfo._Is3DVisualization = ThreeDVisualizationToolStripMenuItem.Checked; + + if (!ThreeDVisualizationToolStripMenuItem.Checked) + CompleteScreening.Close3DView(); + else + CompleteScreening.GetCurrentDisplayPlate().Display3DDistributionOnly(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx); + // CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + } + + private void generateHitsDistributionMapToolStripMenuItem_Click(object sender, EventArgs e) + { + + if (CompleteScreening == null) return; + List ListPlates = new List(); + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + ListPlates.Add(new FormToDisplayPlate(CurrentPlate, CompleteScreening)); + } + + cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(), 6, GlobalInfo); + WindowToDisplayArray.checkBoxDisplayClasses.Checked = true; + WindowToDisplayArray.Text = "Generate Hits Distribution Maps"; + + WindowToDisplayArray.Show(); + + + System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (ResWin == System.Windows.Forms.DialogResult.No) + { + WindowToDisplayArray.Close(); + return; + } + + WindowToDisplayArray.Close(); + if (CompleteScreening != null) CompleteScreening.Close3DView(); + + // CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); + cScreening MergedScreening = new cScreening("Class Screen", GlobalInfo); + MergedScreening.PanelForPlate = this.panelForPlate; + + MergedScreening.Rows = CompleteScreening.Rows; + MergedScreening.Columns = CompleteScreening.Columns; + MergedScreening.ListPlatesAvailable = new cExtendPlateList(); + + // create the descriptor + MergedScreening.ListDescriptors.Clean(); + + List ListDescType = new List(); + List Values = new List(); + + for (int i = 0; i < GlobalInfo.GetNumberofDefinedWellClass(); i++) + { + cDescriptorsType DescClass = new cDescriptorsType("Class_" + i, true, 1, GlobalInfo); + ListDescType.Add(DescClass); + MergedScreening.ListDescriptors.AddNew(DescClass); + + int[][] TMpVal = new int[MergedScreening.Columns][]; + for (int ii = 0; ii < MergedScreening.Columns; ii++) + TMpVal[ii] = new int[MergedScreening.Rows]; + + Values.Add(TMpVal); + } + + MergedScreening.ListDescriptors.CurrentSelectedDescriptorIdx = 0; + + foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell TmpWell in CurrentPlate.ListActiveWells) + { + int Class = TmpWell.GetClassIdx(); + if (Class >= 0) + Values[Class][TmpWell.GetPosX() - 1][TmpWell.GetPosY() - 1]++; + } + } + + cPlate NewPlate = new cPlate("Cpds", CompleteScreening.Name, MergedScreening); + + for (int X = 0; X < CompleteScreening.Columns; X++) + for (int Y = 0; Y < CompleteScreening.Rows; Y++) + { + List LDesc = new List(); + for (int i = 0; i < GlobalInfo.GetNumberofDefinedWellClass(); i++) + { + cDescriptor Desc = new cDescriptor(Values[i][X][Y], ListDescType[i], CompleteScreening); + LDesc.Add(Desc); + + } + cWell NewWell = new cWell(LDesc, X + 1, Y + 1, MergedScreening, NewPlate); + NewWell.Name = "Well [" + (X + 1) + ":" + (Y + 1) + "]"; + NewPlate.AddWell(NewWell); + + } + + // check if the plate exist already + MergedScreening.AddPlate(NewPlate); + MergedScreening.ListPlatesActive = new cExtendPlateList(); + + MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Clear(); + + for (int i = 0; i < MergedScreening.ListPlatesAvailable.Count; i++) + { + MergedScreening.ListPlatesActive.Add(MergedScreening.ListPlatesAvailable[i]); + MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Add(NewPlate.Name); + } + + CompleteScreening.ListDescriptors = MergedScreening.ListDescriptors; + CompleteScreening.ListPlatesAvailable = MergedScreening.ListPlatesAvailable; + CompleteScreening.ListPlatesActive = MergedScreening.ListPlatesActive; + + CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) + CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + + CompleteScreening.CurrentDisplayPlateIdx = 0; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); + + ListPlates = new List(); + for (int DescIdx = 0; DescIdx < CompleteScreening.ListDescriptors.Count; DescIdx++) + { + if (CompleteScreening.ListDescriptors[DescIdx].IsActive()) + ListPlates.Add(new FormToDisplayDescriptorPlate(CompleteScreening.GetCurrentDisplayPlate(), CompleteScreening, DescIdx)); + } + + cWindowToDisplayEntireDescriptors WindowToDisplayDesc = new cWindowToDisplayEntireDescriptors(ListPlates, CompleteScreening.GetCurrentDisplayPlate().Name, GlobalInfo.GetNumberofDefinedWellClass()); + WindowToDisplayDesc.checkBoxGlobalNormalization.Checked = true; + + WindowToDisplayDesc.Show(); + } + + private void createAveragePlateToolStripMenuItem_Click(object sender, EventArgs e) + { + cPlate NewPlate = new cPlate("Cpds", "Average Plate", CompleteScreening); + cWell TmpWell; + + for (int X = 0; X < CompleteScreening.Columns; X++) + for (int Y = 0; Y < CompleteScreening.Rows; Y++) + { + List LDesc = new List(); + + for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + { + double Value = 0; + int NumWells = 0; + + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + TmpWell = TmpPlate.GetWell(X, Y, false); + if (TmpWell != null) + { + Value += TmpWell.ListDescriptors[i].GetValue(); + NumWells++; + // TmpPlate.GetWell(X, Y, false). + } + } + if (NumWells != 0) + { + cDescriptor Desc = new cDescriptor(Value / (double)NumWells, CompleteScreening.ListDescriptors[i], CompleteScreening); + LDesc.Add(Desc); + } + } + cWell NewWell = new cWell(LDesc, X + 1, Y + 1, CompleteScreening, NewPlate); + NewWell.Name = "Average Well [" + (X + 1) + ":" + (Y + 1) + "]"; + NewPlate.AddWell(NewWell); + + } + + CompleteScreening.AddPlate(NewPlate); + CompleteScreening.ListPlatesActive.Add(NewPlate); + toolStripcomboBoxPlateList.Items.Add(NewPlate.Name); + CompleteScreening.ListPlatesActive[CompleteScreening.ListPlatesActive.Count - 1].UpDataMinMax(); + CompleteScreening.CurrentDisplayPlateIdx = 0; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); + } + + private void generateDBFromCSVToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + CurrOpenFileDialog.Filter = "csv files (*.csv)|*.csv";//|db files (*.db)|*.db|nc files (*.nc)|*.nc + CurrOpenFileDialog.Multiselect = false; + + DialogResult Res = CurrOpenFileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + CSVtoDB(CurrOpenFileDialog.FileNames[0]); + + } + + private void CSVtoDB(string PathName) + { + FormForImportExcel CSVWindow = CellByCellFromCSV(PathName); + + if (CSVWindow == null) return; + if (CSVWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + if (CompleteScreening != null) CompleteScreening.Close3DView(); + + FolderBrowserDialog WorkingFolderDialog = new FolderBrowserDialog(); + WorkingFolderDialog.ShowNewFolderButton = true; + WorkingFolderDialog.Description = "Select the working directory"; + if (WorkingFolderDialog.ShowDialog() != DialogResult.OK) return; + + //if (IsFileUsed(CurrOpenFileDialog.FileNames[0])) + //{ + // MessageBox.Show("File currently used by another application.\n", "Loading error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + //} + + //Microsoft.Research.Science.Data.DataSet Datacsv = Microsoft.Research.Science.Data.CSV.CsvDataSet.Open(CurrOpenFileDialog.FileNames[0]); + + //int NumDesc = Datacsv.Variables.Count; + + //for (int IdxDesc = 0; IdxDesc < NumDesc; IdxDesc++) + //{ + // var DescInfo = Datacsv.Variables[IdxDesc]; + // string NameDesc = DescInfo.Name; + + // var TypeData = DescInfo.TypeOfData; + // string DataName = TypeData.Name; + //} + + + int NumPlateName = 0; + int NumRow = 0; + int NumCol = 0; + int NumWellPos = 0; + int NumPhenotypeClass = 0; + // int NumLocusID = 0; + // int NumConcentration = 0; + // int NumName = 0; + // int NumInfo = 0; + // int NumClass = 0; + + int numDescritpor = 0; + + for (int i = 0; i < CSVWindow.dataGridViewForImport.Rows.Count; i++) + { + string CurrentVal = CSVWindow.dataGridViewForImport.Rows[i].Cells[2].Value.ToString(); + if ((CurrentVal == "Plate name") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + NumPlateName++; + if ((CurrentVal == "Row") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + NumRow++; + if ((CurrentVal == "Column") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + NumCol++; + if ((CurrentVal == "Well position") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + NumWellPos++; + if ((CurrentVal == "Descriptor") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + numDescritpor++; + if ((CurrentVal == "Phenotype Class") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) + NumPhenotypeClass++; + } + + if (NumPlateName != 1) + { + MessageBox.Show("One and only one \"Plate Name\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if ((NumRow != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeDouble.Checked == true)) + { + MessageBox.Show("One and only one \"Row\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if ((NumCol != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeDouble.Checked == true)) + { + MessageBox.Show("One and only one \"Column\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if ((NumWellPos != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeSingle.Checked == true)) + { + MessageBox.Show("One and only one \"Well position\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if ((numDescritpor < 1) && (CSVWindow.IsImportCSV)) + { + MessageBox.Show("You need to select at least one \"Descriptor\" !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + int Mode = 2; + if (GlobalInfo.OptionsWindow.radioButtonWellPosModeSingle.Checked) Mode = 1; + CsvFileReader CSVsr = new CsvFileReader(PathName); + + CsvRow OriginalNames = new CsvRow(); + if (!CSVsr.ReadRow(OriginalNames)) + { + CSVsr.Close(); + return; + } + + int ColPlateName = GetColIdxFor("Plate name", CSVWindow); + int ColCol = GetColIdxFor("Column", CSVWindow); + int ColRow = GetColIdxFor("Row", CSVWindow); + int ColWellPos = GetColIdxFor("Well position", CSVWindow); + int ColPhenotypeClass = GetColIdxFor("Phenotype Class", CSVWindow); + int[] ColsForDescriptors = GetColsIdxFor("Descriptor", CSVWindow); + + int WellLoaded = 0; + int FailToLoad = 0; + + + // CompleteScreening.Columns = (int)CSVWindow.numericUpDownColumns.Value; + // CompleteScreening.Rows = (int)CSVWindow.numericUpDownRows.Value; + // CompleteScreening.ListDescriptors.Clean(); + + FormForProgress ProgressWindow = new FormForProgress(); + ProgressWindow.Show(); + CsvRow CurrentDesc = new CsvRow(); + if (CSVsr.ReadRow(CurrentDesc) == false) return; + do + { + string OriginalPlatePlateName = CurrentDesc[ColPlateName]; + string CurrentPlateName = CurrentDesc[ColPlateName]; + string ConvertedName = ""; + + foreach (var c in System.IO.Path.GetInvalidFileNameChars()) + { + ConvertedName = OriginalPlatePlateName.Replace(c, '-'); + } + + + + List ListNameSignature = new List(); + + for (int idxDesc = 0/*Mode + 1*/; idxDesc < ColsForDescriptors.Length/* + Mode + 1*/; idxDesc++) + { + ListNameSignature.Add(OriginalNames[ColsForDescriptors[idxDesc]]); + } + ListNameSignature.Add("Phenotype_Class"); + + cSQLiteDatabase SQDB = new cSQLiteDatabase(WorkingFolderDialog.SelectedPath + "\\" + ConvertedName, ListNameSignature, true); + do + { + string OriginalWellPos; + int[] Pos = new int[2]; + + if (Mode == 1) + { + Pos = ConvertPosition(CurrentDesc[ColWellPos]); + if (Pos == null) + { + if (MessageBox.Show("Error in converting the current well position.\nGo to Edit->Options->Import-Export->Well Position Mode to fix this.\nDo you want continue ?", "Loading error !", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.No) + { + CSVsr.Close(); + return; + } + //else + // goto NEXTLOOP; + } + OriginalWellPos = CurrentDesc[ColWellPos]; + } + else + { + if (int.TryParse(CurrentDesc[ColCol], out Pos[0]) == false) + goto NEXTLOOP; + if (int.TryParse(CurrentDesc[ColRow], out Pos[1]) == false) + goto NEXTLOOP; + + OriginalWellPos = ConvertPosition(int.Parse(CurrentDesc[ColCol]), int.Parse(CurrentDesc[ColRow]));// "("+CurrentDesc[ColCol]+","+CurrentDesc[ColRow]+")"; + } + + string CurrentWellPos = OriginalWellPos; + + cWellForDatabase WellForDB = new cWellForDatabase(OriginalPlatePlateName, Pos[0], Pos[1]); + List> ListData = new List>(); + // for (int idxDesc = 0; idxDesc < ColsForDescriptors.Length; idxDesc++) + // ListData[idxDesc] = new List(); + + ProgressWindow.label.Text = CurrentWellPos; + ProgressWindow.label.Refresh(); + + do + { + // CurrentWellPos = CurrentDesc[ColWellPos]; + List Signature = new List(); + + for (int idxDesc = 0; idxDesc < ColsForDescriptors.Length; idxDesc++) + { + double Value; + if ((double.TryParse(CurrentDesc[ColsForDescriptors[idxDesc]], out Value))/* && (!double.IsNaN(Value))*/) + { + if (double.IsNaN(Value) == false) + { + //cDescriptor CurrentDescriptor = new cDescriptor(Value, CompleteScreening.ListDescriptors[idxDesc/* + ShiftIdx*/], CompleteScreening); + Signature.Add(Value); + } + else + { } + } + /*else + { + FailToLoad++; + goto NEXTLOOP; + }*/ + } + + + // if the class of the phenotype is defined in the file then use it + // if not, put it at 0 + double ValueClass; + if ((ColPhenotypeClass != -1) && (double.TryParse(CurrentDesc[ColPhenotypeClass], out ValueClass) == true)) + { + double IntValue = (int)(ValueClass) % GlobalInfo.ListCellularPhenotypes.Count; + Signature.Add(IntValue); + } + else + { + Signature.Add(0); + } + + + ListData.Add(Signature); + // WellForDB.AddSignature(Signature); + + if (CSVsr.ReadRow(CurrentDesc) == false) + { + WellForDB.AddListSignatures(ListData); + SQDB.AddNewWell(WellForDB); + SQDB.CloseConnection(); + goto NEXTLOOP; + } + CurrentPlateName = CurrentDesc[ColPlateName]; + + if (Mode == 1) + { + CurrentWellPos = CurrentDesc[ColWellPos]; + } + else + { + int ResCol; + int ResRow; + if ((!int.TryParse(CurrentDesc[ColCol], out ResCol)) || (!int.TryParse(CurrentDesc[ColRow], out ResRow))) goto NEXTLOOP; + + CurrentWellPos = ConvertPosition(ResCol, ResRow); + } + + + } while (CurrentWellPos == OriginalWellPos); + + WellForDB.AddListSignatures(ListData); + SQDB.AddNewWell(WellForDB); + //NEXTSIGNATURE: ; - cWell CurrentWellFinal = CompleteScreening.GetCurrentDisplayPlate().GetWell(CompleteScreening.Columns - 1, j, false); - if (CurrentWellFinal == null) - sb.Append("\t"); - else - sb.Append(String.Format("{0}\t", CurrentWellFinal.ListDescriptors[comboBoxDescriptorToDisplay.SelectedIndex].GetValue())); + } while (OriginalPlatePlateName == CurrentPlateName); + SQDB.CloseConnection(); + } while (true); - // sb.Append(String.Format("{0}", CompleteScreening.GetPlate(0).GetWell(CompleteScreening.Columns-1, j).ListDescriptors[(int)numericUpDownDescriptorIndex.Value].AverageValue)); - sb.AppendLine(); - } - } - Clipboard.SetText(sb.ToString()); - } + NEXTLOOP: ; + ProgressWindow.Close(); + FormForPlateDimensions PlateDim = new FormForPlateDimensions(); + PlateDim.Text = "Load generated screening"; + PlateDim.checkBoxAddCellNumber.Visible = true; + PlateDim.checkBoxIsOmitFirstColumn.Visible = true; + PlateDim.labelHisto.Visible = true; + PlateDim.numericUpDownHistoSize.Visible = true; + if (PlateDim.ShowDialog() != System.Windows.Forms.DialogResult.OK) + return; + LoadCellByCellDB(PlateDim, WorkingFolderDialog.SelectedPath); + } - private void copyClassesToolStripMenuItem_Click(object sender, EventArgs e) + private void loadDBToolStripMenuItem_Click(object sender, EventArgs e) { - if (CompleteScreening == null) return; - StringBuilder sb = new StringBuilder(); + if (CompleteScreening != null) CompleteScreening.Close3DView(); - sb.Append(String.Format("Class\t")); - //sb.Append("\t"); - for (int i = 0; i < CompleteScreening.Columns - 1; i++) - { - int IdxCol = i + 1; - sb.Append(String.Format("{0}\t", IdxCol)); - } - sb.Append(String.Format("{0}", CompleteScreening.Columns - 1)); - sb.AppendLine(); + FolderBrowserDialog OpenFolderDialog = new FolderBrowserDialog(); - for (int j = 0; j < CompleteScreening.Rows; j++) - { - byte[] strArray = new byte[1]; - strArray[0] = (byte)(j + 65); + if (OpenFolderDialog.ShowDialog() != DialogResult.OK) return; + string Path = OpenFolderDialog.SelectedPath; - string Chara = Encoding.UTF7.GetString(strArray); - sb.Append(String.Format("{0}\t", Chara)); - for (int i = 0; i < CompleteScreening.Columns - 1; i++) - { - cWell CurrentWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(i, j, false); - if (CurrentWell == null) - sb.Append("\t"); - else - sb.Append(String.Format("{0}\t", CurrentWell.GetClass())); - } + FormForPlateDimensions PlateDim = new FormForPlateDimensions(); + PlateDim.checkBoxAddCellNumber.Visible = true; + PlateDim.checkBoxIsOmitFirstColumn.Visible = true; + PlateDim.labelHisto.Visible = true; + PlateDim.numericUpDownHistoSize.Visible = true; + if (PlateDim.ShowDialog() != System.Windows.Forms.DialogResult.OK) + return; + LoadCellByCellDB(PlateDim, Path); + } - cWell CurrentWellFinal = CompleteScreening.GetCurrentDisplayPlate().GetWell(CompleteScreening.Columns - 1, j, false); - if (CurrentWellFinal == null) - sb.Append("\t"); - else - sb.Append(String.Format("{0}\t", CurrentWellFinal.GetClass())); + private void classViewToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + checkBoxDisplayClasses.Checked = classViewToolStripMenuItem.Checked; - // sb.Append(String.Format("{0}", CompleteScreening.GetPlate(0).GetWell(CompleteScreening.Columns-1, j).ListDescriptors[(int)numericUpDownDescriptorIndex.Value].AverageValue)); - sb.AppendLine(); - } - Clipboard.SetText(sb.ToString()); + // CompleteScreening.GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; + //CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); } - #endregion - #region Normal Probability Plot - /// - /// Draw normal probability plot a complete screening - /// - /// - /// - private void normalProbabilityPlotToolStripMenuItem1_Click(object sender, EventArgs e) - { - ComputeAndDisplayMormalProbabilityPlot(true); - } - /// - /// Draw normal probability plot a single plate - /// - /// - /// - private void normalProbabilityPlotToolStripMenuItem_Click(object sender, EventArgs e) + private void pieViewToolStripMenuItem1_Click(object sender, EventArgs e) { - ComputeAndDisplayMormalProbabilityPlot(false); - } + if (CompleteScreening == null) return; + GlobalInfo.ViewMode = eViewMode.PIE; + averageViewToolStripMenuItem.Checked = false; + pieViewToolStripMenuItem1.Checked = true; + histogramViewToolStripMenuItem.Checked = false; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } - private void ComputeAndDisplayMormalProbabilityPlot(bool IsFullScreen) + private void HCSAnalyzer_KeyPress(object sender, KeyPressEventArgs e) { if (CompleteScreening == null) return; - - int CurrentDescSel = comboBoxDescriptorToDisplay.SelectedIndex; - - //if(CurrentDes - if (CompleteScreening.SelectedClass < 0) return; - - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; - List PlatesToProcess = new List(); - if (IsFullScreen) - { - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(CompleteScreening.ListPlatesActive[PlateIdx].Name); - PlatesToProcess.Add(CurrentPlateToProcess); - } - } - else - { - PlatesToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); - } - - List CurrentDesc = new List(); - - // loop on all the plate - for (int PlateIdx = 0; PlateIdx < PlatesToProcess.Count; PlateIdx++) + if (e.KeyChar == 'a') { - cPlate CurrentPlateToProcess = PlatesToProcess[PlateIdx]; - - for (int IdxValue = 0; IdxValue < CompleteScreening.Columns; IdxValue++) - for (int IdxValue0 = 0; IdxValue0 < CompleteScreening.Rows; IdxValue0++) - { - cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(IdxValue, IdxValue0, true); - if (TmpWell != null) - { - if (TmpWell.GetClass() == CompleteScreening.SelectedClass) - CurrentDesc.Add(TmpWell.ListDescriptors[CurrentDescSel].GetValue()); - } - } + CompleteScreening.GlobalInfo.ViewMode = eViewMode.AVERAGE; + pieViewToolStripMenuItem1.Checked = false; + averageViewToolStripMenuItem.Checked = true; + histogramViewToolStripMenuItem.Checked = false; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - - if (CurrentDesc.Count < 3) + if (e.KeyChar == 'h') { - MessageBox.Show("Not enough data of class " + CompleteScreening.SelectedClass, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + CompleteScreening.GlobalInfo.ViewMode = eViewMode.DISTRIBUTION; + pieViewToolStripMenuItem1.Checked = false; + averageViewToolStripMenuItem.Checked = false; + histogramViewToolStripMenuItem.Checked = true; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - - CurrentDesc.Sort(); - double[] CenterNormDesc = new double[CurrentDesc.Count]; - CenterNormDesc = MeanCenteringStdStandarization(CurrentDesc.ToArray()); - - int N = CurrentDesc.Count; - double[] CumulativeProba = new double[CurrentDesc.Count]; - for (int i = 1; i < N - 1; i++) - CumulativeProba[i] = (i - 0.3175) / (N + 0.365); - - CumulativeProba[N - 1] = Math.Pow(0.5, 1.0 / N); - CumulativeProba[0] = 1 - CumulativeProba[N - 1]; - - double[] PercentPointFunction = new double[CurrentDesc.Count]; - - for (int i = 0; i < N; i++) - PercentPointFunction[i] = alglib.normaldistr.invnormaldistribution(CumulativeProba[i]); - - SimpleForm NewWindow = new SimpleForm(); - NewWindow.Width = 600; - NewWindow.Height = 600; - - NewWindow.Name = CompleteScreening.ListDescriptors[CurrentDescSel].GetName() + " normality plot : " + CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells() + " points"; - Series CurrentSeries = new Series(); - CurrentSeries.ShadowOffset = 1; - for (int Pt = 0; Pt < CurrentDesc.Count; Pt++) + if (e.KeyChar == 'c') { - CurrentSeries.Points.AddXY(PercentPointFunction[Pt], CenterNormDesc[Pt]); - CurrentSeries.Points[Pt].Color = CompleteScreening.GlobalInfo.GetColor(CompleteScreening.SelectedClass); - CurrentSeries.Points[Pt].MarkerStyle = MarkerStyle.Circle; - CurrentSeries.Points[Pt].MarkerSize = 6; + checkBoxDisplayClasses.Checked = true; } - - ChartArea CurrentChartArea = new ChartArea(); - CurrentChartArea.BorderColor = Color.Black; - NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - - NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; - CurrentChartArea.BackColor = Color.FromArgb(164, 164, 164); - CurrentChartArea.Axes[0].MajorGrid.Enabled = true; - CurrentChartArea.Axes[1].MajorGrid.Enabled = true; - CurrentChartArea.AxisY.Minimum = CenterNormDesc[0]; - CurrentChartArea.AxisY.Maximum = CenterNormDesc[CurrentDesc.Count - 1]; - CurrentChartArea.AxisX.Minimum = -3; - CurrentChartArea.AxisX.Maximum = 3; - CurrentChartArea.AxisY.LabelStyle.Format = "N1"; - CurrentChartArea.AxisX.LabelStyle.Format = "N1"; - - CurrentSeries.ChartType = SeriesChartType.Point; - NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); - - double Anderson_DarlingValue = Anderson_Darling(CurrentDesc.ToArray()); - GlobalInfo.ConsoleWriteLine("Anderson-Darling Test: " + Anderson_DarlingValue); - - Title AndersonLegend = new Title(); - if (CurrentDesc.Count >= 5) + if (e.KeyChar == 'p') { - double Jarque_BeraValue; - alglib.jarqueberatest(CurrentDesc.ToArray(), CurrentDesc.Count, out Jarque_BeraValue); - GlobalInfo.ConsoleWriteLine("Jarque-Bera Test: " + Jarque_BeraValue); - // AndersonLegend.Text = "Jarque-Bera: " + String.Format("{0:0.####}", Jarque_BeraValue); + GlobalInfo.ViewMode = eViewMode.PIE; + pieViewToolStripMenuItem1.Checked = true; + averageViewToolStripMenuItem.Checked = false; + histogramViewToolStripMenuItem.Checked = false; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - AndersonLegend.Text += "Anderson-Darling: " + String.Format("{0:0.##}", Anderson_DarlingValue); - AndersonLegend.Alignment = ContentAlignment.MiddleCenter; - AndersonLegend.Docking = Docking.Bottom; - AndersonLegend.TextOrientation = TextOrientation.Horizontal; + } - NewWindow.chartForSimpleForm.Titles.Add(AndersonLegend); + private void averageViewToolStripMenuItem_Click(object sender, EventArgs e) + { + CompleteScreening.GlobalInfo.ViewMode = eViewMode.AVERAGE; + pieViewToolStripMenuItem1.Checked = false; + averageViewToolStripMenuItem.Checked = true; + histogramViewToolStripMenuItem.Checked = false; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } - Title MainLegend = new Title(); - MainLegend.Text = CompleteScreening.ListDescriptors[CurrentDescSel].GetName(); - MainLegend.Docking = Docking.Top; - MainLegend.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); - NewWindow.chartForSimpleForm.Titles.Add(MainLegend); + private void histogramViewToolStripMenuItem_Click(object sender, EventArgs e) + { + CompleteScreening.GlobalInfo.ViewMode = eViewMode.DISTRIBUTION; + pieViewToolStripMenuItem1.Checked = false; + averageViewToolStripMenuItem.Checked = false; + histogramViewToolStripMenuItem.Checked = true; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } - NewWindow.chartForSimpleForm.Series.Add("TrendLine"); - NewWindow.chartForSimpleForm.Series["TrendLine"].ChartType = SeriesChartType.Line; - NewWindow.chartForSimpleForm.Series["TrendLine"].BorderWidth = 1; - NewWindow.chartForSimpleForm.Series["TrendLine"].Color = Color.Red; - // Line of best fit is linear - string typeRegression = "Linear";//"Exponential";// - // The number of days for Forecasting - string forecasting = "1"; - // Show Error as a range chart. - string error = "false"; - // Show Forecasting Error as a range chart. - string forecastingError = "false"; - // Formula parameters - string parameters = typeRegression + ',' + forecasting + ',' + error + ',' + forecastingError; - NewWindow.chartForSimpleForm.Series[0].Sort(PointSortOrder.Ascending, "X"); - // Create Forecasting Series. - NewWindow.chartForSimpleForm.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, NewWindow.chartForSimpleForm.Series[0], NewWindow.chartForSimpleForm.Series["TrendLine"]); + private void currentPlate3DToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; - // NewWindow.Text = "Normal Probability Plot / " +; - NewWindow.Show(); + GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = true; - if (IsFullScreen) - { - NewWindow.Text = CurrentDesc.Count + " points"; - } - else + FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(false, CompleteScreening); + for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) { - NewWindow.Text = CompleteScreening.GetCurrentDisplayPlate().Name + " : " + CurrentDesc.Count + " points"; + FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); + FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); } - NewWindow.chartForSimpleForm.Update(); - NewWindow.chartForSimpleForm.Show(); - NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + FormToDisplayXYZ.Show(); + FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; + return; } - #endregion - #region XY scatter points - private void xYScatterPointsToolStripMenuItem_Click(object sender, EventArgs e) + private void loadSingleImageToolStripMenuItem_Click(object sender, EventArgs e) { - if (CompleteScreening == null) return; + OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + CurrOpenFileDialog.Filter = "Tif files (*.tif)|*.tif"; + DialogResult Res = CurrOpenFileDialog.ShowDialog(); + if (Res != DialogResult.OK) return; + cImage NewIm = new cImage(CurrOpenFileDialog.FileName); - SimpleFormForXY FormToDisplayXY = new SimpleFormForXY(false); - FormToDisplayXY.CompleteScreening = CompleteScreening; - for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) - { - FormToDisplayXY.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXY.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - } - FormToDisplayXY.comboBoxDescriptorX.SelectedIndex = 0; - FormToDisplayXY.comboBoxDescriptorY.SelectedIndex = 0; + //cImage TestImage = new cImage(512, 512, 1, 1); + //TestImage.Name = "First Test"; + //for (int Y = 0; Y < TestImage.Height; Y++) + // for (int X = 0; X < TestImage.Width; X++) + // { + // TestImage.Data[0].Data[X + Y * TestImage.Width] = X; + // } - FormToDisplayXY.DisplayXY(); - FormToDisplayXY.ShowDialog(); + cImageViewer NewView = new cImageViewer(); + // NewView.SetImage(NewIm); - return; - } + cImage FilteredImage = new cImage(NewIm.Width, NewIm.Height, NewIm.Depth, 1/* NewIm.NumChannels*/); - private void xYScatterPointToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; + // ImageAnalysisFiltering.cImageFilterMedian FilterMedian = new ImageAnalysisFiltering.cImageFilterMedian(NewIm, 0, FilteredImage, 0); + // FilterMedian.radius = 5; + // FilterMedian.Run(); - SimpleFormForXY FormToDisplayXY = new SimpleFormForXY(true); - FormToDisplayXY.CompleteScreening = CompleteScreening; + ImageAnalysisFiltering.cImageFilterGaussianBlur GaussianBlur = new ImageAnalysisFiltering.cImageFilterGaussianBlur(NewIm, 0, FilteredImage, 0, 3); + GaussianBlur.Run(); + NewView.SetImage(FilteredImage); - for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) - { - FormToDisplayXY.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXY.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - } - FormToDisplayXY.comboBoxDescriptorX.SelectedIndex = 0; - FormToDisplayXY.comboBoxDescriptorY.SelectedIndex = 0; + //cImageViewer NewView1 = new cImageViewer(); + //NewView1.SetImage(FilteredImage); + //NewView.AddNotation(new ObjectForNotations.cString("This is a test", new Point(100, 100), Color.Red, 20)); - if (FormToDisplayXY.DisplayXY()) FormToDisplayXY.ShowDialog(); + //for (int Idx = 0; Idx < 120; Idx += 10) + // NewView.AddNotation(new ObjectForNotations.cDisk(new Point(Idx * 10, Idx * 10), Color.FromArgb(Idx, Idx, 50), Idx)); - return; - } - #endregion + GlobalInfo.DisplayViewer(NewView); + + // NewView1.AddNotation(new ObjectForNotations.cString("Median", new Point(100, 100), Color.Red, 20)); + // GlobalInfo.DisplayViewer(NewView1); - #region Plugins Management - private void HCSAnalyzer_Shown(object sender, EventArgs e) - { - BuildPluginMenu(); } - private void BuildPluginMenu() + private void bioFormatsToolStripMenuItem_Click(object sender, EventArgs e) { - List paList = null; - try - { - paList = PluginDescriptor.GetList(Application.StartupPath + @"\Plugins"); - } - catch (DirectoryNotFoundException e) + //Emgu.CV.Matrix Signature1 = new Emgu.CV.Matrix(10, 2); + ////List PtList = new List(); + //List PtList = new List(); + ////Emgu.CV.Structure.MCvPoint2D64f + //for (int Idx = 0; Idx < 10; Idx++) + //{ + // PtList.Add(new PointF(Idx, Idx)); + + // //Signature1[Idx, 0] = Idx; + // //Signature1[Idx, 1] = Idx; + //} + + //Emgu.CV.Structure.Ellipse Ell = Emgu.CV.PointCollection.EllipseLeastSquareFitting(PtList.ToArray()); + + List BigList = new List(); + + cExtendedList FirstData = new cExtendedList(); + FirstData.Name = "First"; + cExtendedList ScdData = new cExtendedList(); + ScdData.Name = "Second"; + cExtendedList ThirdData = new cExtendedList(); + ThirdData.Name = "Third"; + + for (double Idx = 0; Idx < 6.28; Idx += 0.01) { - Directory.CreateDirectory("Plugins"); - paList = PluginDescriptor.GetList(Application.StartupPath + @"\Plugins"); - //MessageBox.Show("Error: " + e.Message, "Plugin's directory not Found" + "\n No Plugin will be loaded", MessageBoxButtons.OK, MessageBoxIcon.Warning); + FirstData.Add(Math.Cos(4 * Idx)); + ScdData.Add(Math.Sin(3 * Idx)); + ThirdData.Add(Math.Sin(Idx) * Math.Sin(Idx) * Math.Cos(Idx)); } + BigList.Add(FirstData); + BigList.Add(ScdData); + BigList.Add(ThirdData); - ToolStripMenuItem currentMenu = null; - foreach (PluginDescriptor pluginDescriptor in paList) - { - currentMenu = pluginsToolStripMenuItem; + //cViewerScatter2D ScatterPtsViewer = new cViewerScatter2D(); + //ScatterPtsViewer.SetInputData(BigList); + //ScatterPtsViewer.Run(); + //ScatterPtsViewer.Display(); - string[] subMenu = pluginDescriptor.MenuPath.Split('|'); - if (pluginDescriptor.MenuPath.Length != 0) - { - foreach (string sm in subMenu) - { - string menuName = sm.Trim(); - //if submenu exist , get in - if (currentMenu.DropDownItems.ContainsKey(menuName)) - { - currentMenu = (ToolStripMenuItem)currentMenu.DropDownItems[menuName]; - } - else//if not, create it first. - { - ToolStripMenuItem tsmMenu = new ToolStripMenuItem(menuName); - currentMenu.DropDownItems.Add(tsmMenu); - tsmMenu.Name = menuName; - currentMenu = tsmMenu; - } - } - } + //FormToDisplayDataTable FDT = new FormToDisplayDataTable(BigList); + //FDT.Show(); + // createDataTable(BigList); - ToolStripMenuItem tsmiName = - new ToolStripMenuItem(pluginDescriptor.Name + @" - " + pluginDescriptor.Author); - currentMenu.DropDownItems.Add(tsmiName); - tsmiName.Tag = pluginDescriptor; - tsmiName.Name = pluginDescriptor.Name; - currentMenu = tsmiName; - currentMenu.Click += new EventHandler(toolMenuItem_Click); - } - } - private void toolMenuItem_Click(object sender, EventArgs e) - { - try - { - ToolStripMenuItem s = (ToolStripMenuItem)sender; + // loci.formats.@in.AVIReader MyReader = new loci.formats.@in.AVIReader(); + // MyReader.setId("E:\\Downloads\\prnfle435x.avi"); - PluginDescriptor p = (PluginDescriptor)s.Tag; - Plugin.CurrentScreen = CompleteScreening; - p.Instanciate(); - } - catch (PluginException ex) - { - MessageBox.Show(ex.Message, "Plugin information", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - #endregion + //Emgu.CV.Structure.MCvBox2D Box = Emgu.CV.CvInvoke.cvFitEllipse2(PtList.ToArray()); + + cViewerScatter3D Viewer3D = new cViewerScatter3D(GlobalInfo); + Viewer3D.Run(); + Viewer3D.Display(); - private void HCSAnalyzer_FormClosed(object sender, FormClosedEventArgs e) - { - if (GlobalInfo.CurrentScreen != null) - GlobalInfo.CurrentScreen.Close3DView(); - this.Dispose(); } + private void testSingleImageToolStripMenuItem_Click(object sender, EventArgs e) + { + //cImage FilteredImage = new cImage(NewIm.Width, NewIm.Height, NewIm.Depth, NewIm.NumChannels); - private void SwitchVizuMode(object sender, EventArgs e) - { - GlobalInfo.SwitchVisuMode(); - } + //ImageAnalysisFiltering.cImageFilterMedian FilterMedian = new ImageAnalysisFiltering.cImageFilterMedian(NewIm, 0, FilteredImage, 0); + //FilterMedian.radius = 5; + //FilterMedian.Run(); - #region DRC management - private void doseResponseDesignerToolStripMenuItem_Click(object sender, EventArgs e) - { - if (GlobalInfo.WindowForDRCDesign.IsDisposed) GlobalInfo.WindowForDRCDesign = new FormForDRCDesign(); - GlobalInfo.WindowForDRCDesign.Visible = true; - } + cImage TestImage = new cImage(256, 50, 1, 3); + TestImage.Name = "First Test"; + for (int IdxChannel = 0; IdxChannel < TestImage.NumChannels; IdxChannel++) + for (int Y = 0; Y < TestImage.Height; Y++) + for (int X = 0; X < TestImage.Width; X++) + { + TestImage.Data[IdxChannel].Data[X + Y * TestImage.Width] = X * Y / 10; + } - private void convertDRCToWellToolStripMenuItem1_Click(object sender, EventArgs e) - { + // cImage FilteredImage = new cImage(TestImage.Width, TestImage.Height, TestImage.Depth, TestImage.NumChannels); + // ImageAnalysisFiltering.cImageFilterMedian FilterMedian = new ImageAnalysisFiltering.cImageFilterMedian(TestImage, 0, FilteredImage, 0); + // FilterMedian.radius = 2; + // FilterMedian.Run(); - System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (ResWin == System.Windows.Forms.DialogResult.No) return; - //foreach (cDescriptorsType DescType in CompleteScreening.ListDescriptors) - //{ - // CompleteScreening.ListDescriptors.RemoveDescUnSafe(DescType, CompleteScreening); - //} + cImageViewer NewView = new cImageViewer(); + NewView.SetImage(TestImage); + //cImageViewer NewView1 = new cImageViewer(); + //NewView1.SetImage(FilteredImage); - if (CompleteScreening != null) CompleteScreening.Close3DView(); + // NewView.AddNotation(new ObjectForNotations.cString("This is a test", new Point(10, 10), Color.Red, 20)); - // CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); - cScreening MergedScreening = new cScreening("Merged Screen", GlobalInfo); - MergedScreening.PanelForPlate = this.panelForPlate; + //for (int Idx = 0; Idx < 120; Idx += 10) + // NewView.AddNotation(new ObjectForNotations.cDisk(new Point(Idx * 10, Idx * 10), Color.FromArgb(Idx, Idx, 50), Idx)); - MergedScreening.Rows = CompleteScreening.Rows; - MergedScreening.Columns = CompleteScreening.Columns; - MergedScreening.ListPlatesAvailable = new cExtendPlateList(); + GlobalInfo.DisplayViewer(NewView); - // create the descriptor - MergedScreening.ListDescriptors.Clean(); + // NewView1.AddNotation(new ObjectForNotations.cString("Median", new Point(100, 100), Color.Red, 20)); + // GlobalInfo.DisplayViewer(NewView1); + } - int Idesc = 0; + private void newOptionMenuToolStripMenuItem_Click(object sender, EventArgs e) + { + cListOptions ListOptions = new cListOptions(GlobalInfo); + FormForGlobalInfoOptions WindowForOptions = new FormForGlobalInfoOptions(ListOptions); + WindowForOptions.ShowDialog(); + } - List ListDescType = new List(); + private void singleCellsSimulatorToolStripMenuItem_Click(object sender, EventArgs e) + { + FormForSimuGenerator WindowForSimulation = new FormForSimuGenerator(GlobalInfo); + WindowForSimulation.Show(); + } - for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) - { - if (!CompleteScreening.ListDescriptors[i].IsActive()) continue; + private void hierarchicalTreeToolStripMenuItemFullScreen_Click(object sender, EventArgs e) + { + FormForHierarchical WindowHierarchical = new FormForHierarchical(this.GlobalInfo); + WindowHierarchical.richTextBoxWarning.AppendText("Warning:\nHierarchical tree visualization is not adpated for large number of experiments !\nIt can rapidly generate out-of-memory exception!"); - cDescriptorsType DescEC50 = new cDescriptorsType("EC50_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); - ListDescType.Add(DescEC50); - MergedScreening.ListDescriptors.AddNew(DescEC50); + System.Windows.Forms.DialogResult Res = WindowHierarchical.ShowDialog();// MessageBox.Show("Hierarchical tree is not adpated for large number of experiments !\n It can rapidly generate out-of-memory exception!\n Proceed anyway ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (Res != System.Windows.Forms.DialogResult.OK) return; + // cDendoGram DendoGram = new cDendoGram(GlobalInfo, WindowHierarchical.radioButtonFullScreen.Checked,1); + cDendoGram DendoGram = new cDendoGram(GlobalInfo, + true, + 1); + return; + } - cDescriptorsType DescTop = new cDescriptorsType("Top_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); - ListDescType.Add(DescTop); - MergedScreening.ListDescriptors.AddNew(DescTop); - cDescriptorsType DescBottom = new cDescriptorsType("Bottom_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); - ListDescType.Add(DescBottom); - MergedScreening.ListDescriptors.AddNew(DescBottom); + #region Clustering + private void buttonClustering_Click(object sender, EventArgs e) + { + List ListPlatesToProcess = new List(); - cDescriptorsType DescSlope = new cDescriptorsType("Slope_" + CompleteScreening.ListDescriptors[i].GetName(), true, 1, GlobalInfo); - ListDescType.Add(DescSlope); - MergedScreening.ListDescriptors.AddNew(DescSlope); + if (this.ProcessModeplateByPlateToolStripMenuItem.Checked) + { + foreach (cPlate item in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(item); - Idesc++; + PerformScreeningClustering(ListPlatesToProcess, true); } - - MergedScreening.ListDescriptors.CurrentSelectedDescriptor = 0; - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesAvailable) + else if (this.ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + foreach (cPlate item in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(item); + PerformScreeningClustering(ListPlatesToProcess, false); + } + else if (this.ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { + ListPlatesToProcess.Add(CompleteScreening.ListPlatesActive[CompleteScreening.CurrentDisplayPlateIdx]); + PerformScreeningClustering(ListPlatesToProcess, true); + } + } - cPlate NewPlate = new cPlate("Cpds", CurrentPlate.Name + " Merged", MergedScreening); - // check if the plate exist already - MergedScreening.AddPlate(NewPlate); + public void PerformScreeningClustering(List ListPlatesToProcess, bool IsOneByOne) + { - foreach (cDRC_Region CurrentRegion in CurrentPlate.ListDRCRegions) - { - List LDesc = new List(); + this.Cursor = Cursors.WaitCursor; + cMachineLearning MachineLearning = new cMachineLearning(this.GlobalInfo); + cParamAlgo ParamAlgoForClustering = MachineLearning.AskAndGetClusteringAlgo(); + if (ParamAlgoForClustering == null) + { + this.Cursor = Cursors.Default; + return; + } - Idesc = 0; - int IDESCBase = 0; + DataTable dt = new DataTable(); - for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) + for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) + { + if (CompleteScreening.ListDescriptors[IdxDesc].IsActive()) + dt.Columns.Add(CompleteScreening.ListDescriptors[IdxDesc].GetName()); + } + if (IsOneByOne) + { + foreach (cPlate itemPlate in ListPlatesToProcess) + { + foreach (cWell item in itemPlate.ListActiveWells) { - if (!CompleteScreening.ListDescriptors[i].IsActive()) continue; - - cDRC CurrentDRC = CurrentRegion.GetDRC(CompleteScreening.ListDescriptors[IDESCBase++]); - - cDescriptor Desc_EC50 = new cDescriptor(CurrentDRC.EC50, ListDescType[Idesc++], CompleteScreening); - LDesc.Add(Desc_EC50); + cExtendedList ListValues = item.GetAverageValuesList(false); + dt.Rows.Add(); + int RealIdx = 0; + for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) + { + if (CompleteScreening.ListDescriptors[IdxDesc].IsActive()) + dt.Rows[dt.Rows.Count - 1][RealIdx++] = ListValues[IdxDesc]; + } + } - cDescriptor Desc_Top = new cDescriptor(CurrentDRC.Top, ListDescType[Idesc++], CompleteScreening); - LDesc.Add(Desc_Top); + MachineLearning.SelectedClusterer = MachineLearning.BuildClusterer(ParamAlgoForClustering, dt); - cDescriptor Desc_Bottom = new cDescriptor(CurrentDRC.Bottom, ListDescType[Idesc++], CompleteScreening); - LDesc.Add(Desc_Bottom); + if (MachineLearning.SelectedClusterer != null) + { + double[] Assign = MachineLearning.EvaluteAndDisplayClusterer(richTextBoxInfoClustering, + null, + MachineLearning.CreateInstancesWithoutClass(dt)).getClusterAssignments(); - cDescriptor Desc_Slope = new cDescriptor(CurrentDRC.Slope, ListDescType[Idesc++], CompleteScreening); - LDesc.Add(Desc_Slope); + MachineLearning.Classes = new cExtendedList(); + MachineLearning.Classes.AddRange(Assign); } - cWell NewWell = new cWell(LDesc, CurrentRegion.PosXMin + 1, CurrentRegion.PosYMin + 1, MergedScreening, NewPlate); - NewWell.Name = "DRC [" + CurrentRegion.PosXMin + ":" + CurrentRegion.PosYMin + "]"; - NewPlate.AddWell(NewWell); + if (MachineLearning.Classes.Max() >= GlobalInfo.GetNumberofDefinedWellClass()) + { + MessageBox.Show("The number of cluster is higher than the supported number of classes. Operation cancelled !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + this.Cursor = Cursors.Default; + return; + } + if (MachineLearning.Classes.IsContainNegative() || (MachineLearning.Classes.Count == 0)) + { + MessageBox.Show("Negative or null cluster index identified. Operation cancelled !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + this.Cursor = Cursors.Default; + return; + } + // ----- update well classes ------ + int IdxWell = 0; + foreach (cWell item in itemPlate.ListActiveWells) + item.SetClass((int)MachineLearning.Classes[IdxWell++]); } } + else + { + foreach (cPlate itemPlate in ListPlatesToProcess) + { + foreach (cWell item in itemPlate.ListActiveWells) + { + cExtendedList ListValues = item.GetAverageValuesList(false); + dt.Rows.Add(); + int RealIdx = 0; + for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) + { + if (CompleteScreening.ListDescriptors[IdxDesc].IsActive()) + dt.Rows[dt.Rows.Count - 1][RealIdx++] = ListValues[IdxDesc]; + } + } + } + MachineLearning.SelectedClusterer = MachineLearning.BuildClusterer(ParamAlgoForClustering, dt); - // PanelList[0].CurrentScreening.ListPlatesActive.Clear(); - // PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.RefreshInfoScreeningRichBox(); - MergedScreening.ListPlatesActive = new cExtendPlateList(); + if (MachineLearning.SelectedClusterer != null) + { + double[] Assign = MachineLearning.EvaluteAndDisplayClusterer(richTextBoxInfoClustering, + null, + MachineLearning.CreateInstancesWithoutClass(dt)).getClusterAssignments(); - for (int i = 0; i < MergedScreening.ListPlatesAvailable.Count; i++) - { - MergedScreening.ListPlatesActive.Add(MergedScreening.ListPlatesAvailable[i]); - // MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Add(PanelList[0].CurrentScreening.ListPlatesActive[i].Name); + MachineLearning.Classes = new cExtendedList(); + MachineLearning.Classes.AddRange(Assign); + } + if (MachineLearning.Classes.Max() >= GlobalInfo.GetNumberofDefinedWellClass()) + { + MessageBox.Show("The number of cluster is higher than the supported number of classes. Operation cancelled !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + this.Cursor = Cursors.Default; + return; + } + if (MachineLearning.Classes.IsContainNegative() || (MachineLearning.Classes.Count == 0)) + { + MessageBox.Show("Negative or null cluster index identified. Operation cancelled !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + this.Cursor = Cursors.Default; + return; + } + int IdxWell = 0; + // ----- update well classes ------ + foreach (cPlate itemPlate in ListPlatesToProcess) + { + foreach (cWell item in itemPlate.ListActiveWells) + item.SetClass((int)MachineLearning.Classes[IdxWell++]); + } } - //PanelList[0].CurrentScreening.CurrentDisplayPlateIdx = 0; - //PanelList[0].CurrentScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.SelectedIndex = 0; + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + this.Cursor = Cursors.Default; + } + #endregion + + private void buttonNewClassificationProcess_Click(object sender, EventArgs e) + { + cMachineLearning MachineLearningForClassif = new cMachineLearning(this.GlobalInfo); + //cParamAlgo AlgoAndParameters = MachineLearningForClassif.AskAndGetClassifAlgo(); - //PanelList[0].CurrentScreening.GetCurrentDisplayPlate().DisplayDistribution(PanelList[0].CurrentScreening.ListDescriptors.CurrentSelectedDescriptor, false); + // List ListClassSelected = ((PanelForClassSelection)panelForClassSelectionClustering.Controls[0]).GetListSelectedClass(); + // cInfoClass InfoClass = new cInfoClass(); + //Instances ListInstances = CompleteScreening.GetCurrentDisplayPlate().CreateInstancesWithClasses(ListClassSelected); + cInfoClass InfoClass = CompleteScreening.GetCurrentDisplayPlate().GetNumberOfClassesBut(comboBoxNeutralClassForClassif.SelectedIndex); - CompleteScreening.ListDescriptors = MergedScreening.ListDescriptors; - CompleteScreening.ListPlatesAvailable = MergedScreening.ListPlatesAvailable; - CompleteScreening.ListPlatesActive = MergedScreening.ListPlatesActive; + Instances ListInstances = CompleteScreening.GetCurrentDisplayPlate().CreateInstancesWithClasses(InfoClass, comboBoxNeutralClassForClassif.SelectedIndex); - CompleteScreening.UpDatePlateListWithFullAvailablePlate(); - for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) - CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, true); - } + //panelForClassSelectionClustering - private void displayDRCToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions == null) return; + weka.classifiers.Evaluation EvalClassif = new weka.classifiers.Evaluation(ListInstances); - int h = 0; - FormToDisplayDRC WindowforDRCsDisplay = new FormToDisplayDRC(); + MachineLearningForClassif.PerformTraining(MachineLearningForClassif.AskAndGetClassifAlgo(), + ListInstances, + InfoClass.NumberOfClass, + richTextBoxInfoClustering, + panelTMPForFeedBack, + out EvalClassif, + false); + } - foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) - { - int cpt = 0; - List ListDRC = new List(); - for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) - { - if (CompleteScreening.ListDescriptors[i].IsActive()) - { - cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); - ListDRC.Add(CurrentDRC); - cpt++; - } - } - cDRCDisplay DRCDisplay = new cDRCDisplay(ListDRC, GlobalInfo); - if (DRCDisplay.CurrentChart.Series.Count == 0) continue; + private void heatMapToolStripMenuItem_Click(object sender, EventArgs e) + { + if (CompleteScreening == null) return; + List ListPlates = new List(); - DRCDisplay.CurrentChart.Location = new Point((DRCDisplay.CurrentChart.Width + 50) * 0, (DRCDisplay.CurrentChart.Height + 10 + DRCDisplay.CurrentRichTextBox.Height) * h++); - DRCDisplay.CurrentRichTextBox.Location = new Point(DRCDisplay.CurrentChart.Location.X, DRCDisplay.CurrentChart.Location.Y + DRCDisplay.CurrentChart.Height + 5); + ListPlates.Add(new FormToDisplayPlate(CompleteScreening.GetCurrentDisplayPlate(), CompleteScreening)); - WindowforDRCsDisplay.LChart.Add(DRCDisplay.CurrentChart); - WindowforDRCsDisplay.LRichTextBox.Add(DRCDisplay.CurrentRichTextBox); - } + cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(), 6, GlobalInfo); - WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LChart.ToArray()); - WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LRichTextBox.ToArray()); - WindowforDRCsDisplay.Show(); + WindowToDisplayArray.Show(); } - - private void displayRespondingDRCToolStripMenuItem1_Click(object sender, EventArgs e) + private void testRStatsToolStripMenuItem_Click(object sender, EventArgs e) { - if (CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions == null) return; - - FormForDRCSelection WindowSelectionDRC = new FormForDRCSelection(); - if (WindowSelectionDRC.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + var envPath = System.Environment.GetEnvironmentVariable("PATH"); + var rBinPath = @"C:\Program Files\R\R-2.15.2\bin\i386"; + System.Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath); - if (WindowSelectionDRC.checkBoxMOAClassification.Checked == false) + using (REngine engine = REngine.CreateInstance("RDotNet")) { - int h = 0; - FormToDisplayDRC WindowforDRCsDisplay = new FormToDisplayDRC(); - - foreach (cDRC_Region TmpRegion in CompleteScreening.GetCurrentDisplayPlate().ListDRCRegions) - { - int cpt = 0; - List ListDRC = new List(); - for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) - { - if (CompleteScreening.ListDescriptors[i].IsActive()) - { - cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); - if (CurrentDRC.IsResponding(WindowSelectionDRC) == 1) - { - ListDRC.Add(CurrentDRC); - cpt++; - } - } - } - cDRCDisplay DRCDisplay = new cDRCDisplay(ListDRC, GlobalInfo); - if (DRCDisplay.CurrentChart.Series.Count == 0) continue; + cRandomGenerator NewRNDData = new cRandomGenerator(this.GlobalInfo); + NewRNDData.List_Number = 2; + NewRNDData.Size_List = 10; + NewRNDData.Run(); - DRCDisplay.CurrentChart.Location = new Point((DRCDisplay.CurrentChart.Width + 50) * 0, (DRCDisplay.CurrentChart.Height + 10 + DRCDisplay.CurrentRichTextBox.Height) * h++); - DRCDisplay.CurrentRichTextBox.Location = new Point(DRCDisplay.CurrentChart.Location.X, DRCDisplay.CurrentChart.Location.Y + DRCDisplay.CurrentChart.Height + 5); + NumericVector group1 = engine.CreateNumericVector(NewRNDData.GetOutPut()[0].ToArray()); + engine.SetSymbol(NewRNDData.GetOutPut()[0].Name, group1); - WindowforDRCsDisplay.LChart.Add(DRCDisplay.CurrentChart); - WindowforDRCsDisplay.LRichTextBox.Add(DRCDisplay.CurrentRichTextBox); - } + NumericVector group2 = engine.CreateNumericVector(NewRNDData.GetOutPut()[1].ToArray()); + engine.SetSymbol(NewRNDData.GetOutPut()[1].Name, group2); + // Direct parsing from R script. + // NumericVector group2 = engine.EagerEvaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric(); - WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LChart.ToArray()); - WindowforDRCsDisplay.panelForDRC.Controls.AddRange(WindowforDRCsDisplay.LRichTextBox.ToArray()); - WindowforDRCsDisplay.Show(); - return; - } + // Test difference of mean and get the P-value. + GenericVector testResult = engine.EagerEvaluate("t.test(group1, group2)").AsList(); + double p = testResult["p.value"].AsNumeric().First(); + Console.WriteLine("Group1: [{0}]", string.Join(", ", group1)); + Console.WriteLine("Group2: [{0}]", string.Join(", ", group2)); + Console.WriteLine("P-value = {0:0.000}", p); - System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (ResWin == System.Windows.Forms.DialogResult.No) return; + } + } + private void testNewProjectorsToolStripMenuItem_Click(object sender, EventArgs e) + { + cFeedBackMessage MessageReturned; - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) - { - foreach (cDRC_Region TmpRegion in CurrentPlate.ListDRCRegions) - { - int cpt = 0; - //List ListDRC = new List(); - //for (int i = 0; i < CompleteScreening.ListDescriptors.Count; i++) - //{ - // if (CompleteScreening.ListDescriptors[i].IsActive()) - // { - // cDRC CurrentDRC = new cDRC(TmpRegion, CompleteScreening.ListDescriptors[i]); - // if (CurrentDRC.IsResponding(WindowSelectionDRC)) - // { - // ListDRC.Add(CurrentDRC); - // cpt++; - // } - // } + cRandomGenerator NewRNDData = new cRandomGenerator(this.GlobalInfo); + NewRNDData.List_Number = 4; + NewRNDData.Size_List = 10; + NewRNDData.Run(); + // in this case we are giving meaningfull names to each data + int idAxis = 0; + foreach (var item in NewRNDData.GetOutPut()) + item.Name = "Axis_" + (idAxis++); - //} - List ResDescActive = TmpRegion.GetListRespondingDescritpors(CompleteScreening, WindowSelectionDRC); - for (int j = 0; j < TmpRegion.NumReplicate; j++) - for (int i = 0; i < TmpRegion.NumConcentrations; i++) - { + //cDisplayCorrelationMatrix ComputeAndDisplay_SingleCorrelationMatrix = new cDisplayCorrelationMatrix(); + //ComputeAndDisplay_SingleCorrelationMatrix.Set_Data(NewRNDData.GetOutPut()); + //ComputeAndDisplay_SingleCorrelationMatrix.Run(); + // return; - cWell CurrentWell = TmpRegion.GetListWells()[j][i]; - if (CurrentWell == null) continue; + #region Build data + // Step 0: create data (here we are using a "filter" to generate values, but you could + // generate manually your own data. Converter from S-stats, and Weka are under dev. + // soon CSV and Database reader will be added too. + //cRandomGenerator NewRNDData = new cRandomGenerator(this.GlobalInfo); + //NewRNDData.List_Number = 4; + //NewRNDData.Size_List = 10; + //NewRNDData.Run(); - for (int IdxDesc = 0; IdxDesc < ResDescActive.Count; IdxDesc++) - { - if (ResDescActive[IdxDesc] == -1) continue; + //// in this case we are giving meaningfull names to each data + //int idAxis = 0; + //foreach (var item in NewRNDData.GetOutPut()) + // item.Name = "Axis_" + (idAxis++); - //CurrentWell.ListDescriptors[IdxDesc].HistoValues = new double[1]; - CurrentWell.ListDescriptors[IdxDesc].SetHistoValues((double)ResDescActive[IdxDesc]); - if ((i == 0) && (j == 0)) - CurrentWell.SetClass(0); - else - CurrentWell.SetAsNoneSelected(); - //[0] = ResDescActive[IdxDesc]; - CurrentWell.ListDescriptors[IdxDesc].UpDateDescriptorStatistics(); + // you can get the value from the wells taking into account the GUI information as well... + cExtendedTable DataFromPlate = new cExtendedTable(CompleteScreening.GetCurrentDisplayPlate().ListActiveWells, true); + DataFromPlate.Name = CompleteScreening.GetCurrentDisplayPlate().Name; + #endregion - } + #region process + // step 1: we are processing the data... it can be any kind of operation. + // here we are computing a PCA. + // (a) build the "filter" + // (b) set the input data (mandatory) + // (b') change the parameters (optional) + // (c) run the process. Check that everthing went well + cProjectorPCA PCA = new cProjectorPCA(); - } - } - CurrentPlate.UpDataMinMax(); + PCA.SetInputData(/*NewRNDData.GetOutPut()*/DataFromPlate); + MessageReturned = PCA.Run(); + if (!MessageReturned.IsSucceed) + { + MessageBox.Show(MessageReturned.Message, "Error: " + PCA.Title, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - } - - #endregion - private void xYZScatterPointsToolStripMenuItem_Click(object sender, EventArgs e) + // here is a short example to compute and display the square values of the PCA coeff. + cArithmetic_Power SquareValues = new cArithmetic_Power(); + SquareValues.SetInputData(PCA.GetOutPut()); + SquareValues.Set_Power(2.0); + SquareValues.Run(); + cViewerTable DisplayForTable0 = new cViewerTable(); + DisplayForTable0.SetInputData(SquareValues.GetOutPut()); + if (!DisplayForTable0.Run().IsSucceed) return; + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(DisplayForTable0.GetOutPut()); + Designer0.Run(); + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(Designer0.GetOutPut()); + Disp0.Title = SquareValues.Title; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); + + #endregion + + // here is a filter for projecting and displaying the scatter data + cLinearProjector LinearProjection = new cLinearProjector(); + LinearProjection.Set_Basis(PCA.GetOutPut()); + LinearProjection.Set_Input(DataFromPlate); + if (!LinearProjection.Run().IsSucceed) + MessageReturned = LinearProjection.Run(); + if (!MessageReturned.IsSucceed) + { + MessageBox.Show(MessageReturned.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // this will change ... for the moment there's no designer... + //cViewerScatter2D ProjectedPts = new cViewerScatter2D(); + //ProjectedPts.SetInputData(LinearProjection.GetOutPut()); + //ProjectedPts.Run(); + //ProjectedPts.Display(); + + #region Display results + // step 2: in this case we want to display the results as a table, but we could + // do the same with a heat-map, a 2d-3d scatter points, etc... + // (a) build the "filter" + // (b) set the input data (mandatory) + // (b') change the parameters (optional) + // (c) run the process. Check that everthing went well + cViewerTable DisplayForTable = new cViewerTable(); + DisplayForTable.SetInputData(PCA.GetOutPut()); + if (!DisplayForTable.Run().IsSucceed) return; + + // step 3: at this stage we have to design our interface. In this case it doesn't + // seem very useful, but think that the final display could be a mix of many different + // views... + // (a) build the "filter" + // (b) set the input data (mandatory) + // (b') change the parameters (optional) + // (c) run the process. Check that everthing went well + cDesignerSinglePanel Designer = new cDesignerSinglePanel(); + Designer.SetInputData(DisplayForTable.GetOutPut()); + Designer.Run(); + + + // step 4: final display, create a window and show it ! + // (a) build the "filter" + // (b) set the input data (mandatory) + // (b') change the parameters (optional) + // (c) run the process. Check that everthing went well + // (d) in this case, abd because there nothing after that, + // the user has to execute a Display function. + cDisplayToWindow Disp = new cDisplayToWindow(); + Disp.SetInputData(Designer.GetOutPut()); + Disp.Title = PCA.Title; + if (!Disp.Run().IsSucceed) return; + Disp.Display(); + #endregion + + } + + private void toolStripButtonZoomOut_Click(object sender, EventArgs e) { if (CompleteScreening == null) return; + CompleteScreening.GlobalInfo.ChangeSize(0.8f); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); - GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = false; - FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(false, CompleteScreening); - for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) - { - FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - } - FormToDisplayXYZ.Show(); - FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - return; } - private void xYZScatterPointsToolStripMenuItemFullScreen_Click(object sender, EventArgs e) + private void toolStripButtonZoomIn_Click(object sender, EventArgs e) { if (CompleteScreening == null) return; - - GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = false; - FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(true, CompleteScreening); - for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) - { - FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - } - FormToDisplayXYZ.Show(); - FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - return; + CompleteScreening.GlobalInfo.ChangeSize(1.2f); + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - #region Distributions - private void distributionsModeToolStripMenuItem_Click(object sender, EventArgs e) + private void globalToolStripMenuItem_Click(object sender, EventArgs e) { - GlobalInfo.SwitchDistributionMode(); + + GlobalSelection(false); + // CompleteScreening.GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; + if (CompleteScreening != null) + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); } - private void displayReferenceToolStripMenuItem_Click(object sender, EventArgs e) + private void globalIfOnlyActiveToolStripMenuItem_Click(object sender, EventArgs e) { + GlobalSelection(true); - if (CompleteScreening.Reference == null) + if (CompleteScreening != null) + CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, false); + } + + private void HCSAnalyzer_DragDrop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - MessageBox.Show("No reference curve generated. Switch to Distribution mode.\n", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + if (files[0].Remove(0, files[0].Length - 4) == ".csv") + { + LoadCSVAssay(files, false); + UpdateUIAfterLoading(); + } } - cDisplayGraph DispGraph = new cDisplayGraph(CompleteScreening.Reference[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].ToArray(), CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName() + " - Reference distribution."); + return; } - #endregion - private void mINEAnalysisToolStripMenuItem_Click(object sender, EventArgs e) + + + void UpDateProcessModefromGUI() { + if (ProcessModeplateByPlateToolStripMenuItem.Checked) + GlobalInfo.ProcessMode = eProcessMode.PLATE_BY_PLATE; + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) + GlobalInfo.ProcessMode = eProcessMode.ENTIRE_SCREENING; + else + GlobalInfo.ProcessMode = eProcessMode.SINGLE_PLATE; + } - if (CompleteScreening.ListDescriptors.GetListNameActives().Count <= 1) - { - MessageBox.Show("MINE Analysis requires at least two activated descriptors\n", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - bool IsFullScreen = false; - List[] ListValueDesc = ExtractDesciptorAverageValuesList(IsFullScreen); + private void processModeToolStripMenuItem_Click(object sender, EventArgs e) + { + ProcessModeplateByPlateToolStripMenuItem.Checked = false; + ProcessModeEntireScreeningToolStripMenuItem.Checked = false; + toolStripDropDownButtonProcessMode.Text = "Current Plate"; - DisplayMINE(ListValueDesc); + } + private void plateByPlateToolStripMenuItem_Click(object sender, EventArgs e) + { + ProcessModeEntireScreeningToolStripMenuItem.Checked = false; + ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked = false; + toolStripDropDownButtonProcessMode.Text = "Plate by Plate"; } - public void DisplayMINE(List[] ListValueDesc) + private void entireScreeningToolStripMenuItem_Click(object sender, EventArgs e) { - int NumDesc = ListValueDesc.Length; + ProcessModeplateByPlateToolStripMenuItem.Checked = false; + ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked = false; + toolStripDropDownButtonProcessMode.Text = "Entire Screening"; + } - double[,] CorrelationMatrix = new double[NumDesc, NumDesc]; - double[][] dataset1 = new double[NumDesc][]; - string[] VarNames = new string[NumDesc]; + private void listBoxSelectedWells_MouseDown(object sender, MouseEventArgs e) + { + // first: get the well + cWell SelectedWell = null; - for (int iDesc = 0; iDesc < NumDesc; iDesc++) + if (e.Button == MouseButtons.Right) { - dataset1[iDesc] = new double[ListValueDesc[iDesc].Count]; + ContextMenuStrip NewMenu = new ContextMenuStrip(); - Array.Copy(ListValueDesc[iDesc].ToArray(), dataset1[iDesc], ListValueDesc[iDesc].Count); - VarNames[iDesc] = iDesc.ToString(); - } - data.Dataset data1 = new data.Dataset(dataset1, VarNames, 0); - VarPairQueue Qu = new VarPairQueue(data1); + ToolStripMenuItem ToolStripMenuItem_Clear = new ToolStripMenuItem("Clear"); + ToolStripMenuItem_Clear.Click += new System.EventHandler(this.ToolStripMenuItem_Clear); + NewMenu.Items.Add(ToolStripMenuItem_Clear); + int IdxItem = listBoxSelectedWells.IndexFromPoint(e.Location); - for (int iDesc = 0; iDesc < NumDesc; iDesc++) - for (int jDesc = 0; jDesc < iDesc; jDesc++) + if (IdxItem != -1) { - Qu.addPair(iDesc, jDesc); + SelectedWell = GlobalInfo.ListSelectedWell[IdxItem]; + foreach (var item in SelectedWell.GetExtendedContextMenu()) + NewMenu.Items.Add(item); } - Analysis ana = new Analysis(data1, Qu); - AnalysisParameters param = new AnalysisParameters(); - double resparam = param.commonValsThreshold; - - // analysis.results.FullResult Full = new analysis.results.FullResult(); - //List Brief = new List(); - //analysis.results.BriefResult Brief = new analysis.results.BriefResult(); - - - - java.lang.Class t = java.lang.Class.forName("analysis.results.BriefResult"); - - //java.lang.Class restype = null; - ana.analyzePairs(t, param); + NewMenu.Show(Control.MousePosition); + } + } - // object o = (ana.varPairQueue().peek()); - // ana.getClass(); - // int resNum = ana.numResults(); - analysis.results.Result[] res = ana.getSortedResults(); + private void ToolStripMenuItem_Clear(object sender, EventArgs e) + { + listBoxSelectedWells.Items.Clear(); + GlobalInfo.ListSelectedWell.Clear(); + } - List ListValues = new List(); - List NameX = CompleteScreening.ListDescriptors.GetListNameActives(); - List ListIscolor = new List(); + private void testBoxPlotToolStripMenuItem_Click(object sender, EventArgs e) + { + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - for (int Idx = 0; Idx < res.Length; Idx++) + if (ListClassSelected.Sum() < 1) { - ListValues.Add(res[Idx].toString().Split(',')); - ListValues[Idx][0] = NameX[int.Parse(ListValues[Idx][0])]; - ListValues[Idx][1] = NameX[int.Parse(ListValues[Idx][1])]; + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - string[] ListNames = res[0].getHeader().Split(','); - ListNames[0] = "Descriptor A"; - ListNames[1] = "Descriptor B"; - - for (int NIdx = 0; NIdx < ListNames.Length; NIdx++) + cPlate TmpPlate = CompleteScreening.GetCurrentDisplayPlate(); + List ListWellsToProcess = new List(); + // cExtendedList ListClasses = new cExtendedList(); + // ListClasses.Name = "Classes"; + foreach (cWell item in TmpPlate.ListActiveWells) { - if (NIdx == 0) ListIscolor.Add(false); - else if (NIdx == 1) ListIscolor.Add(false); - else ListIscolor.Add(true); - + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[item.GetClassIdx()] == 1) + { + ListWellsToProcess.Add(item); + // ListClasses.Add(item.GetClassIdx()); + } + } } - cDisplayTable DisplayForTable = new cDisplayTable("MINE Analysis results", ListNames, ListValues, GlobalInfo, true); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + // NewTable.Add(ListClasses); - } - private void findPathwayToolStripMenuItem_Click(object sender, EventArgs e) - { + cViewerBoxPlot CV = new cViewerBoxPlot(); + CV.SetInputData(NewTable); + CV.Run(); - if (CompleteScreening == null) return; - FormForNameRequest FormForRequest = new FormForNameRequest(); - if (FormForRequest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + //cDesignerSinglePanel CDP = new cDesignerSinglePanel(); + //CDP.SetInputData(CV.GetOutPut()); + //CDP.Run(); - FormForKeggGene KeggWin = new FormForKeggGene(); - KEGG ServKegg = new KEGG(); - string[] intersection_gene_pathways = new string[1]; + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(CV.GetOutPut()); + CDW.Title = CV.Title; + CDW.Run(); + CDW.Display(); - string[] Pathways = { FormForRequest.textBoxForName.Text }; - intersection_gene_pathways = ServKegg.get_genes_by_pathway("path:" + Pathways[0]); - if ((Pathways == null) || (Pathways.Length == 0)) - { - MessageBox.Show("No pathway founded !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - string[] fg_list = { "black" }; - string[] bg_list = { "orange" }; - string pathway_map_html = ""; - // KEGG ServKegg = new KEGG(); - string[] ListGenesinPathway = ServKegg.get_genes_by_pathway("path:" + Pathways[0]); - if (ListGenesinPathway.Length == 0) - { - return; - } - double[] ListValues = new double[ListGenesinPathway.Length]; - int IDxGeneOfInterest = 0; - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) - { - foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) - { - string CurrentLID = "hsa:" + (int)CurrentWell.LocusID; - for (int IdxGene = 0; IdxGene < ListGenesinPathway.Length; IdxGene++) - { - if (CurrentLID == intersection_gene_pathways[0]) - IDxGeneOfInterest = IdxGene; + } - if (CurrentLID == ListGenesinPathway[IdxGene]) - { - ListValues[IdxGene] = CurrentWell.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetValue(); - break; - } - } - } - } + private void zScoreToolStripMenuItem_Click(object sender, EventArgs e) + { + #region obsolete + //List Pos = new List(); + //List Neg = new List(); + //List ZFactorList = new List(); - bg_list = new string[ListGenesinPathway.Length]; - fg_list = new string[ListGenesinPathway.Length]; + //int NumDesc = CompleteScreening.ListDescriptors.Count; - double MinValue = ListValues.Min(); - double MaxValue = ListValues.Max(); + //cWell TempWell; + //// loop on all the desciptors + //for (int Desc = 0; Desc < NumDesc; Desc++) + //{ + // Pos.Clear(); + // Neg.Clear(); - for (int IdxCol = 0; IdxCol < bg_list.Length; IdxCol++) - { + // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; - int ConvertedValue = (int)((((CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[0].Length - 1) * (ListValues[IdxCol] - MinValue)) / (MaxValue - MinValue))); + // for (int row = 0; row < CompleteScreening.Rows; row++) + // for (int col = 0; col < CompleteScreening.Columns; col++) + // { + // TempWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, row, true); + // if (TempWell == null) continue; + // else + // { + // if (TempWell.GetClassIdx() == 0) + // Pos.Add(TempWell.ListDescriptors[Desc].GetValue()); + // if (TempWell.GetClassIdx() == 1) + // Neg.Add(TempWell.ListDescriptors[Desc].GetValue()); + // } + // } + // if (Pos.Count < 3) + // { + // MessageBox.Show("No or not enough positive controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } + // if (Neg.Count < 3) + // { + // MessageBox.Show("No or not enough negative controls !", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + // return; + // } - Color Coul = Color.FromArgb(CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[0][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[1][ConvertedValue], CompleteScreening.GlobalInfo.LUTs.LUT_GREEN_TO_RED[2][ConvertedValue]); - if (IdxCol == IDxGeneOfInterest) - fg_list[IdxCol] = "white"; - else - fg_list[IdxCol] = "#000000"; - bg_list[IdxCol] = "#" + Coul.Name.Remove(0, 2); + // double ZScore = 1 - 3 * (std(Pos.ToArray()) + std(Neg.ToArray())) / (Math.Abs(Mean(Pos.ToArray()) - Mean(Neg.ToArray()))); + // GlobalInfo.ConsoleWriteLine(CompleteScreening.ListDescriptors[Desc].GetName() + ", Z-Score = " + ZScore); + // cSimpleSignature TmpDesc = new cSimpleSignature(CompleteScreening.ListDescriptors[Desc].GetName(), ZScore); + // ZFactorList.Add(TmpDesc); + //} + + //ZFactorList.Sort(delegate(cSimpleSignature p1, cSimpleSignature p2) { return p1.AverageValue.CompareTo(p2.AverageValue); }); + + //Series CurrentSeries = new Series(); + //CurrentSeries.ChartType = SeriesChartType.Column; + //CurrentSeries.ShadowOffset = 1; - } + //Series SeriesLine = new Series(); + //SeriesLine.Name = "SeriesLine"; + //SeriesLine.ShadowOffset = 1; + //SeriesLine.ChartType = SeriesChartType.Line; - // foreach (string item in ListP.listBoxPathways.SelectedItems) - { - pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects(Pathways[0], ListGenesinPathway, fg_list, bg_list); - } + //int RealIdx = 0; + //for (int IdxValue = 0; IdxValue < ZFactorList.Count; IdxValue++) + //{ + // if (double.IsNaN(ZFactorList[IdxValue].AverageValue)) continue; + // if (double.IsInfinity(ZFactorList[IdxValue].AverageValue)) continue; + + // CurrentSeries.Points.Add(ZFactorList[IdxValue].AverageValue); + // CurrentSeries.Points[RealIdx].Label = ZFactorList[IdxValue].AverageValue.ToString("N2"); + // CurrentSeries.Points[RealIdx].Font = new Font("Arial", 10); + // CurrentSeries.Points[RealIdx].ToolTip = ZFactorList[IdxValue].Name; + // CurrentSeries.Points[RealIdx].AxisLabel = ZFactorList[IdxValue].Name; + + // SeriesLine.Points.Add(ZFactorList[IdxValue].AverageValue); + // SeriesLine.Points[RealIdx].BorderColor = Color.Black; + // SeriesLine.Points[RealIdx].MarkerStyle = MarkerStyle.Circle; + // SeriesLine.Points[RealIdx].MarkerSize = 4; + // RealIdx++; + //} - pathway_map_html = ServKegg.get_html_of_colored_pathway_by_objects((string)(Pathways[0]), intersection_gene_pathways, fg_list, bg_list); + //SimpleForm NewWindow = new SimpleForm(CompleteScreening); + //int thisWidth = 200 * RealIdx; + //if (thisWidth > (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value) thisWidth = (int)GlobalInfo.OptionsWindow.numericUpDownMaximumWidth.Value; + //NewWindow.Width = thisWidth; + //NewWindow.Height = 400; + //NewWindow.Text = "Z-factors"; - // FormForKegg KeggWin = new FormForKegg(); - if (pathway_map_html.Length == 0) return; + //ChartArea CurrentChartArea = new ChartArea(); + //CurrentChartArea.BorderColor = Color.Black; + //CurrentChartArea.AxisX.Interval = 1; + //NewWindow.chartForSimpleForm.Series.Add(CurrentSeries); + //NewWindow.chartForSimpleForm.Series.Add(SeriesLine); - // - //KeggWin.Show(); - //ListP.listBoxPathways.MouseDoubleClick += new MouseEventHandler(listBox1_MouseDoubleClick); - KeggWin.webBrowser.Navigate(pathway_map_html); + //CurrentChartArea.AxisX.IsLabelAutoFit = true; + //NewWindow.chartForSimpleForm.ChartAreas.Add(CurrentChartArea); - KeggWin.Show(); - } + //CurrentChartArea.Axes[1].Maximum = 2; + //CurrentChartArea.Axes[1].IsMarksNextToAxis = true; + //CurrentChartArea.Axes[0].MajorGrid.Enabled = false; + //CurrentChartArea.Axes[1].MajorGrid.Enabled = false; + //NewWindow.chartForSimpleForm.TextAntiAliasingQuality = TextAntiAliasingQuality.High; + //CurrentChartArea.BackGradientStyle = GradientStyle.TopBottom; + //CurrentChartArea.BackColor = CompleteScreening.GlobalInfo.OptionsWindow.panel1.BackColor; + //CurrentChartArea.BackSecondaryColor = Color.White; + //CurrentChartArea.AxisX.ScaleView.Zoomable = true; + //CurrentChartArea.AxisY.ScaleView.Zoomable = true; - private void panelForPlate_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (CompleteScreening == null) return; + //Title CurrentTitle = new Title(CompleteScreening.GetCurrentDisplayPlate().Name + " Z-factors"); + //CurrentTitle.Font = new System.Drawing.Font("Arial", 11, FontStyle.Bold); + //NewWindow.chartForSimpleForm.Titles.Add(CurrentTitle); + //NewWindow.Show(); + //NewWindow.chartForSimpleForm.Update(); + //NewWindow.chartForSimpleForm.Show(); + //NewWindow.AutoScroll = true; + //NewWindow.Controls.AddRange(new System.Windows.Forms.Control[] { NewWindow.chartForSimpleForm }); + #endregion - int ScrollShiftY = this.panelForPlate.VerticalScroll.Value; - int ScrollShiftX = this.panelForPlate.HorizontalScroll.Value; - int Gutter = (int)GlobalInfo.OptionsWindow.numericUpDownGutter.Value; + cGUI_2ClassesSelection GUI_ListClasses = new cGUI_2ClassesSelection(); - int PosX = (int)((e.X - ScrollShiftX) / (GlobalInfo.SizeHistoWidth + Gutter)); - int PosY = (int)((e.Y - ScrollShiftY) / (GlobalInfo.SizeHistoHeight + Gutter)); + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedTable ListClassSelected = GUI_ListClasses.GetOutPut(); + int IdxClassNeg = -1; + int IdxClassPos = -1; + for (int IdxC = 0; IdxC < ListClassSelected[0].Count; IdxC++) + { + if (ListClassSelected[0][IdxC] == 1) IdxClassNeg = IdxC; + if (ListClassSelected[1][IdxC] == 1) IdxClassPos = IdxC; + } - bool OnlyOnSelected = false; + #region single plate and plate by plate - if ((PosX == 0) && (PosY > 0)) + cDesignerTab DT = new cDesignerTab(); + if ((ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) || (ProcessModeplateByPlateToolStripMenuItem.Checked)/*||(ProcessModeEntireScreeningToolStripMenuItem.Checked)*/) { - for (int col = 0; col < CompleteScreening.Columns; col++) + List ListPlatesToProcess = new List(); + if ((ProcessModeplateByPlateToolStripMenuItem.Checked)/*||(ProcessModeEntireScreeningToolStripMenuItem.Checked)*/) { - if (CompleteScreening.IsSelectionApplyToAllPlates) - { - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(TmpPlate); + } + else + ListPlatesToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) - { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(PlateIdx); - cWell TmpWell = CurrentPlateToProcess.GetWell(col, PosY - 1, OnlyOnSelected); - if (TmpWell == null) continue; + foreach (cPlate TmpPlate in ListPlatesToProcess) + { + List ListWellsToProcess1 = new List(); + List ListWellsToProcess2 = new List(); - if (CompleteScreening.GetSelectionType() == -1) - TmpWell.SetAsNoneSelected(); - else - TmpWell.SetClass(CompleteScreening.GetSelectionType()); + foreach (cWell item in TmpPlate.ListActiveWells) + { + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[0][item.GetClassIdx()] == 1) + ListWellsToProcess1.Add(item); + if (ListClassSelected[1][item.GetClassIdx()] == 1) + ListWellsToProcess2.Add(item); } } - else + + cExtendedTable NewTable1 = new cExtendedTable(ListWellsToProcess1, true); + cExtendedTable NewTable2 = new cExtendedTable(ListWellsToProcess2, true); + + if ((NewTable1.Count == 0) || (NewTable1[0].Count < 3) || (NewTable2.Count == 0) || (NewTable2[0].Count < 3)) { - cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(col, PosY - 1, OnlyOnSelected); - if (TmpWell != null) + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - if (CompleteScreening.GetSelectionType() == -1) TmpWell.SetAsNoneSelected(); - else - TmpWell.SetClass(CompleteScreening.GetSelectionType()); + MessageBox.Show("Insufficient number of control wells", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + else + continue; + } + + cExtendedList ListZ = new cExtendedList(); + List ListDescForZFactor = new List(); + List ListNames = new List(); + int RealIdx = 0; + for (int IDxDesc = 0; IDxDesc < CompleteScreening.ListDescriptors.Count; IDxDesc++) + { + if (!CompleteScreening.ListDescriptors[IDxDesc].IsActive()) continue; + + cExtendedTable TableForZ = new cExtendedTable(); + + TableForZ.Add(NewTable1[RealIdx]); + TableForZ.Add(NewTable2[RealIdx]); + RealIdx++; + + cZFactor ZF = new cZFactor(); + ZF.SetInputData(TableForZ); + ZF.Run(); + ListZ.Add(ZF.GetOutPut()[0][1]); + + ListDescForZFactor.Add(CompleteScreening.ListDescriptors[IDxDesc]); + } + + cExtendedTable ET = new cExtendedTable(new cExtendedTable(ListZ)); + ET[0].ListTags = new List(); + ET[0].ListTags.AddRange(ListDescForZFactor); + ET.Name = TmpPlate.Name + "\nZ-factor - " + GlobalInfo.ListWellClasses[IdxClassNeg].Name + " (" + NewTable1[0].Count + " wells) vs. " + GlobalInfo.ListWellClasses[IdxClassPos].Name + " (" + NewTable2[0].Count + " wells)"; + ET[0].Name = ET.Name; + + cSort S = new cSort(); + S.SetInputData(ET); + S.ColumnIndexForSorting = 0; + S.Run(); + + //ZFactorList.Sort(delegate(cSimpleSignature p1, cSimpleSignature p2) { return p1.AverageValue.CompareTo(p2.AverageValue); }); + cViewerGraph1D VG1 = new cViewerGraph1D(); + VG1.SetInputData(S.GetOutPut()); + + VG1.Chart.LabelAxisY = "Z-factor"; + VG1.Chart.LabelAxisX = "Descriptor"; + VG1.Chart.IsZoomableX = true; + VG1.Chart.IsBar = true; + VG1.Chart.IsBorder = true; + VG1.Chart.IsDisplayValues = true; + VG1.Chart.IsShadow = true; + VG1.Chart.MarkerSize = 4; + VG1.Title = TmpPlate.Name; + VG1.Run(); + + DT.SetInputData(VG1.GetOutPut()); } - CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } + DT.Run(); - if ((PosY == 0) && (PosX > 0)) + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(DT.GetOutPut());//VG1.GetOutPut()); + + + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + CDW.Title = "Z-factor - " + ListPlatesToProcess[0].Name; + else + CDW.Title = "Z-factor - " + ListPlatesToProcess.Count + " plates"; + + CDW.Run(); + CDW.Display(); + } + #endregion + #region entire screening + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) { - for (int row = 0; row < CompleteScreening.Rows; row++) + List ListPlatesToProcess = new List(); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(TmpPlate); + + cExtendedList ListZ = new cExtendedList(); + List ListPlatesForZFactor = new List(); + foreach (cPlate TmpPlate in ListPlatesToProcess) { - if (CompleteScreening.IsSelectionApplyToAllPlates) - { - int NumberOfPlates = CompleteScreening.ListPlatesActive.Count; + List ListWellsToProcess1 = new List(); + List ListWellsToProcess2 = new List(); - for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) + foreach (cWell item in TmpPlate.ListActiveWells) + { + if (item.GetClassIdx() != -1) { - cPlate CurrentPlateToProcess = CompleteScreening.ListPlatesActive.GetPlate(PlateIdx); - cWell TmpWell = CurrentPlateToProcess.GetWell(PosX - 1, row, OnlyOnSelected); - if (TmpWell == null) continue; - - if (CompleteScreening.GetSelectionType() == -1) - TmpWell.SetAsNoneSelected(); - else - TmpWell.SetClass(CompleteScreening.GetSelectionType()); + if (ListClassSelected[0][item.GetClassIdx()] == 1) + ListWellsToProcess1.Add(item); + if (ListClassSelected[1][item.GetClassIdx()] == 1) + ListWellsToProcess2.Add(item); } } - else + + cExtendedTable NewTable1 = new cExtendedTable(ListWellsToProcess1, CompleteScreening.ListDescriptors.GetDescriptorIndex(CompleteScreening.ListDescriptors.GetActiveDescriptor())); + cExtendedTable NewTable2 = new cExtendedTable(ListWellsToProcess2, CompleteScreening.ListDescriptors.GetDescriptorIndex(CompleteScreening.ListDescriptors.GetActiveDescriptor())); + //cExtendedTable NewTable2 = new cExtendedTable(ListWellsToProcess2, false); + + if ((NewTable1.Count == 0) || (NewTable1[0].Count < 3) || (NewTable2.Count == 0) || (NewTable2[0].Count < 3)) { - cWell TmpWell = CompleteScreening.GetCurrentDisplayPlate().GetWell(PosX - 1, row, OnlyOnSelected); - if (TmpWell != null) + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - if (CompleteScreening.GetSelectionType() == -1) TmpWell.SetAsNoneSelected(); - else - TmpWell.SetClass(CompleteScreening.GetSelectionType()); + MessageBox.Show("Insufficient number of control wells", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + else + continue; } + + cExtendedTable TableForZ = new cExtendedTable(); + + TableForZ.Add(NewTable1[0]); + TableForZ.Add(NewTable2[0]); + + cZFactor ZF = new cZFactor(); + ZF.SetInputData(TableForZ); + ZF.Run(); + ListZ.Add(ZF.GetOutPut()[0][1]); + + ListPlatesForZFactor.Add(TmpPlate); } - CompleteScreening.GetCurrentDisplayPlate().UpdateNumberOfClass(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + #endregion + + cExtendedTable ET = new cExtendedTable(new cExtendedTable(ListZ)); + ET[0].ListTags = new List(); + ET[0].ListTags.AddRange(ListPlatesForZFactor); + ET.Name = "Z-factor - " + CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName();// +" - " + GlobalInfo.ListWellClasses[IdxClassNeg].Name + " (" + NewTable1[0].Count + " wells) vs. " + GlobalInfo.ListWellClasses[IdxClassPos].Name + " (" + NewTable2[0].Count + " wells)"; + ET[0].Name = ET.Name; + + cViewerGraph1D VG1 = new cViewerGraph1D(); + VG1.SetInputData(ET); + + VG1.Chart.LabelAxisY = "Z-factor"; + VG1.Chart.LabelAxisX = "Plate"; + VG1.Chart.IsZoomableX = true; + VG1.Chart.IsBar = true; + VG1.Chart.IsBorder = true; + VG1.Chart.IsDisplayValues = true; + VG1.Chart.IsShadow = true; + VG1.Chart.MarkerSize = 4; + + VG1.Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + VG1.Run(); + + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(VG1.GetOutPut()); + CDW.Title = "Z-factor - " + ListPlatesToProcess.Count + " plates"; + CDW.Run(); + CDW.Display(); } } - private void displayGraphToolStripMenuItem_Click(object sender, EventArgs e) + private void normalProbabilityPlotToolStripMenuItem2_Click(object sender, EventArgs e) { - cExtendPlateList ListToProcess = new cExtendPlateList(); - ListToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); - ComputeAndDisplayLDA(ListToProcess); + ComputeAndDisplayMormalProbabilityPlot(false); } - - public string GenerateLDADescriptor(cExtendPlateList PlatesToProcess, int NeutralClass) + private void systematicErrorsToolStripMenuItem_Click(object sender, EventArgs e) { + if (CompleteScreening == null) return; - int NumWell = 0; - int NumWellForLearning = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) - { - NumWellForLearning += CurrentPlate.GetNumberOfActiveWellsButClass(NeutralClass); - NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); - } + System.Windows.Forms.DialogResult Res = MessageBox.Show("By applying this process, classes will be definitively modified ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (Res == System.Windows.Forms.DialogResult.No) return; - if (NumWellForLearning == 0) + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return ""; + List Result = GenerateArtifactMessage(CompleteScreening.GetCurrentDisplayPlate(), comboBoxDescriptorToDisplay.SelectedIndex); + MessageBox.Show(Result[1], "Systematic Error Identification", MessageBoxButtons.OK, MessageBoxIcon.Warning); } - - int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); - - if (NumDesc <= 1) + else { - MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return ""; + DataTable ResultSystematicError = ComputeSystematicErrorsTable(); + dataGridViewForQualityControl.DataSource = ResultSystematicError; + dataGridViewForQualityControl.Update(); } + } - double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; - - // return; - Matrix EigenVectors = LDAComputation(DataForLDA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); + private void aToolStripMenuItem_Click_1(object sender, EventArgs e) + { - string AxeName = ""; - int IDxDesc = 0; - //for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) + //if (CompleteScreening.ListDescriptors.GetListNameActives().Count <= 1) //{ - // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; - - // // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; + // MessageBox.Show("MINE Analysis requires at least two activated descriptors\n", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; //} - for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; Idx++) - { - - if (CompleteScreening.ListDescriptors[Idx].IsActive()) - if (CompleteScreening.ListDescriptors[Idx].GetBinNumber() == 1) - { - AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; - } - else - { - MessageBox.Show("Descriptor length not consistent (" + CompleteScreening.ListDescriptors[Idx].GetName() + " : " + CompleteScreening.ListDescriptors[Idx].GetBinNumber() + " bins", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return null; - } - } - - - cDescriptorsType ColumnType = new cDescriptorsType(AxeName.Remove(AxeName.Length - 3), true, 1, GlobalInfo); - - CompleteScreening.ListDescriptors.AddNew(ColumnType); + //bool IsFullScreen = false; + //List[] ListValueDesc = ExtractDesciptorAverageValuesList(IsFullScreen); + //DisplayMINE(ListValueDesc); + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + if (ProcessModeplateByPlateToolStripMenuItem.Checked) { - foreach (cWell Tmpwell in TmpPlate.ListActiveWells) - { - List LDesc = new List(); + cDesignerTab DT = new cDesignerTab(); - double NewValue = 0; - IDxDesc = 0; - for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count - 1; Idx++) + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + List ListWellsToProcess = new List(); + foreach (cWell item in TmpPlate.ListActiveWells) { - if (CompleteScreening.ListDescriptors[Idx].IsActive()) - // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, 0)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; - NewValue += EigenVectors.getElement(IDxDesc++, 0) * Tmpwell.ListDescriptors[Idx].GetValue(); + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[item.GetClassIdx()] == 1) + ListWellsToProcess.Add(item); + } } - cDescriptor NewDesc = new cDescriptor(NewValue, ColumnType, CompleteScreening); - LDesc.Add(NewDesc); - Tmpwell.AddDescriptors(LDesc); - } - } - - CompleteScreening.ListDescriptors.UpDateDisplay(); - CompleteScreening.UpDatePlateListWithFullAvailablePlate(); - for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) - CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); - - StartingUpDateUI(); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - return AxeName; + cMineAnalysis MA = new cMineAnalysis(); + MA.SetInputData(NewTable); + MA.Is_BriefReport = true; + MA.CurrentScreening = CompleteScreening; + MA.Run(); - } + cDesignerTab SubDT = new cDesignerTab(); + foreach (var item in MA.GetOutPut()) + { + cViewerTable SubTable = new cViewerTable(); - public string GeneratePCADescriptor(cExtendPlateList PlatesToProcess, int NumberOfAxis, int NeutralClass) - { + SubTable.Title = "MINE - " + item.Name; + SubTable.SetInputData(item); + SubTable.Run(); + SubDT.SetInputData(SubTable.GetOutPut()); + } + SubDT.Title = TmpPlate.Name; + SubDT.Run(); + DT.SetInputData(SubDT.GetOutPut()); + } - int NumWell = 0; - int NumWellForLearning = 0; - foreach (cPlate CurrentPlate in PlatesToProcess) - { - NumWellForLearning += CurrentPlate.GetNumberOfWellOfClass(NeutralClass); - NumWell += CompleteScreening.GetCurrentDisplayPlate().GetNumberOfActiveWells(); - } + DT.Run(); + cDisplayToWindow TmpvD = new cDisplayToWindow(); - if (NumWellForLearning == 0) - { - MessageBox.Show("No well identified !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return null; + TmpvD.SetInputData(DT.GetOutPut()); + TmpvD.Title = "MINE analysis - " + CompleteScreening.ListPlatesActive.Count + " plates"; + TmpvD.Run(); + TmpvD.Display(); } - - int NumDesc = CompleteScreening.GetNumberOfActiveDescriptor(); - - if (NumDesc <= 1) + else if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - MessageBox.Show("More than one descriptor are required for this operation", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return null; - } + cPlate TmpPlate = CompleteScreening.GetCurrentDisplayPlate(); - double[,] DataForLDA = new double[NumWellForLearning, CompleteScreening.GetNumberOfActiveDescriptor() + 1]; + List ListWellsToProcess = new List(); + foreach (cWell item in TmpPlate.ListActiveWells) + { + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[item.GetClassIdx()] == 1) + ListWellsToProcess.Add(item); + } + } - // return; - Matrix EigenVectors = PCAComputation(DataForLDA, NumWellForLearning, NumWell, NumDesc, NeutralClass, PlatesToProcess); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + cMineAnalysis MA = new cMineAnalysis(); + MA.SetInputData(NewTable); + MA.Is_BriefReport = true; + MA.CurrentScreening = CompleteScreening; + MA.Run(); - string AxeName = ""; - int IDxDesc = 0; - //for (int Desc = 0; Desc < CompleteScreening.ListDescriptors.Count; Desc++) - //{ - // if (CompleteScreening.ListDescriptors[Desc].IsActive() == false) continue; + cDesignerTab SubDT = new cDesignerTab(); + foreach (var item in MA.GetOutPut()) + { + cViewerTable SubTable = new cViewerTable(); - // // AxeName += String.Format("{0:0.##}", EigenVectors.getElement(CompleteScreening.ListDescriptors.Count - 1, 0)) + "x" + CompleteScreening.ListDescriptorName[CompleteScreening.ListDescriptors.Count - 1]; - //} + SubTable.Title = "MINE - " + item.Name; + SubTable.SetInputData(item); + SubTable.Run(); - int OriginalDescNumber = CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; + SubDT.SetInputData(SubTable.GetOutPut()); + } + SubDT.Title = TmpPlate.Name; + SubDT.Run(); + cDisplayToWindow TmpvD = new cDisplayToWindow(); - for (int AxesIdx = 0; AxesIdx < NumberOfAxis; AxesIdx++) + TmpvD.SetInputData(SubDT.GetOutPut()); + TmpvD.Title = "MINE analysis - " + TmpPlate.Name + " : " + ListWellsToProcess.Count + " wells"; + TmpvD.Run(); + TmpvD.Display(); + } + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) { + List ListWellsToProcess = new List(); - //for (int Idx = 0; Idx < CompleteScreening.GlobalInfo.WindowHCSAnalyzer.checkedListBoxActiveDescriptors.Items.Count; Idx++) - //{ - - // if (CompleteScreening.ListDescriptors[Idx].IsActive()) - // if (CompleteScreening.ListDescriptors[Idx].GetBinNumber() == 1) - // { - // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc++, AxesIdx)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; - // } - // else - // { - // MessageBox.Show("Descriptor length not consistent (" + CompleteScreening.ListDescriptors[Idx].GetName() + " : " + CompleteScreening.ListDescriptors[Idx].GetBinNumber() + " bins", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - // return; - // } - // } - - //cDescriptorsType ColumnType = new cDescriptorsType(AxeName.Remove(AxeName.Length - 3), true, 1); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) + if (ListClassSelected[item.GetClassIdx()] == 1) ListWellsToProcess.Add(item); - cDescriptorsType ColumnType = new cDescriptorsType("PCA_" + (AxesIdx + 1), true, 1, GlobalInfo); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - CompleteScreening.ListDescriptors.AddNew(ColumnType); + cMineAnalysis MA = new cMineAnalysis(); + MA.SetInputData(NewTable); + MA.Is_BriefReport = true; + MA.CurrentScreening = CompleteScreening; + MA.Run(); - foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) + cDesignerTab SubDT = new cDesignerTab(); + foreach (var item in MA.GetOutPut()) { - foreach (cWell Tmpwell in TmpPlate.ListActiveWells) - { - List LDesc = new List(); + cViewerTable SubTable = new cViewerTable(); - double NewValue = 0; - IDxDesc = 0; - - // AxeName += "\nPCA_" + (AxesIdx + 1); - for (int Idx = 0; Idx < OriginalDescNumber - 1; Idx++) - { - if (CompleteScreening.ListDescriptors[Idx].IsActive()) - // AxeName += String.Format("{0:0.###}", EigenVectors.getElement(IDxDesc, AxesIdx)) + "x" + CompleteScreening.ListDescriptors[Idx].GetName() + " + "; - NewValue += EigenVectors.getElement(IDxDesc++, AxesIdx) * Tmpwell.ListDescriptors[Idx].GetValue(); - } + SubTable.Title = "MINE - " + item.Name; + SubTable.SetInputData(item); + SubTable.Run(); - cDescriptor NewDesc = new cDescriptor(NewValue, ColumnType, CompleteScreening); - LDesc.Add(NewDesc); - Tmpwell.AddDescriptors(LDesc); - } + SubDT.SetInputData(SubTable.GetOutPut()); } - } - CompleteScreening.ListDescriptors.UpDateDisplay(); - CompleteScreening.UpDatePlateListWithFullAvailablePlate(); - for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) - CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + SubDT.Run(); + + cDisplayToWindow TmpvD = new cDisplayToWindow(); - StartingUpDateUI(); + TmpvD.SetInputData(SubDT.GetOutPut()); + TmpvD.Title = "MINE analysis : " + ListWellsToProcess.Count + " wells"; + TmpvD.Run(); + TmpvD.Display(); + } - return AxeName; } - private void displayGraphToolStripMenuItem_Click_1(object sender, EventArgs e) + private void correlationMatrixToolStripMenuItem1_Click(object sender, EventArgs e) { - cExtendPlateList ListToProcess = new cExtendPlateList(); - ListToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); - ComputeAndDisplayLDA(ListToProcess); - } + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) + { + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - private void displayGraphToolStripMenuItem1_Click(object sender, EventArgs e) - { - ComputeAndDisplayLDA(CompleteScreening.ListPlatesActive); - } + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) + { + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - private void buttonNextPlate_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - if ((toolStripcomboBoxPlateList.SelectedIndex == -1) && (CompleteScreening.ListPlatesActive.Count > 1)) + if (ListClassSelected.Sum() < 1) { - toolStripcomboBoxPlateList.SelectedIndex = 1; return; + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - if (toolStripcomboBoxPlateList.SelectedIndex >= (toolStripcomboBoxPlateList.Items.Count - 1)) return; - toolStripcomboBoxPlateList.SelectedIndex++; - } - private void buttonPreviousPlate_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - if (toolStripcomboBoxPlateList.SelectedIndex <= 0) return; + cDesignerTab DT = new cDesignerTab(); - toolStripcomboBoxPlateList.SelectedIndex--; - } + if (this.ProcessModeplateByPlateToolStripMenuItem.Checked) + { + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + //ListWellsToProcess.AddRange(TmpPlate.ListActiveWells); + List ListWellsToProcess = new List(); + foreach (cWell item in TmpPlate.ListActiveWells) + { + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + } - private void distanceMatrixToolStripMenuItem_Click(object sender, EventArgs e) - { - cPlate CurrentPlate = CompleteScreening.ListPlatesActive[CompleteScreening.CurrentDisplayPlateIdx]; + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - //double[][] Values = new double[CurrentPlate.ListActiveWells.Count][]; + cCorrelationMatrix CM = new cCorrelationMatrix(); + CM.SetInputData(NewTable); + CM.Run(); - //for (int i = 0; i < Values.Length; i++) - // Values[i] = new double[CurrentPlate.ListActiveWells.Count]; + //cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + VHM.Title = "Correlation - " + TmpPlate.Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); + DT.SetInputData(VHM.GetOutPut()); + } + } + else if (this.ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + List ListWellsToProcess = new List(); - //for (int j = 0; j < Values.Length; j++) - //{ - // cWell SourceWell = CurrentPlate.ListActiveWells[j]; - // for (int i = j; i < Values[0].Length; i++) - // { - // cWell DestinationWell = CurrentPlate.ListActiveWells[i]; - // Values[i][j] = Values[j][i] = SourceWell.DistanceTo(DestinationWell, CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, eDistances.EUCLIDEAN); - // } - //} - FormToDisplayDistanceMap SingleMatrix = new FormToDisplayDistanceMap(CurrentPlate, CompleteScreening); - cWindowToDisplaySingleMatrix WindowForSingleArray = new cWindowToDisplaySingleMatrix(SingleMatrix, eDistances.EUCLIDEAN); - } + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + } - private void testImageToolStripMenuItem_Click(object sender, EventArgs e) - { + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); + cCorrelationMatrix CM = new cCorrelationMatrix(); + CM.SetInputData(NewTable); + CM.Run(); - CurrOpenFileDialog.Filter = "Tif files (*.tif)|*.tif"; + //cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + VHM.Title = "Correlation - Entire screening (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - DialogResult Res = CurrOpenFileDialog.ShowDialog(); - if (Res != DialogResult.OK) return; + DT.SetInputData(VHM.GetOutPut()); + } + else + { + List ListWellsToProcess = new List(); - cImage NewIm = new cImage(CurrOpenFileDialog.FileName); + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - cImageViewer NewView = new cImageViewer(); - NewView.SetImage(NewIm); - NewView.AddNotation(new ObjectForNotations.cString("This is a test", new Point(100, 100), Color.Red, 20)); + cCorrelationMatrix CM = new cCorrelationMatrix(); + CM.SetInputData(NewTable); + CM.Run(); - for (int Idx = 0; Idx < 120; Idx += 10) - NewView.AddNotation(new ObjectForNotations.cDisk(new Point(Idx * 10, Idx * 10), Color.FromArgb(Idx, Idx, 50), Idx)); + //cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + VHM.Title = "Correlation - " + CompleteScreening.GetCurrentDisplayPlate().Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - GlobalInfo.DisplayViewer(NewView); + DT.SetInputData(VHM.GetOutPut()); + } + + DT.Run(); + + // DT.SetInputData(VT.GetOutPut()); + + //cDesignerColumn DC = new cDesignerColumn(); + //DC.SetInputData(VHM.GetOutPut()); + //DC.SetInputData(VT.GetOutPut()); + //DC.Run(); + + //cDisplayDesigner DD = new cDisplayDesigner(); + // DD.SetInputData(VHM.GetOutPut()); + // DD.Run(); + + cDisplayToWindow vD = new cDisplayToWindow(); + vD.SetInputData(DT.GetOutPut()); + vD.Title = "Pearson Correlation"; + vD.Run(); + vD.Display(); + + //ComputeAndDisplayCorrelationMatrix(false, true, null); } - private void buttonDisplayWellsSelectionData_Click(object sender, EventArgs e) + private void ftestdescBasedToolStripMenuItem_Click(object sender, EventArgs e) { - DataTable FinalDataTable = new DataTable(); + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) + { + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + cDesignerTab DT = new cDesignerTab(); - //foreach (cWell TmpWell in GlobalInfo.ListSelectedWell) - for(int IdxWell =0;IdxWell ListWellsToProcess = new List(); + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - for (int IdxColumn = 0; IdxColumn < TmpTable.Columns.Count; IdxColumn++) - FinalDataTable.Rows[FinalDataTable.Rows.Count - 1][IdxColumn] = (double)TmpRow[IdxColumn]; - //FinalDataTable.Rows.Add(item); - } - } + CM.SetInputData(NewTable); + CM.Run(); + + cViewerHeatMap VHM = new cViewerHeatMap(); + VHM.SetInputData(CM.GetOutPut()); + VHM.IsDisplayValues = true; + VHM.Title = "F-Test - " + TmpPlate.Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); + + DT.SetInputData(VHM.GetOutPut()); } } + else if (this.ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + List ListWellsToProcess = new List(); - if (FinalDataTable == null) return; - FormForSingleCellsDisplay WindowForTable = new FormForSingleCellsDisplay(FinalDataTable, GlobalInfo); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell item in TmpPlate.ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); + } + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - for (int IdxCol = 0; IdxCol < FinalDataTable.Columns.Count ; IdxCol++) - { + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); + CM.Run(); - WindowForTable.comboBoxAxeX.Items.Add(FinalDataTable.Columns[IdxCol].ColumnName); - WindowForTable.comboBoxAxeY.Items.Add(FinalDataTable.Columns[IdxCol].ColumnName); + cViewerHeatMap VHM = new cViewerHeatMap(); + VHM.SetInputData(CM.GetOutPut()); + VHM.IsDisplayValues = true; + VHM.Title = "F-Test - Entire screening (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); + DT.SetInputData(VHM.GetOutPut()); } + else + { + List ListWellsToProcess = new List(); + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - WindowForTable.Text = GlobalInfo.ListSelectedWell.Count + " selected wells - " + FinalDataTable.Rows.Count + " points.";// Well.AssociatedPlate.Name + " [" + Well.GetPosX() + "x" + Well.GetPosY() + "]"; + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); + CM.Run(); - WindowForTable.Show(); - } + cViewerHeatMap VHM = new cViewerHeatMap(); + VHM.SetInputData(CM.GetOutPut()); + VHM.IsDisplayValues = true; + VHM.Title = "F-Test - " + CompleteScreening.GetCurrentDisplayPlate().Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - private void comboBoxClassForWellSelection_DrawItem(object sender, DrawItemEventArgs e) - { - e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); - e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); - e.Graphics.DrawString(comboBoxNeutralClassForClassif.Items[e.Index].ToString(), comboBoxNeutralClassForClassif.Font, - System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - e.DrawFocusRectangle(); + DT.SetInputData(VHM.GetOutPut()); + } + + DT.Run(); + cDisplayToWindow vD = new cDisplayToWindow(); + vD.SetInputData(DT.GetOutPut()); + vD.Title = "F-Test"; + vD.Run(); + vD.Display(); } - private void buttonToSelectWellsFromClass_Click(object sender, EventArgs e) + private void stackedHistogramsToolStripMenuItem_Click(object sender, EventArgs e) { - if (CompleteScreening == null) return; + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; - foreach (cWell TmpWell in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + + if (ListClassSelected.Sum() < 1) + { + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + cDisplayToWindow CDW1 = new cDisplayToWindow(); + + + if ((ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) || (ProcessModeEntireScreeningToolStripMenuItem.Checked)) { - if (TmpWell.GetClass() == comboBoxClassForWellSelection.SelectedIndex) + cListWell ListWellsToProcess = new cListWell(null); + List PlateList = new List(); + + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + PlateList.Add(CompleteScreening.GetCurrentDisplayPlate()); + else { - listBoxSelectedWells.Items.Add(CompleteScreening.GetCurrentDisplayPlate().Name + " : " + TmpWell.GetPosX() + "x" + TmpWell.GetPosY()); - GlobalInfo.ListSelectedWell.Add(TmpWell); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) PlateList.Add(TmpPlate); } - } - } - private void clearToolStripMenuItem_Click_1(object sender, EventArgs e) - { - listBoxSelectedWells.Items.Clear(); - GlobalInfo.ListSelectedWell.Clear(); - } + foreach (cPlate TmpPlate in PlateList) + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - private void cellBasedClassificationTreeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening.CellBasedClassification.J48Model == null) return; - CompleteScreening.CellBasedClassification.DisplayTree(GlobalInfo).Show(); - } - private void button_Trees_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + CDW1.Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Stacked Histogram (" + PlateList[0].Name + ")"; + else + CDW1.Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - Stacked Histogram - " + PlateList.Count + " plates"; - FormForClassificationTree WindowForTree = new FormForClassificationTree(); + cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable.Name = CDW1.Title; - WindowForTree.Text = CompleteScreening.GetCurrentDisplayPlate().Name; - string StringForTree = CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().StringForTree; - if ((StringForTree == null) || (StringForTree.Length == 0)) - { - MessageBox.Show("No tree avaliable for the selected plate !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + CV1.SetInputData(NewTable); + CV1.Chart.LabelAxisX = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV1.Run(); + + CDW1.SetInputData(CV1.GetOutPut()); } - WindowForTree.gViewerForTreeClassif.Graph = ComputeAndDisplayGraph(StringForTree.Remove(StringForTree.Length - 3, 3)); + else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + { + cDesignerTab CDT = new cDesignerTab(); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + cListWell ListWellsToProcess = new cListWell(null); + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - WindowForTree.richTextBoxConsoleForClassification.Clear(); - WindowForTree.richTextBoxConsoleForClassification.AppendText(CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().StringForQuality); - WindowForTree.richTextBoxConsoleForClassification.AppendText(CompleteScreening.GetCurrentDisplayPlate().GetInfoClassif().ConfusionMatrix); + cExtendedTable NewTable = ListWellsToProcess.GetDescriptorValues(CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx, true); + NewTable.Name = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName() + " - " + TmpPlate.Name; - WindowForTree.Show(); - } - private void comboBoxClass_DrawItem_1(object sender, DrawItemEventArgs e) - { - e.DrawBackground(); + cViewerStackedHistogram CV1 = new cViewerStackedHistogram(); + CV1.SetInputData(NewTable); + CV1.Chart.LabelAxisX = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + CV1.Title = TmpPlate.Name; + CV1.Run(); - if (e.Index > 0) - { - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index - 1)); - e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); + CDT.SetInputData(CV1.GetOutPut()); + } + CDT.Run(); + CDW1.SetInputData(CDT.GetOutPut()); + CDW1.Title = "Stacked Histogram - " + CompleteScreening.ListPlatesActive.Count + " plates"; } - e.Graphics.DrawString(comboBoxClass.Items[e.Index].ToString(), comboBoxClass.Font, - System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - e.DrawFocusRectangle(); + + CDW1.Run(); + CDW1.Display(); } - private void classesDistributionToolStripMenuItem_Click(object sender, EventArgs e) + private void testLinearRegressionToolStripMenuItem_Click(object sender, EventArgs e) { - FormForPie WindowForClassesDistribution = new FormForPie(); - WindowForClassesDistribution.Text = "Classes Distributions"; + List ListWellsToProcess = new List(); - int[] ListClasses = CompleteScreening.GetClassPopulation(); + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (item.GetClassIdx() != -1) ListWellsToProcess.Add(item); - Series CurrentSeries = WindowForClassesDistribution.chartForPie.Series[0]; + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - int NumberOfWells = CompleteScreening.GetNumberOfActiveWells(); - int IdxPt = 0; - // CurrentSeries.CustomProperties = "PieLabelStyle=Outside"; - for (int Idx = 0; Idx < ListClasses.Length; Idx++) - { + cLinearRegression LR = new cLinearRegression(); + LR.SetInputData(NewTable); + LR.Run(); - if (ListClasses[Idx] == 0) - { - continue; - } - CurrentSeries.Points.Add(ListClasses[Idx]); - CurrentSeries.Points[IdxPt].Color = GlobalInfo.GetColor(Idx); - CurrentSeries.Points[IdxPt].Label = String.Format("{0:0.###}", ((100.0 * ListClasses[Idx]) / NumberOfWells)) + " %"; - CurrentSeries.Points[IdxPt].LegendText = "Class " + Idx; - CurrentSeries.Points[IdxPt].ToolTip = ListClasses[Idx] + " / " + NumberOfWells; - IdxPt++; - } + cViewerTable VT = new cViewerTable(); + VT.SetInputData(LR.GetOutPut()); + VT.Run(); - WindowForClassesDistribution.Show(); - } - private void hierarchicalTreeToolStripMenuItem_Click(object sender, EventArgs e) - { - FormForHierarchical WindowHierarchical = new FormForHierarchical(this.GlobalInfo); - WindowHierarchical.richTextBoxWarning.AppendText("Warning:\nHierarchical tree visualization is not adpated for large number of experiments !\nIt can rapidly generate out-of-memory exception!"); + cDisplayToWindow vD = new cDisplayToWindow(); + vD.SetInputData(VT.GetOutPut()); + vD.Title = "Linear regression (Test)"; + vD.Run(); + vD.Display(); - System.Windows.Forms.DialogResult Res = WindowHierarchical.ShowDialog();// MessageBox.Show("Hierarchical tree is not adpated for large number of experiments !\n It can rapidly generate out-of-memory exception!\n Proceed anyway ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (Res != System.Windows.Forms.DialogResult.OK) return; - cDendoGram DendoGram = new cDendoGram(GlobalInfo, WindowHierarchical.radioButtonFullScreen.Checked); - return; } - private void extractPhenotypesOfInterestToolStripMenuItem_Click(object sender, EventArgs e) + private void covarianceMatrixToolStripMenuItem_Click(object sender, EventArgs e) { - if (CompleteScreening == null) return; - - FormClassification WindowClassification = new FormClassification(CompleteScreening); - WindowClassification.label1.Text = "Class"; - WindowClassification.Text = "Phenotypes of Interest"; - WindowClassification.buttonClassification.Text = "Display"; - - if (WindowClassification.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - int SelectedClass = WindowClassification.comboBoxForNeutralClass.SelectedIndex; + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) + { + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - List ListDescName = new List(); - ListDescName.Add("Idx"); - ListDescName.Add("Plate"); - ListDescName.Add("Pos X"); - ListDescName.Add("Pos Y"); + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; - ListDescName.AddRange(CompleteScreening.ListDescriptors.GetListNameActives()); + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + if (ListClassSelected.Sum() < 1) + { + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + cDisplayToWindow vD = new cDisplayToWindow(); + cDesignerTab DT = new cDesignerTab(); - List ListValues = new List(); - int Idx = 0; + cCovarianceMatrix CM = new cCovarianceMatrix(); + // CM.FTestTails = eFTestTails.BOTH; - foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + if (this.ProcessModeplateByPlateToolStripMenuItem.Checked) { - foreach (cWell TmpWell in TmpPlate.ListActiveWells) + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) { - if (TmpWell.GetClass() == SelectedClass) - { - List LValues = new List(); - LValues.Add(Idx.ToString()); - LValues.Add(TmpPlate.Name); - LValues.Add(TmpWell.GetPosX().ToString()); - LValues.Add(TmpWell.GetPosY().ToString()); + List ListWellsToProcess = new List(); + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - for (int IdxDesc = 0; IdxDesc < CompleteScreening.ListDescriptors.Count; IdxDesc++) - { - if (CompleteScreening.ListDescriptors[IdxDesc].IsActive()) - { - double Value = TmpWell.GetAverageValuesList(false)[IdxDesc]; - LValues.Add(Value.ToString()); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - } - } + CM.SetInputData(NewTable); + CM.Run(); - ListValues.Add(LValues.ToArray()); + //cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + vD.Title = "Covariance - " + TmpPlate.Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - Idx++; - } + DT.SetInputData(VHM.GetOutPut()); } - } - cDisplayTable WindowDisplayTable = new cDisplayTable("Phenotypes of Interest. Class " + SelectedClass, ListDescName.ToArray(), ListValues, GlobalInfo, false); - WindowDisplayTable.Show(); + else if (this.ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + List ListWellsToProcess = new List(); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + } + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - } + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); + CM.Run(); - private void plateViewToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - List ListPlates = new List(); + // cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + vD.Title = "Covariance - Entire screening (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) - { - ListPlates.Add(new FormToDisplayPlate(CurrentPlate, CompleteScreening)); + DT.SetInputData(VHM.GetOutPut()); } + else + { + List ListWellsToProcess = new List(); - cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(), 6); - - WindowToDisplayArray.Show(); - } - - private void descriptorViewToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - CompleteScreening.GetCurrentDisplayPlate().DisplayDescriptorsWindow(); - } - + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - private void ThreeDVisualizationToolStripMenuItem_Click(object sender, EventArgs e) - { - GlobalInfo._Is3DVisualization = ThreeDVisualizationToolStripMenuItem.Checked; + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); + CM.Run(); - if (!ThreeDVisualizationToolStripMenuItem.Checked) - CompleteScreening.Close3DView(); - // if (ThreeDVisualizationToolStripMenuItem.Checked == true) - { + //cViewerHeatMap VHM = new cViewerHeatMap(); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CM.GetOutPut()); + //VHM.IsDisplayValues = true; + vD.Title = "Covariance - " + CompleteScreening.GetCurrentDisplayPlate().Name + " (" + ListWellsToProcess.Count + " wells)"; + VHM.Run(); - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + DT.SetInputData(VHM.GetOutPut()); } + DT.Run(); + + vD.SetInputData(DT.GetOutPut()); + // vD.Title = "F-Test"; + vD.Run(); + vD.Display(); } - private void generateHitsDistributionMapToolStripMenuItem_Click(object sender, EventArgs e) + private void mahalanobisDistanceToolStripMenuItem_Click(object sender, EventArgs e) { + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + //GUI_ListClasses. = true; + GUI_ListClasses.Title = "Reference cloud"; - if (CompleteScreening == null) return; - List ListPlates = new List(); - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + + if (ListClassSelected.Sum() < 1) { - ListPlates.Add(new FormToDisplayPlate(CurrentPlate, CompleteScreening)); + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - cWindowToDisplayEntireScreening WindowToDisplayArray = new cWindowToDisplayEntireScreening(ListPlates, CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(), 6); - WindowToDisplayArray.checkBoxDisplayClasses.Checked = true; - WindowToDisplayArray.Text = "Generate Hits Distribution Maps"; - - WindowToDisplayArray.Show(); - - - System.Windows.Forms.DialogResult ResWin = MessageBox.Show("By applying this process, the current screening will be entirely updated ! Proceed ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (ResWin == System.Windows.Forms.DialogResult.No) + // start by computing the inversed covariance matrix + if (checkedListBoxActiveDescriptors.CheckedItems.Count <= 1) { - WindowToDisplayArray.Close(); + MessageBox.Show("At least two descriptors have to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - WindowToDisplayArray.Close(); - if (CompleteScreening != null) CompleteScreening.Close3DView(); - // CompleteScreening.ListDescriptors.RemoveDesc(CompleteScreening.ListDescriptors[IntToTransfer], CompleteScreening); - cScreening MergedScreening = new cScreening("Class Screen", GlobalInfo); - MergedScreening.PanelForPlate = this.panelForPlate; + cCovarianceMatrix CM = new cCovarianceMatrix(); + // CM.FTestTails = eFTestTails.BOTH; - MergedScreening.Rows = CompleteScreening.Rows; - MergedScreening.Columns = CompleteScreening.Columns; - MergedScreening.ListPlatesAvailable = new cExtendPlateList(); + cExtendedTable NewTable = null; - // create the descriptor - MergedScreening.ListDescriptors.Clean(); + if (this.ProcessModeplateByPlateToolStripMenuItem.Checked) + { + //foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + //{ + // List ListWellsToProcess = new List(); + // foreach (cWell item in TmpPlate.ListActiveWells) + // if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - List ListDescType = new List(); - List Values = new List(); + // cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); - for (int i = 0; i < GlobalInfo.GetNumberofDefinedClass(); i++) + // CM.SetInputData(NewTable); + //} + } + else if (this.ProcessModeEntireScreeningToolStripMenuItem.Checked) { - cDescriptorsType DescClass = new cDescriptorsType("Class_" + i, true, 1, GlobalInfo); - ListDescType.Add(DescClass); - MergedScreening.ListDescriptors.AddNew(DescClass); + List ListWellsToProcess = new List(); - int[][] TMpVal = new int[MergedScreening.Columns][]; - for (int ii = 0; ii < MergedScreening.Columns; ii++) - TMpVal[ii] = new int[MergedScreening.Rows]; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - Values.Add(TMpVal); + NewTable = new cExtendedTable(ListWellsToProcess, true); + + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); } + else + { + List ListWellsToProcess = new List(); - MergedScreening.ListDescriptors.CurrentSelectedDescriptor = 0; + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) - { - foreach (cWell TmpWell in CurrentPlate.ListActiveWells) - { - int Class = TmpWell.GetClass(); - if (Class >= 0) - Values[Class][TmpWell.GetPosX() - 1][TmpWell.GetPosY() - 1]++; - } + NewTable = new cExtendedTable(ListWellsToProcess, true); + + // cTwoSampleFTest CM = new cTwoSampleFTest(); + CM.SetInputData(NewTable); } - cPlate NewPlate = new cPlate("Cpds", CompleteScreening.Name, MergedScreening); + CM.Run(); - for (int X = 0; X < CompleteScreening.Columns; X++) - for (int Y = 0; Y < CompleteScreening.Rows; Y++) - { - List LDesc = new List(); - for (int i = 0; i < GlobalInfo.GetNumberofDefinedClass(); i++) - { - cDescriptor Desc = new cDescriptor(Values[i][X][Y], ListDescType[i], CompleteScreening); - LDesc.Add(Desc); + cInverse cI = new cInverse(); + cI.SetInputData(CM.GetOutPut()); + cI.Run(); - } - cWell NewWell = new cWell(LDesc, X + 1, Y + 1, MergedScreening, NewPlate); - NewWell.Name = "Well [" + (X + 1) + ":" + (Y + 1) + "]"; - NewPlate.AddWell(NewWell); + // get the cloud center + cStatistics cstat = new cStatistics(); + cstat.IsMean = true; + cstat.IsMAD = false; + cstat.IsMax = false; + cstat.IsMedian = false; + cstat.IsStdDev = false; + cstat.IsSum = false; + cstat.SetInputData(NewTable); + cstat.Run(); - } + if (cstat.GetOutPut() == null) return; - // check if the plate exist already - MergedScreening.AddPlate(NewPlate); - MergedScreening.ListPlatesActive = new cExtendPlateList(); + cExtendedList ListMeans = cstat.GetOutPut().GetRow(0); - MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Clear(); + cDescriptorsType MahalanobisType = new cDescriptorsType("Mahalanobis Distance", true, 1, GlobalInfo); - for (int i = 0; i < MergedScreening.ListPlatesAvailable.Count; i++) + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesAvailable) { - MergedScreening.ListPlatesActive.Add(MergedScreening.ListPlatesAvailable[i]); - MergedScreening.GlobalInfo.WindowHCSAnalyzer.toolStripcomboBoxPlateList.Items.Add(NewPlate.Name); + for (int Col = 0; Col < CompleteScreening.Columns; Col++) + for (int Row = 0; Row < CompleteScreening.Rows; Row++) + { + cWell TmpWell = TmpPlate.GetWell(Col, Row, false); + if (TmpWell == null) continue; + + double Value = TmpWell.GetAverageValuesList(true).Dist_Mahalanobis(ListMeans, cI.GetOutPut()); + + List LDesc = new List(); + + cDescriptor NewDesc = new cDescriptor(Value, MahalanobisType, CompleteScreening); + LDesc.Add(NewDesc); + + TmpWell.AddDescriptors(LDesc); + } } - CompleteScreening.ListDescriptors = MergedScreening.ListDescriptors; - CompleteScreening.ListPlatesAvailable = MergedScreening.ListPlatesAvailable; - CompleteScreening.ListPlatesActive = MergedScreening.ListPlatesActive; + CompleteScreening.ListDescriptors.AddNew(MahalanobisType); + CompleteScreening.ListDescriptors.UpDateDisplay(); CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + } - CompleteScreening.CurrentDisplayPlateIdx = 0; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, true); + private void pCAToolStripMenuItem1_Click(object sender, EventArgs e) + { + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - ListPlates = new List(); - for (int DescIdx = 0; DescIdx < CompleteScreening.ListDescriptors.Count; DescIdx++) + cDisplayToWindow vD = new cDisplayToWindow(); + + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - if (CompleteScreening.ListDescriptors[DescIdx].IsActive()) - ListPlates.Add(new FormToDisplayDescriptorPlate(CompleteScreening.GetCurrentDisplayPlate(), CompleteScreening, DescIdx)); - } + cPlate TmpPlate = CompleteScreening.GetCurrentDisplayPlate(); + List ListWellsToProcess = new List(); + // cExtendedList ListClasses = new cExtendedList(); + // ListClasses.Name = "Classes"; + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - cWindowToDisplayEntireDescriptors WindowToDisplayDesc = new cWindowToDisplayEntireDescriptors(ListPlates, CompleteScreening.GetCurrentDisplayPlate().Name, GlobalInfo.GetNumberofDefinedClass()); - WindowToDisplayDesc.checkBoxGlobalNormalization.Checked = true; + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + // NewTable.Add(ListClasses); - WindowToDisplayDesc.Show(); + cProjectorPCA PCA = new cProjectorPCA(); + PCA.SetInputData(NewTable); + cFeedBackMessage FM = PCA.Run(); + if (!FM.IsSucceed) + { + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - } + cViewerTable VHM = new cViewerTable(); + cExtendedTable CT = PCA.GetOutPut(); - private void generateDBFromCSVToolStripMenuItem_Click(object sender, EventArgs e) - { - OpenFileDialog CurrOpenFileDialog = new OpenFileDialog(); - CurrOpenFileDialog.Filter = "csv files (*.csv)|*.csv";//|db files (*.db)|*.db|nc files (*.nc)|*.nc - CurrOpenFileDialog.Multiselect = false; + foreach (var item in CT) + { + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); + item.Tag = DLC; + } - DialogResult Res = CurrOpenFileDialog.ShowDialog(); - if (Res != DialogResult.OK) return; + VHM.SetInputData(CT); + VHM.Run(); - FormForImportExcel CSVWindow = CellByCellFromCSV(CurrOpenFileDialog.FileNames[0]); + vD.SetInputData(VHM.GetOutPut()); + vD.Title = "PCA - " + TmpPlate.Name + " : " + ListWellsToProcess.Count + " wells"; + } + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + List ListWellsToProcess = new List(); + // cExtendedList ListClasses = new cExtendedList(); + // ListClasses.Name = "Classes"; - if (CSVWindow == null) return; - if (CSVWindow.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - if (CompleteScreening != null) CompleteScreening.Close3DView(); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + //NewTable.Add(ListClasses); + cProjectorPCA PCA = new cProjectorPCA(); + PCA.SetInputData(NewTable); + cFeedBackMessage FM = PCA.Run(); + if (!FM.IsSucceed) + { + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - FolderBrowserDialog WorkingFolderDialog = new FolderBrowserDialog(); - WorkingFolderDialog.ShowNewFolderButton = true; - WorkingFolderDialog.Description = "Select the working directory"; - if (WorkingFolderDialog.ShowDialog() != DialogResult.OK) return; + cViewerTable VHM = new cViewerTable(); + cExtendedTable CT = PCA.GetOutPut(); + foreach (var item in CT) + { + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); + item.Tag = DLC; + } - //if (IsFileUsed(CurrOpenFileDialog.FileNames[0])) - //{ - // MessageBox.Show("File currently used by another application.\n", "Loading error !", MessageBoxButtons.OK, MessageBoxIcon.Error); - // return; - //} + VHM.SetInputData(CT); + //VHM.SetInputData(PCA.GetOutPut()); + VHM.Run(); - //Microsoft.Research.Science.Data.DataSet Datacsv = Microsoft.Research.Science.Data.CSV.CsvDataSet.Open(CurrOpenFileDialog.FileNames[0]); + vD.SetInputData(VHM.GetOutPut()); + vD.Title = "PCA - " + ListWellsToProcess.Count + " wells."; + } + else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + { + cDesignerTab CDT = new cDesignerTab(); - //int NumDesc = Datacsv.Variables.Count; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + List ListWellsToProcess = new List(); + //cExtendedList ListClasses = new cExtendedList(); + //ListClasses.Name = "Classes"; - //for (int IdxDesc = 0; IdxDesc < NumDesc; IdxDesc++) - //{ - // var DescInfo = Datacsv.Variables[IdxDesc]; - // string NameDesc = DescInfo.Name; + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) ListWellsToProcess.Add(item); - // var TypeData = DescInfo.TypeOfData; - // string DataName = TypeData.Name; - //} + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + //NewTable.Add(ListClasses); + NewTable.Name = TmpPlate.Name; + cProjectorPCA PCA = new cProjectorPCA(); + PCA.SetInputData(NewTable); + cFeedBackMessage FM = PCA.Run(); + if (!FM.IsSucceed) + { + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - int NumPlateName = 0; - int NumRow = 0; - int NumCol = 0; - int NumWellPos = 0; - // int NumLocusID = 0; - // int NumConcentration = 0; - // int NumName = 0; - // int NumInfo = 0; - // int NumClass = 0; + cViewerTable VHM = new cViewerTable(); + cExtendedTable CT = PCA.GetOutPut(); - int numDescritpor = 0; + foreach (var item in CT) + { + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); + item.Tag = DLC; + } - for (int i = 0; i < CSVWindow.dataGridViewForImport.Rows.Count; i++) - { - string CurrentVal = CSVWindow.dataGridViewForImport.Rows[i].Cells[2].Value.ToString(); - if ((CurrentVal == "Plate name") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) - NumPlateName++; - if ((CurrentVal == "Row") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) - NumRow++; - if ((CurrentVal == "Column") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) - NumCol++; - if ((CurrentVal == "Well position") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) - NumWellPos++; - if ((CurrentVal == "Descriptor") && ((bool)CSVWindow.dataGridViewForImport.Rows[i].Cells[1].Value)) - numDescritpor++; - } + VHM.SetInputData(CT); - if (NumPlateName != 1) - { - MessageBox.Show("One and only one \"Plate Name\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - if ((NumRow != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeDouble.Checked == true)) - { - MessageBox.Show("One and only one \"Row\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - if ((NumCol != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeDouble.Checked == true)) - { - MessageBox.Show("One and only one \"Column\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + //VHM.SetInputData(PCA.GetOutPut()); + VHM.Run(); + CDT.SetInputData(VHM.GetOutPut()); + } + CDT.Run(); + vD.SetInputData(CDT.GetOutPut()); } - if ((NumWellPos != 1) && (GlobalInfo.OptionsWindow.radioButtonWellPosModeSingle.Checked == true)) - { - MessageBox.Show("One and only one \"Well position\" has to be selected", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + else return; - } - if ((numDescritpor < 1) && (CSVWindow.IsImportCSV)) + vD.Run(); + vD.Display(); + } + + private void lDAToolStripMenuItem_Click(object sender, EventArgs e) + { + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); + + if (ListClassSelected.Sum() < 2) { - MessageBox.Show("You need to select at least one \"Descriptor\" !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("At least two classes have to be selected to perfom a LDA.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - int Mode = 2; - if (GlobalInfo.OptionsWindow.radioButtonWellPosModeSingle.Checked) Mode = 1; - CsvFileReader CSVsr = new CsvFileReader(CurrOpenFileDialog.FileNames[0]); + cDisplayToWindow vD = new cDisplayToWindow(); - CsvRow OriginalNames = new CsvRow(); - if (!CSVsr.ReadRow(OriginalNames)) + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - CSVsr.Close(); - return; - } + cPlate TmpPlate = CompleteScreening.GetCurrentDisplayPlate(); + List ListWellsToProcess = new List(); + cExtendedList ListClasses = new cExtendedList(); + ListClasses.Name = "Classes"; + foreach (cWell item in TmpPlate.ListActiveWells) + if ((item.GetClassIdx() != -1) && (ListClassSelected[item.GetClassIdx()] == 1)) + { + ListWellsToProcess.Add(item); + ListClasses.Add(item.GetClassIdx()); + } - int ColPlateName = GetColIdxFor("Plate name", CSVWindow); - int ColCol = GetColIdxFor("Column", CSVWindow); - int ColRow = GetColIdxFor("Row", CSVWindow); - int ColWellPos = GetColIdxFor("Well position", CSVWindow); - int[] ColsForDescriptors = GetColsIdxFor("Descriptor", CSVWindow); + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + NewTable.Add(ListClasses); - int WellLoaded = 0; - int FailToLoad = 0; + cProjectorLDA LDA = new cProjectorLDA(); + LDA.SetInputData(NewTable); + cFeedBackMessage FM = LDA.Run(); + if (!FM.IsSucceed) + { + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + cViewerTable VHM = new cViewerTable(); + cExtendedTable CT = LDA.GetOutPut(); - // CompleteScreening.Columns = (int)CSVWindow.numericUpDownColumns.Value; - // CompleteScreening.Rows = (int)CSVWindow.numericUpDownRows.Value; - // CompleteScreening.ListDescriptors.Clean(); + foreach (var item in CT) + { + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); + item.Tag = DLC; + } + VHM.SetInputData(CT); + VHM.Run(); - FormForProgress ProgressWindow = new FormForProgress(); - ProgressWindow.Show(); - CsvRow CurrentDesc = new CsvRow(); - if (CSVsr.ReadRow(CurrentDesc) == false) return; - do + vD.SetInputData(VHM.GetOutPut()); + vD.Title = "LDA - " + TmpPlate.Name + " : " + ListWellsToProcess.Count + " wells"; + } + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) { + List ListWellsToProcess = new List(); + cExtendedList ListClasses = new cExtendedList(); + ListClasses.Name = "Classes"; - string OriginalPlatePlateName = CurrentDesc[ColPlateName]; - string CurrentPlateName = CurrentDesc[ColPlateName]; - string ConvertedName = ""; + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + foreach (cWell item in TmpPlate.ListActiveWells) + { + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[item.GetClassIdx()] == 1) + { + ListWellsToProcess.Add(item); + ListClasses.Add(item.GetClassIdx()); + } + } + } + } - foreach (var c in System.IO.Path.GetInvalidFileNameChars()) + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + NewTable.Add(ListClasses); + cProjectorLDA LDA = new cProjectorLDA(); + LDA.SetInputData(NewTable); + cFeedBackMessage FM = LDA.Run(); + if (!FM.IsSucceed) { - ConvertedName = OriginalPlatePlateName.Replace(c, '-'); + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + cExtendedTable CT = LDA.GetOutPut(); - List ListNameSignature = new List(); + foreach (var item in CT) + { + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); + + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); + + item.Tag = DLC; + } - for (int idxDesc = Mode + 1; idxDesc < ColsForDescriptors.Length + Mode + 1; idxDesc++) - ListNameSignature.Add(OriginalNames[idxDesc]); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CT); + + VHM.Run(); + + vD.SetInputData(VHM.GetOutPut()); + vD.Title = "LDA - " + ListWellsToProcess.Count + " wells."; + } + else if (ProcessModeplateByPlateToolStripMenuItem.Checked) + { + cDesignerTab CDT = new cDesignerTab(); - cSQLiteDatabase SQDB = new cSQLiteDatabase(WorkingFolderDialog.SelectedPath + "\\" + ConvertedName, ListNameSignature, true); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + { + List ListWellsToProcess = new List(); + cExtendedList ListClasses = new cExtendedList(); + ListClasses.Name = "Classes"; - do - { - string OriginalWellPos = CurrentDesc[ColWellPos]; - string CurrentWellPos = OriginalWellPos; - int[] Pos = new int[2]; - if (Mode == 1) + foreach (cWell item in TmpPlate.ListActiveWells) { - Pos = ConvertPosition(CurrentDesc[ColWellPos]); - if (Pos == null) + if (item.GetClassIdx() != -1) { - if (MessageBox.Show("Error in converting the current well position.\nGo to Edit->Options->Import-Export->Well Position Mode to fix this.\nDo you want continue ?", "Loading error !", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.No) + if (ListClassSelected[item.GetClassIdx()] == 1) { - CSVsr.Close(); - return; + ListWellsToProcess.Add(item); + ListClasses.Add(item.GetClassIdx()); } - //else - // goto NEXTLOOP; } - } - else + + cExtendedTable NewTable = new cExtendedTable(ListWellsToProcess, true); + NewTable.Add(ListClasses); + NewTable.Name = TmpPlate.Name; + + cProjectorLDA LDA = new cProjectorLDA(); + LDA.SetInputData(NewTable); + cFeedBackMessage FM = LDA.Run(); + if (!FM.IsSucceed) { - //if (int.TryParse(CurrentDesc[ColCol], out Pos[0]) == false) - // // goto NEXTLOOP; - //if (int.TryParse(CurrentDesc[ColRow], out Pos[1]) == false) - // goto NEXTLOOP; + MessageBox.Show(FM.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - cWellForDatabase WellForDB = new cWellForDatabase(OriginalPlatePlateName, Pos[0], Pos[1]); - List> ListData = new List>(); - // for (int idxDesc = 0; idxDesc < ColsForDescriptors.Length; idxDesc++) - // ListData[idxDesc] = new List(); - ProgressWindow.label.Text = OriginalWellPos; - ProgressWindow.label.Refresh(); + cExtendedTable CT = LDA.GetOutPut(); - do + foreach (var item in CT) { - // CurrentWellPos = CurrentDesc[ColWellPos]; - List Signature = new List(); + cDescriptorsLinearCombination DLC = new cDescriptorsLinearCombination(item, CompleteScreening.GlobalInfo); - for (int idxDesc = 0; idxDesc < ColsForDescriptors.Length; idxDesc++) - { - double Value; - if ((double.TryParse(CurrentDesc[ColsForDescriptors[idxDesc]], out Value)) && (!double.IsNaN(Value))) - { - //cDescriptor CurrentDescriptor = new cDescriptor(Value, CompleteScreening.ListDescriptors[idxDesc/* + ShiftIdx*/], CompleteScreening); - Signature.Add(Value); - } - /*else - { - FailToLoad++; - goto NEXTLOOP; - }*/ - } + foreach (cDescriptorsType Desc in item.ListTags) + DLC.Add(Desc); - ListData.Add(Signature); + item.Tag = DLC; + } - // WellForDB.AddSignature(Signature); + cViewerTable VHM = new cViewerTable(); + VHM.SetInputData(CT); + VHM.Run(); + CDT.SetInputData(VHM.GetOutPut()); + } + CDT.Run(); + vD.SetInputData(CDT.GetOutPut()); + } + else + return; - if (CSVsr.ReadRow(CurrentDesc) == false) - { - WellForDB.AddListSignatures(ListData); - SQDB.AddNewWell(WellForDB); - SQDB.CloseConnection(); - goto NEXTLOOP; - } - CurrentPlateName = CurrentDesc[ColPlateName]; - CurrentWellPos = CurrentDesc[ColWellPos]; - } while (CurrentWellPos == OriginalWellPos); + vD.Run(); + vD.Display(); + } - WellForDB.AddListSignatures(ListData); - SQDB.AddNewWell(WellForDB); + private void testMultiScatterToolStripMenuItem_Click(object sender, EventArgs e) + { + //V1D.Chart.LabelAxisX = "Well Index"; + //V1D.Chart.LabelAxisY = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptor].GetName(); + //V1D.Chart.BackgroundColor = Color.LightYellow; + //V1D.Chart.IsXAxis = true; - } while (OriginalPlatePlateName == CurrentPlateName); - SQDB.CloseConnection(); - } while (true); + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedList ListClassSelected = GUI_ListClasses.GetOutPut(); - NEXTLOOP: ; - ProgressWindow.Close(); + if (ListClassSelected.Sum() < 1) + { + MessageBox.Show("At least one classe has to be selected.", "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } - FormForPlateDimensions PlateDim = new FormForPlateDimensions(); - PlateDim.Text = "Load generated screening"; - PlateDim.checkBoxAddCellNumber.Visible = true; - PlateDim.checkBoxIsOmitFirstColumn.Visible = true; - PlateDim.labelHisto.Visible = true; - PlateDim.numericUpDownHistoSize.Visible = true; + cDesignerSplitter CDC = new cDesignerSplitter(); + List ListWellsToProcess = new List(); - if (PlateDim.ShowDialog() != System.Windows.Forms.DialogResult.OK) - return; - LoadCellByCellDB(PlateDim, WorkingFolderDialog.SelectedPath); - } + //foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + foreach (cWell item in CompleteScreening.GetCurrentDisplayPlate().ListActiveWells) + if (item.GetClassIdx() != -1) + if (ListClassSelected[item.GetClassIdx()] == 1) ListWellsToProcess.Add(item); + cExtendedTable DataFromPlate = new cExtendedTable(ListWellsToProcess, true); + DataFromPlate.Name = CompleteScreening.GetCurrentDisplayPlate().Name; + //if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + { - private void loadDBToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening != null) CompleteScreening.Close3DView(); - FolderBrowserDialog OpenFolderDialog = new FolderBrowserDialog(); + for (int IdxDesc0 = 0; IdxDesc0 < DataFromPlate.Count; IdxDesc0++) + for (int IdxDesc1 = 1; IdxDesc1 < DataFromPlate.Count; IdxDesc1++) + { - if (OpenFolderDialog.ShowDialog() != DialogResult.OK) return; - string Path = OpenFolderDialog.SelectedPath; + cViewer2DScatterPoint V1D = new cViewer2DScatterPoint(); + V1D.Chart.CurrentTitle.Tag = CompleteScreening.GetCurrentDisplayPlate(); + V1D.Chart.IdxDesc0 = IdxDesc0; + V1D.Chart.IdxDesc1 = IdxDesc1; + V1D.SetInputData(DataFromPlate); + V1D.Run(); + V1D.Chart.Width = 0; + V1D.Chart.Height = 0; - FormForPlateDimensions PlateDim = new FormForPlateDimensions(); - PlateDim.checkBoxAddCellNumber.Visible = true; - PlateDim.checkBoxIsOmitFirstColumn.Visible = true; - PlateDim.labelHisto.Visible = true; - PlateDim.numericUpDownHistoSize.Visible = true; + cDesignerSinglePanel Designer0 = new cDesignerSinglePanel(); + Designer0.SetInputData(V1D.GetOutPut()); + Designer0.Run(); - if (PlateDim.ShowDialog() != System.Windows.Forms.DialogResult.OK) - return; - LoadCellByCellDB(PlateDim, Path); - } + CDC.SetInputData(Designer0.GetOutPut()); + } + } - private void classViewToolStripMenuItem_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; + CDC.Run(); - checkBoxDisplayClasses.Checked = classViewToolStripMenuItem.Checked; + cDisplayToWindow Disp0 = new cDisplayToWindow(); + Disp0.SetInputData(CDC.GetOutPut()); + Disp0.Title = "2D Scatter points graph - wells."; + if (!Disp0.Run().IsSucceed) return; + Disp0.Display(); - // CompleteScreening.GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; - //CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); } - private void checkBoxDisplayClasses_CheckedChanged(object sender, EventArgs e) + private void statisticsToolStripMenuItem1_MouseDown(object sender, MouseEventArgs e) { + if ((e.Button != System.Windows.Forms.MouseButtons.Right) || (CompleteScreening == null)) return; - GlobalInfo.IsDisplayClassOnly = checkBoxDisplayClasses.Checked; - classViewToolStripMenuItem.Checked = checkBoxDisplayClasses.Checked; - - if (CompleteScreening == null) return; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + contextMenuStripStatOptions.Show(Control.MousePosition); } - private void pieViewToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - - GlobalInfo.ViewMode = eViewMode.PIE; - averageViewToolStripMenuItem.Checked = false; - pieViewToolStripMenuItem1.Checked = true; - histogramViewToolStripMenuItem.Checked = false; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - private void HCSAnalyzer_KeyPress(object sender, KeyPressEventArgs e) + void StatMeanItem(object sender, EventArgs e) { - if (CompleteScreening == null) return; - - if (e.KeyChar == 'a') - { - CompleteScreening.GlobalInfo.ViewMode = eViewMode.AVERAGE; - pieViewToolStripMenuItem1.Checked = false; - averageViewToolStripMenuItem.Checked = true; - histogramViewToolStripMenuItem.Checked = false; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - if (e.KeyChar == 'h') - { - CompleteScreening.GlobalInfo.ViewMode = eViewMode.DISTRIBUTION; - pieViewToolStripMenuItem1.Checked = false; - averageViewToolStripMenuItem.Checked = false; - histogramViewToolStripMenuItem.Checked = true; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } - if (e.KeyChar == 'c') - { - checkBoxDisplayClasses.Checked = true; - } - if (e.KeyChar == 'p') - { - GlobalInfo.ViewMode = eViewMode.PIE; - pieViewToolStripMenuItem1.Checked = true; - averageViewToolStripMenuItem.Checked = false; - histogramViewToolStripMenuItem.Checked = false; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); - } + statisticsToolStripMenuItem1.Text = "Statistics (Mean)"; + _StatMeanItem.Checked = true; + _StatCVItem.Checked = false; + _StatSumItem.Checked = false; } - private void averageViewToolStripMenuItem_Click(object sender, EventArgs e) + void StatCVItem(object sender, EventArgs e) { - CompleteScreening.GlobalInfo.ViewMode = eViewMode.AVERAGE; - pieViewToolStripMenuItem1.Checked = false; - averageViewToolStripMenuItem.Checked = true; - histogramViewToolStripMenuItem.Checked = false; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + statisticsToolStripMenuItem1.Text = "Statistics (Coefficient of Variation)"; + _StatCVItem.Checked = true; + _StatMeanItem.Checked = false; + _StatSumItem.Checked = false; } - private void histogramViewToolStripMenuItem_Click(object sender, EventArgs e) + void StatSumItem(object sender, EventArgs e) { - CompleteScreening.GlobalInfo.ViewMode = eViewMode.DISTRIBUTION; - pieViewToolStripMenuItem1.Checked = false; - averageViewToolStripMenuItem.Checked = false; - histogramViewToolStripMenuItem.Checked = true; - CompleteScreening.GetCurrentDisplayPlate().DisplayDistribution(CompleteScreening.ListDescriptors.CurrentSelectedDescriptor, false); + statisticsToolStripMenuItem1.Text = "Statistics (Sum)"; + _StatSumItem.Checked = true; + _StatCVItem.Checked = false; + _StatMeanItem.Checked = false; } - private void currentPlate3DToolStripMenuItem_Click(object sender, EventArgs e) + + private void statisticsToolStripMenuItem1_Click_1(object sender, EventArgs e) { - if (CompleteScreening == null) return; + string NameFunction = ""; - GlobalInfo.OptionsWindow.checkBoxConnectDRCPts.Checked = true; + if (_StatCVItem.Checked) + NameFunction = "Coeff. of Variation"; + else if (_StatMeanItem.Checked) + NameFunction = "Mean"; + else if (_StatSumItem.Checked) + NameFunction = "Sum"; - FormFor3DDataDisplay FormToDisplayXYZ = new FormFor3DDataDisplay(false, CompleteScreening); - for (int i = 0; i < (int)CompleteScreening.ListDescriptors.Count; i++) - { - FormToDisplayXYZ.comboBoxDescriptorX.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorY.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - FormToDisplayXYZ.comboBoxDescriptorZ.Items.Add(CompleteScreening.ListDescriptors[i].GetName()); - } - FormToDisplayXYZ.Show(); - FormToDisplayXYZ.comboBoxDescriptorX.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorY.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - FormToDisplayXYZ.comboBoxDescriptorZ.Text = CompleteScreening.ListDescriptors[0].GetName() + " "; - return; - } + cGUI_ListClasses GUI_ListClasses = new cGUI_ListClasses(); - private void generateDRCsToolStripMenuItem_Click(object sender, EventArgs e) - { - int nbrofdrugs = 6; - int nbrofconcentrations = 10; - int nbrofdesc = 3; - double[, ,] DRC = new double[nbrofconcentrations, nbrofdrugs, nbrofdesc]; - float[] X1 = new float[nbrofconcentrations]; - X1[0] = 1000; - for (int i = 1; i < X1.Length; i++) - { - X1[i] = X1[i - 1] / 3; - } - Random Bot = new Random(); - Random To = new Random(); - Random Ec5 = new Random(); - Random Slop = new Random(); + GUI_ListClasses.IsCheckBoxes = true; + GUI_ListClasses.IsSelectAll = true; + if (GUI_ListClasses.Run(this.GlobalInfo).IsSucceed == false) return; + cExtendedTable ListClassSelected = new cExtendedTable(GUI_ListClasses.GetOutPut());// GetOutPut(); - CompleteScreening = new cScreening("Current Screen", this.GlobalInfo); - CompleteScreening.Columns = nbrofconcentrations; - CompleteScreening.Rows = nbrofdrugs; + int IdxClass = -1; + for (int IdxC = 0; IdxC < ListClassSelected[0].Count; IdxC++) + { + if (ListClassSelected[0][IdxC] == 1) IdxClass = IdxC; + } + #region single plate and plate by plate - for (int j = 0; j < nbrofdrugs; j++) + cDesignerTab DT = new cDesignerTab(); + if ((ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) || (ProcessModeplateByPlateToolStripMenuItem.Checked)/*||(ProcessModeEntireScreeningToolStripMenuItem.Checked)*/) { - for (int k = 0; k < nbrofdesc; k++) + List ListPlatesToProcess = new List(); + if ((ProcessModeplateByPlateToolStripMenuItem.Checked)/*||(ProcessModeEntireScreeningToolStripMenuItem.Checked)*/) + { + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(TmpPlate); + } + else + ListPlatesToProcess.Add(CompleteScreening.GetCurrentDisplayPlate()); + + foreach (cPlate TmpPlate in ListPlatesToProcess) { - float Bottom = Bot.Next(10); - float Top = To.Next(80, 100); - float Ec50 = Ec5.Next(40, 60); - float Slope = Slop.Next(1, 5); - for (int i = 0; i < X1.Length; i++) + List ListWellsToProcess1 = new List(); + + foreach (cWell item in TmpPlate.ListActiveWells) { - //DRC[i, j, k] = Bottom + (Top - Bottom) / (1 + Math.Pow(((Math.Pow(10, Ec50) / Math.Pow(10, X1[0]))), Slope)); - DRC[i, j, k] = Bottom + (Top - Bottom) / (1 + Math.Pow((X1[i] / Ec50), -Slope)); + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[0][item.GetClassIdx()] == 1) + ListWellsToProcess1.Add(item); + } } - } - } + cExtendedTable NewTable1 = new cExtendedTable(ListWellsToProcess1, true); - cPlate NewPlate = new cPlate("Cpds", "Plate0", CompleteScreening); - CompleteScreening.AddPlate(NewPlate); - CompleteScreening.ListDescriptors.Clean(); - for (int k = 0; k < nbrofdesc; k++) - { - cDescriptorsType DescType = new cDescriptorsType("Desc" + k, true, 1, GlobalInfo); - CompleteScreening.ListDescriptors.AddNew(DescType); - } + if ((NewTable1.Count == 0) || (NewTable1[0].Count < 3)) + { + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + { + MessageBox.Show("Insufficient number of control wells", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + else + continue; + } - for (int j = 0; j < nbrofdrugs; j++) - { - for (int i = 0; i < nbrofconcentrations; i++) - { - List LDesc = new List(); - for (int k = 0; k < nbrofdesc; k++) + cExtendedList ListValues = new cExtendedList(); + List ListDescs = new List(); + List ListNames = new List(); + int RealIdx = 0; + for (int IDxDesc = 0; IDxDesc < CompleteScreening.ListDescriptors.Count; IDxDesc++) { - //DRC[i, j, k] = Bottom + (Top - Bottom) / (1 + Math.Pow(((Math.Pow(10, Ec50) / Math.Pow(10, X1[0]))), Slope)); - cDescriptor CurrentDesc = new cDescriptor(DRC[i, j, k], CompleteScreening.ListDescriptors[k], CompleteScreening); - LDesc.Add(CurrentDesc); + if (!CompleteScreening.ListDescriptors[IDxDesc].IsActive()) continue; - } - cWell NewWell = new cWell(LDesc, i+1, j+1, CompleteScreening, NewPlate); - NewWell.Concentration = X1[i]; - NewPlate.AddWell(NewWell); + cExtendedTable TableForValues = new cExtendedTable(); - } - } + TableForValues.Add(NewTable1[RealIdx]); + RealIdx++; + cStatistics CS = new cStatistics(); + CS.UnselectAll(); + if (_StatCVItem.Checked) + CS.IsCV = true; + else if (_StatMeanItem.Checked) + CS.IsMean = true; + else if (_StatSumItem.Checked) + CS.IsSum = true; - CompleteScreening.ListDescriptors.UpDateDisplay(); - CompleteScreening.UpDatePlateListWithFullAvailablePlate(); + CS.SetInputData(TableForValues); + CS.Run(); + ListValues.Add(CS.GetOutPut()[0][0]); - for (int idxP = 0; idxP < CompleteScreening.ListPlatesActive.Count; idxP++) - CompleteScreening.ListPlatesActive[idxP].UpDataMinMax(); + ListDescs.Add(CompleteScreening.ListDescriptors[IDxDesc]); - StartingUpDateUI(); + } - this.toolStripcomboBoxPlateList.Items.Clear(); + cExtendedTable ET = new cExtendedTable(new cExtendedTable(ListValues)); + ET[0].ListTags = new List(); + ET[0].ListTags.AddRange(ListDescs); + ET.Name = TmpPlate.Name + "\n" + NameFunction + " - " + GlobalInfo.ListWellClasses[IdxClass].Name + " (" + NewTable1[0].Count + " wells)"; + ET[0].Name = ET.Name; + + cSort S = new cSort(); + S.SetInputData(ET); + S.ColumnIndexForSorting = 0; + S.Run(); + + //ZFactorList.Sort(delegate(cSimpleSignature p1, cSimpleSignature p2) { return p1.AverageValue.CompareTo(p2.AverageValue); }); + cViewerGraph1D VG1 = new cViewerGraph1D(); + VG1.SetInputData(S.GetOutPut()); + + VG1.Chart.LabelAxisY = NameFunction; + VG1.Chart.LabelAxisX = "Descriptor"; + VG1.Chart.IsZoomableX = true; + VG1.Chart.IsBar = true; + VG1.Chart.IsBorder = true; + VG1.Chart.IsDisplayValues = true; + VG1.Chart.IsShadow = true; + VG1.Chart.MarkerSize = 4; + VG1.Title = TmpPlate.Name; + VG1.Run(); + + DT.SetInputData(VG1.GetOutPut()); + } + DT.Run(); - for (int IdxPlate = 0; IdxPlate < CompleteScreening.ListPlatesActive.Count; IdxPlate++) - { - string Name = CompleteScreening.ListPlatesActive.GetPlate(IdxPlate).Name; - this.toolStripcomboBoxPlateList.Items.Add(Name); - PlateListWindow.listBoxPlateNameToProcess.Items.Add(Name); - PlateListWindow.listBoxAvaliableListPlates.Items.Add(Name); - } + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(DT.GetOutPut());//VG1.GetOutPut()); - CompleteScreening.CurrentDisplayPlateIdx = 0; - CompleteScreening.SetSelectionType(comboBoxClass.SelectedIndex - 1); + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) + CDW.Title = NameFunction + " - " + ListPlatesToProcess[0].Name; + else + CDW.Title = NameFunction + " - " + ListPlatesToProcess.Count + " plates"; - UpdateUIAfterLoading(); + CDW.Run(); + CDW.Display(); + } + #endregion + #region entire screening + else if (ProcessModeEntireScreeningToolStripMenuItem.Checked) + { + List ListPlatesToProcess = new List(); + foreach (cPlate TmpPlate in CompleteScreening.ListPlatesActive) + ListPlatesToProcess.Add(TmpPlate); + cExtendedList ListZ = new cExtendedList(); + List ListPlatesForZFactor = new List(); + foreach (cPlate TmpPlate in ListPlatesToProcess) + { + List ListWellsToProcess1 = new List(); - } + foreach (cWell item in TmpPlate.ListActiveWells) + { + if (item.GetClassIdx() != -1) + { + if (ListClassSelected[0][item.GetClassIdx()] == 1) + ListWellsToProcess1.Add(item); + } + } - - private void buttonStartManualSelection_Click(object sender, EventArgs e) - { - if (CompleteScreening == null) return; - string DescSelected = comboBoxdescriptorToBeAnalyzed.SelectedItem.ToString(); - int DescTypeSelected = CompleteScreening.ListDescriptors.GetDescriptorIndex(DescSelected); - if (DescTypeSelected == -1) return; - int NumProcessedWells = 0; - int NumAnalyzedWells = 0; - foreach (cPlate CurrentPlate in CompleteScreening.ListPlatesActive) - foreach (cWell CurrentWell in CurrentPlate.ListActiveWells) - { - NumAnalyzedWells++; - if (CurrentWell.GetClass() == comboBoxManualClassToBeAnalyzed.SelectedIndex) + cExtendedTable NewTable1 = new cExtendedTable(ListWellsToProcess1, CompleteScreening.ListDescriptors.GetDescriptorIndex(CompleteScreening.ListDescriptors.GetActiveDescriptor())); + + + if ((NewTable1.Count == 0) || (NewTable1[0].Count < 3)) { - double Value = CurrentWell.ListDescriptors[DescTypeSelected].GetValue(); - if (((radioButtonManualLowerThan.Checked) && (Value < (double)numericUpDownManualThreshold.Value)) || - ((radioButtonManualHigherThan.Checked) && (Value > (double)numericUpDownManualThreshold.Value))) + if (ProcessModeCurrentPlateOnlyToolStripMenuItem.Checked) { - CurrentWell.SetClass(0); - NumProcessedWells++; + MessageBox.Show("Insufficient number of control wells", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + else + continue; } - } - double Ratio = (100.0 * NumProcessedWells) / (double)NumAnalyzedWells; + cStatistics CS = new cStatistics(); + CS.UnselectAll(); - richTextBoxForManualSelection.Clear(); - richTextBoxForManualSelection.AppendText(NumAnalyzedWells + " wells analyzed\n"); - richTextBoxForManualSelection.AppendText(NumProcessedWells + " wells identified\n"); - richTextBoxForManualSelection.AppendText("=> " + Ratio + " %\n"); - } + if (_StatCVItem.Checked) + CS.IsCV = true; + else if (_StatMeanItem.Checked) + CS.IsMean = true; + else if (_StatSumItem.Checked) + CS.IsSum = true; - private void comboBoxManualClassToBeAnalyzed_DrawItem(object sender, DrawItemEventArgs e) - { - e.DrawBackground(); - SolidBrush BrushForColor = new SolidBrush(GlobalInfo.GetColor(e.Index)); - e.Graphics.FillRectangle(BrushForColor, e.Bounds.X + 1, e.Bounds.Y + 1, 10, 10); - e.Graphics.DrawString(comboBoxManualClassToBeAnalyzed.Items[e.Index].ToString(), comboBoxManualClassToBeAnalyzed.Font, - System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - e.DrawFocusRectangle(); + CS.SetInputData(NewTable1); + CS.Run(); + ListZ.Add(CS.GetOutPut()[0][0]); - } + ListPlatesForZFactor.Add(TmpPlate); + } + #endregion - private void comboBoxdescriptorToBeAnalyzed_DrawItem(object sender, DrawItemEventArgs e) - { - //comboBoxdescriptorToBeAnalyzed.Items.Clear(); - //for (int Idx = 0; Idx < 10; Idx++) - //{ - // comboBoxdescriptorToBeAnalyzed.Items.Add("Val" + Idx); - //} + cExtendedTable ET = new cExtendedTable(new cExtendedTable(ListZ)); + ET[0].ListTags = new List(); + ET[0].ListTags.AddRange(ListPlatesForZFactor); + ET.Name = NameFunction + " - " + CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName();// +" - " + GlobalInfo.ListWellClasses[IdxClassNeg].Name + " (" + NewTable1[0].Count + " wells) vs. " + GlobalInfo.ListWellClasses[IdxClassPos].Name + " (" + NewTable2[0].Count + " wells)"; + ET[0].Name = ET.Name; - comboBoxdescriptorToBeAnalyzed.Update(); - //e.Graphics.DrawString(comboBoxdescriptorToBeAnalyzed.Items[e.Index].ToString(), comboBoxdescriptorToBeAnalyzed.Font, - // System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X + 15, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); - } + cViewerGraph1D VG1 = new cViewerGraph1D(); + VG1.SetInputData(ET); - private void comboBoxdescriptorToBeAnalyzed_DropDown(object sender, EventArgs e) - { + VG1.Chart.LabelAxisY = NameFunction; + VG1.Chart.LabelAxisX = "Plate"; + VG1.Chart.IsZoomableX = true; + VG1.Chart.IsBar = true; + VG1.Chart.IsBorder = true; + VG1.Chart.IsDisplayValues = true; + VG1.Chart.IsShadow = true; + VG1.Chart.MarkerSize = 4; + VG1.Title = CompleteScreening.ListDescriptors[CompleteScreening.ListDescriptors.CurrentSelectedDescriptorIdx].GetName(); + VG1.Run(); - comboBoxdescriptorToBeAnalyzed.Items.Clear(); - if (CompleteScreening == null) return; - foreach (cDescriptorsType item in CompleteScreening.ListDescriptors) - { - if(item.IsActive()) - comboBoxdescriptorToBeAnalyzed.Items.Add(item.GetName()); + cDisplayToWindow CDW = new cDisplayToWindow(); + CDW.SetInputData(VG1.GetOutPut()); + CDW.Title = NameFunction + " - " + ListPlatesToProcess.Count + " plates"; + CDW.Run(); + CDW.Display(); } - } - //private void buttonStartClassification_Click_1(object sender, EventArgs e) - //{ - //} - //private void richTextBoxInfoClassif_LinkClicked(object sender, LinkClickedEventArgs e) - //{ - //} - //private void comboBoxCLassificationMethod_SelectedIndexChanged(object sender, EventArgs e) - //{ - //} - //private void buttonCluster_Click(object sender, EventArgs e) - //{ - //} } diff --git a/WindowHCSAnalyzer.resx b/WindowHCSAnalyzer.resx index 7ee4e5d..38b5878 100644 --- a/WindowHCSAnalyzer.resx +++ b/WindowHCSAnalyzer.resx @@ -117,8 +117,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 469, 19 + + 729, 19 151, 17 @@ -128,7 +128,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAM - FAAAAk1TRnQBSQFMAgEBBgEAAYgBCgGIAQoBMgEAARoBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + FAAAAk1TRnQBSQFMAgEBBgEAATABDQEwAQ0BMgEAARoBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwAByAMAATQDAAEBAQABCAUAAaABKBgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHc AcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEA AzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEz @@ -223,23 +223,211 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAACHSURBVEhLY2AYBSMzBNbZ8v2nmc/XW0r9B2FSLZh28Nf/ - 2Yd//V9w7Bem3srKSpINJNUBQ1z9aBBRLQI1qj+Sl9qIiQOJwg9gwxXLITRNgHDee9oZThMXk2Lodp6F - /0EYqx7kOODMIC8YtrOvIS74QBaQawkpPh4GaisqKlDCFJmPT47uXgcAe2w7kgZG0QIAAAAASUVORK5C - YII= + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOpgAA + DqYBh9ypbwAAAH1JREFUSEtjGAUjFKyz5fsPZVIfrLeU+g/CUC7RYNrBX/9nH/71f8GxX5h6Kysraefi + 4QFGg4hqQKP6I3lBSUwcSBR+AKtRLIfQNAHCee+HcWLYzrPwPwhDuagAOQ44M8gLhu3sa4jTB7KAXEtG + GKioqEAJJmQ+Pjk6AwYGAHtsO5KWZ+cdAAAAAElFTkSuQmCC - + + 282, 19 + + + 819, 19 + + - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAACHSURBVEhLY2AYBSMzBNbZ8v2nmc/XW0r9B2FSLZh28Nf/ - 2Yd//V9w7Bem3srKSpINJNUBQ1z9aBBRLQI1qj+Sl9qIiQOJwg9gwxXLITRNgHDee9oZThMXk2Lodp6F - /0EYqx7kOODMIC8YtrOvIS74QBaQawkpPh4GaisqKlDCFJmPT47uXgcAe2w7kgZG0QIAAAAASUVORK5C - YII= + iVBORw0KGgoAAAANSUhEUgAAAHwAAABjCAYAAABZnmTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAACfESURBVHhe7X0JdFTXmWZJqpKQWI2D7dhOnMk2nenpPmfm + nOlzJjM9STrthV0sEiB2MMR2O+6OnWADUlWpJOHY2abt9hJjDBJaQEI7khBCCxJCiM1mXw1m35HQvn/z + fbf0hIwxHhsboYMu5+O+eu+p6t373X+727O1t7YBHehKrW0d5iPPfgo614F2/i+0Ei19EDpa0NpQg/bm + BjTVXeO5drS1NqOtTbVm1RvP8j+ho4P1S6CD14U7nGxdT6SMD9LSygcmp3qUJh6I2nZDtdDG/1sM0NFs + 0MGHvlchwq5duYj2lnoet6KjnXXCWmqor0V7ezvq6+tN1XbH9WQJz51NNv2n1tjaKmq9DyXCP/8hdZ8l + 4a3mSMW8F+GVT9ZJO+uirdVItipMZFvps3XYs8nW3NyMlpaWrofUw4lwo370uVMFXW/VXjWmQupzM29q + 4H33IlR2pabGejQ21LFerqto1WlDQ8NdSHgLieSBIKLVAAQrdfBkR7vU1WfRTsjmN7N13Ku4crW6s6a8 + dXflyhUjIFa6LjB3B+2fIlzkdVdHVVVVYvw6WEChqwD6bCSeDURq7Z7L29DU3IraxiZcuHjZW4edplHk + 61jmUlC93g2k2xrppUsRiTs5bFaq3LIZblcEfGw2A5uBL2HvhMOcDyD6EUH3YO5P2B0BsPk44OffH7/6 + lxewvqAQjU1edd7Y2IjWliYD2ff2Nq/pNALDOu4J+m0iWzCquZWtluns2bP4t3/9dTeyLaIdBAtoC2Qh + +5vPIjzwHoWDsPnYETjkAeZe4v/xF/+MY8dPmHqsrr6KluZGA4v0Nkl8R3uXj3SnkyG8pfPHjTrngR7Q + 4WfvJNsOB1uvIdl3AGz2+1iwobD1e5j5kM4GoAZxD4Jk23xVL6yffoO9pPv5G/V+/PhxE57VXL2Cxtpq + Q7jxfSjd3Z3iO528Es4Wp+S13+1dhHsLJqkOhE/AMPgEPcICsTX7fhs2x3dhC/ge80dh83+IYAO45/IH + MOjRn7BOKAgiXeRTyk+dPotjx47hyuWLuHLhLEm/hOb6uusSzmqWpVfd32nSbfrBtg79PNUMW6BFuN3e + aat9gnDfgz9C2LyXMe93f8Ts3/1fzA1fikm/fRuzI5MwKSIeoRGJxKqvlE9cLMT3ynzyomV4YtpvYAt6 + 0Eu6QCnfc+Aw9u3bhwP79+LMiWO4dP4Uaqsum9BN4ZrMp7RqDxHe/lnCm5pJuL9XumWr7cPwfPib+M2S + lXgmJgnPvZ6JcS+twJSobEyIWY+xS4qI4nsuD43JxrMxy2AbKM03iMTfbwgv3VyJ7du3o7K8FEcP7MGp + Y4dx+fwZ1NZUG0eusZX+Uk8RLuXSrjCDudU1aAj360fCA+Cr1hvwMJ53L8W0hUsxYcEHCIvKxIjfrULI + khI85SrG45EleNxd+pXyJyLL8IRnY6/MR7tzMNtNwu0k2o/+TCB9GxKenbceFZs3oXxjEfbs3GpIP3vy + OKquXjbdrQ0t7WiiWpeLfFcQrhjSzy7CZZNYCNrsma+8g9AFyzAxIgWTXy3A+OhiTHx9C0ZFbcKI6K+O + kTHlvRbjo/NJ+HKjAW121lMQc9rxVWvSsaEgH0Xr87Bjyybs37UDJ48dweVLF1BbW4v65jY0Urwl5T1A + eAuJbuIh21tbd8I7Qy87nTT7d4wqn/fqWsx4bQPGuAsw0lOG//3SWoxxrcc4Z/49iZCINDy7JN7rxAUS + /SjpJHxlUjIyM9KQk5mGreUbjZR/cvQQLl08j5qaGtQ1td4NhH/ahnu9dNpwP7Zcv0cRtmgFJjrTSHA+ + fr5gLSb9+UM86SzGKE8JxkYWYby7CBNcGxDqLMAkZx6mROQxz8EkVzZCu0HnphBhEcx5T4gzFxNdhHNd + r8unOFMwJ/wtr3TLhvt5vfTExERkpiYjNzMVW8pKsGvHVhw/chgXz18whDc0NkM9nHLe7nQyhEuli2rL + pjQ11iLIxwa76VigaqdKn+ZZjdGutRhNNTzcvRHjPIUYGVmMfwjfhF/8YT+eWrILo9yVmBpFOIsw5t9S + MXtJAULdWZjgycB4YkJkliFdZM9alIPpi/NNIxnjEfg3XzIfG7nBNLZg5sFscHc6n+ROw8wFv6cqV1im + ENaGQLsNqYkrkJYUi7ysNDpum1FRUYkzpy9g775DqK6uMba8ofZqZ417Q2L1wVtJdl6p+5iG0tfRNesl + nJKtr24k5Dk2NdZgIB9eXYg+Pn5sucMw1ZNKotdhREwFnozciIkstFT72LcO4/G/kPDorRjx8nqELczH + rIVZmPTCCjztSsaU8DhKfSwmuGMpGXEIYzgzY+Eqhnir8TQRtmg1/YLVCA3/8rkwqQcxffEyTP31Qgx+ + iI4tBcSP9dXf14Y/ecKx8r23kJ2WgjTa89y8DThy7AxOnrmoOkdbEwlta2BFV+PC+bPmnFJTU5Ppf6+r + q+s8cz19Xf3wt0X4ePda/J/fpeCpiHTMfm09fjnjD/jhf5uKAUP/ga2doYr9Ydgc9AECiH60cfT2bfZH + WTnf4fXHCB7bZPfUS0V82dyCrYfgMxABQ1kuP4WvvqZnUlrxO8OG4v7+gaYBDBwwFD72gbzHG6OrM0v3 + 9fPz3vvsM/ORkZEhLnDxordBqAPMIt30u3fi60i3RXioMxOTPGswPSoJz8fE45Gf/DMLNIwFGkSoO5YF + 9CXkADpYYDvtnK+6Y4fw+lAWeABhNwW/XZiBjDucm55I9bA5WK4ANQIHAhz9SLRIlQ8kglUPInsA/AbQ + i3fIztswdGgQHNQGIv+nP/2pic/PnDkjTgy5svVS6W2do213BeGTnal45o8ZmON+D3N++zrvu5+FDcRD + A4fhPv8g08KNbZMEqKB2Fl4tnQ1CldDVKEzl3AbUp90jOcvEMtv6U2PZv8XPgxDQn9qM5Qoa9DAc/b/N + 8tOhU9im+/op19+oH17+kRqN6tgHFy5cwOnTp3Hp0iVjz0W2euVMzxzVvLfb+/bTbRKejlEvvo0pr/wH + nl3873x4SW4A+vn6m1ZuJEBEB5DgfqyQfrR1/qwEO+Eju0fYCcdXhH9Pg2bLofGEH9Bx+xHJfQT+Q/+G + OYlV2TTm0P+HBK8HsFHomQOGIuAB9cz5ov+QARh8nzSezQy2iOyPP/4YJ0+eNBJ/7do1Y9dFuqT860i3 + RXiIMwsT3emYEZOG515NYgE7bTIlOGjoY5jzYiTmOv8d013vYnJkLEIj4zHZHY9pzpUMZ2IxK3wlQ5tV + CHGnfGVMjEzBeKIn8hA3nVI9w8vLMcvJci34K+Y7V2B+xDI8H52I519LwZRFdOwiVmBOTAJCX3kTsyL+ + grAXw0m+NJ4dPg51YduwY8cOI+GHDx82hF++fBnnz583xFuq/cb0VdT8bRGueHSCZz1GLUpD6MKVLABb + +SC1cLZkxyOY7/4rZnjiMSk6FeNicjBmST7GRedjYhTj9Mi1bAQ5GB9VgODoQoLhzpfMx8QUEkUYvaQQ + o3sg1++HvLoBo15OxsxX12FGVAYJTsIMRiehryRgUkQyfZx0jHfRq2cdPPXSW5j/hwT8+o8fGEm39ZNt + pw9D4gsLC03/+4cffmhG2kT+1atXzUQKSfndQbhzHUY7SzAhaiNCSLrN/ve89/vM6YHbv0fbHk+pTsNY + TwHDtjI8GV2Bp6IqTC+dt7Nmg4nnFdeOdRWaY33XxJgSjGOMr168W8XBVhz+/xu3f/15EUZ1fg6OLKDk + 51HqcwwmuPPM59HMnwzPwuioLIyIWIXpr6dgWuRS2AZ+l0JBExgon8aGkpISFBUVGdKPHDmCEydOmFwS + LgdOXbLd7bjsuq59XlJjuFmDuE3C12NMxEaEksDJC9N533+ldNOm+dFeMZ/ronS7sgwpwz2VeNKzE095 + tvO4AmPdpYa0cRGsrHDG84tJLvPxzkKaiWKERJYY6NytMDaiAKN7CKP4rBo8eoLPO5wNdqSL5535BqOc + BTxXgMlv7ELwHyoQ/MdSPL44GWOciRj1uzcp3SJcIanGLGzIz89HWlqaCdFE/sGDB42Uy5lTR4zIFslS + 71/kxFlkf+2Eh0asw8TFRbTRRZj5Mm24D50TG9W5DwviMwzPRSzFjIg1prt1rLsco9zbMMbtJTvElY9Q + Vx5teiFRxIZRyPvoF7AidTyFEj4tuhRhnpJbYkoPIpTPN3ZJBUa/yjIt2YzxS0oxIcaL4CWbzLmfLy7E + P7FhjH19E83AOoS9ls3yxVHCfwxboPopFKnYsGHDBuTm5iInJwelpaXYu3evceSOHj2K6upqQ56cNxFu + ESnib5a+McInh+di8qL1mE3VPndBLB9cThs9cp8gk78Q/jbmLk5CWEQeJjjLEOxiS3eVme5USf4UVwYJ + XmeIFskie/yidQh+JdfkExZrgKLglpjYgxgniaZ0q4t5NFW66Xl0ryd0rK7njWa84XEKxITXyhHsycHU + JZm071Tp/pRwhWqmM8aGFStWYPXq1cjLy8PWrVvNBAqRLek2Q6q05ZbzJunWsZlVfEPqTvY3RHg+5kbk + 4ukF7/PhKd2ms0U9T4F4IUKzY+JJeDYJZ6t3ldOBoaqmXZviWmMQGplLSSnG5CUbMeXVUkyi/Q6JKsJE + 2XP+xnhW3q0woQeh3w/2yFbTZhMhbu8AkdeG5xu7HvbHSjOUHEoHL3hRMmZ7UvB0BOtqAH0dhqn+gYMw + YMAALF++3Ay6JCcnG2mvrKzEgQMHDKmaVCqP3SxsuIHI7uTeDDem21TpuQih7Z3pWodZr9Dz9FPsqZ41 + /U0gnnO9wTCE3qozx0i2Uee0y3JmQhnWTIpcjfHha2jH0zAuPJ22Wz13OZgc7a28CdQAE5yZt8wnRmTS + l5Cm6Jl8IhttiJPeOD3yyURYOHOWaVK4ni2bHnwaRi5IpRbLQsiClZgXEYunf/tnCobCV6lzOwYOHGgI + z8zMNDbcItzy1hWidVffUvFqCJJySXt33Ipspdt02qh+I2jLPGzBixO8akpdqAF0RAIGYY7nHZKaYrzp + pzzb8HjUdnrq5RgeTS83mqRFJWHO79fQB4ijmltmVN3UiDjMcK80sbrmjE2n46frN8tnMFf8O8sZh9kR + PZHrWbyYYZ4j3nuejXxGBL1xZxrCSPRMNt7nXs/HnMXxeOYVxuovxMBOdT6o/7dIuC+GDh2K119/3ah1 + SbhCtPLycqPWFZOr502dMCJZIZqVpN67444QbsIyqqyQcBGuXqchzAeaOHOWZynj9DUYSRX9ePQ2/HO0 + l/CR0VSFUWl0fOIQ9MP/Bd9hdGCsHjh/+gFB/8nbeDTQYqCeqU7o2KDzmp/Az+r0ueM5YddzKjKRTSZM + lEJ17fcj4j/zmiKXv2V5CF3z+Tbuf4jHlO5A1lNgP9aV+ta/JXvu7W71DwjkdZpFwmEPhMMhE2mD3WHD + pNBxKN9UgrYWhmX13tG17oR3J/1m6fYId+UimCFIaHSumSDhLbAmA9zHgg7D3EhKbSQJ96zHiFc34wlN + h2IoN9G1Fv/yei76P/ZT3qvC2RA0WH3OdPY0kSCQpkEzSDT5QoMtPopVu8FHjqGuEZob76vPPZF/Hjqf + zVdhVycUueiant2UQ+WWw+YdabP5atzB6l8X2bpvCPwVulELBASSCz8bhgy24b/8zaOou1qNptoW1NV4 + HTqrz91qACL+Zum2CA9xrqVtzjGzV6ctog1Xq5dtMoV7EPPcyxAWlY7gGMalv9+MkTGbzIyZ0EVpmB/B + MC7oR7CGFE1Bfe38LQ2wsGL6PUBtQZVnKle2zoIqS5UhslWpqmB+7tVguTQt3N450GQaOLWdhpiNrQ+A + g4Tb7F7SAyjpxw4dx9lPLqLqSo3pmLG6YL9osOWOED4mKg8jX9XEv00YH1WISYvTMXMBNQLDuMFDNNAg + sh2wD2UBNeXXwcJqgYODxxpT1+IHC76SfKlT9eYJuk/xbC+FMU0skz+1ov9gnmPdqcw+P2T90NQ5foD7 + Hv4Jz7GOSLQBNcHZM1dw4Vwd84tm0EU2XuFb9773m6n1b5zwSe41GE7H5XHGqsOjSjExphhTGbrMUd+7 + D++X9EqyBz2I0XNeotPzJm3/B5gTsxLzX1ttpgE/7Xof853vUSu8j3nOZZjjisVsVwKjgwTmPHYv77WY + o4EkF3P3u5gT+ZbJn3Yux7zFyZhPTHr2Lwh9xkmfiOrfn2T3J0j+/sNnUF6xF0ePfGIcO/XIyXvXxAlr + 5kyPED7Fk2YI/6WrkH8nB68IMzy5XpXuJyeP90qND/0epi/8C+aRZI2qjXwlFiNeXoEQVxLDugRMFvg3 + k5yr+btrTEhkwjJXMu/hud4IhnOa+aryhLDxhrjjvGVVeLeIdbowGy+/sRH/+vtEEk41HyDCfQzhFR8e + xdq8zfjwo30mXlffu2bMSNItm34ztf6NEz7j1Wyj0p/wlBjCx3k2GAmfF85CGG9WhMtmP8ow7G1M/30K + 1X4aRkdmYCy/d1zUWoZv2ZjoEXjMxhIctZ7XCg3GRa0jNGqX2wvzdZgQqUGjDSyjyplp8omR60j8RoRF + FGP8S6sw5eWlrB/VEW18f80x8EXp1gMoLd+L8s3bsHPnTjOsqhkzCuEk5VaMfmP6xgmfFpNpCH8qutSo + dBVuSkQm5i6K5z0Mv+TByiunzQ555W1McK/GKHc6RkXnmWHI4Z58jIik0xeZx/M6Xo/hkUXmGYQR7g3m + 3Cg3I4HelruLMMpZhhGujeazVcbRriIEh5dj4qKN9HdyMMtNbTiAdTSIUYyknBKesCYXaRmFKCwqRUVF + hel7l5TLnsuJ+7wh1W+ccKmtEZRoET4iusw4bV2ES8J1b5CctEcwJfx9fm8yxniyvGQTI2jzRzHOHx1d + iNFROibJ0ZvwVMwWDI/Wypcyc250FCutt+UMU0dHbsUozxbz2SrjWM8mjHNtR2jEFkynBpiykA5uAOtJ + Et6PhNNTT0hIRXrqeqzPL0JZWRl27dplBltky3uU8FBXCkZTfY1Ysol/V2IGF9T79LR65my04SZeZWhC + z3QWnTN1t46NzMKomA0ktMh02ggad/aixIynD/eUG4zylJpzY/jdvS6PVHdzJfMK89kaZx/rpmA4K2nf + yzHVuQ4zI+jgBrJOJd0inF56cvwqrI5LRk52rhlHl1rX9CiLcEulWzG55cD1LOE+3yXUGUGnze8hzHUu + xRSqr3GRmWztGz5FtqkITXZQxUSSZFaWqTB9J8+rj77X5e5SotwQbCZz0HwpD+b5CRGVCKVanx6xDrPC + Y0m4wjaSTdL9GMamrozHmtjVyMvyEq4pUhpd0yDL3Uu4TYRTutXrxBh7XsRfEUbCx7szMTaaNi1qQxfZ + muWiGTKCmfXiLunEZ2fC9Jqc0Oihlmlp1E3Dp8H0V8yyLUr3pPAyzIjINfP/zA4TjMH9SLqmSGfExSF9 + RRLystd+hnB56nc54YrFSXj4UoQxXBnvzqIH7iVbkESI6E8NT7pEvvd8b4bKoaHU8fRbtBxLQ63mPAkP + jSilhN+c8MxYL+G5WdlmsOVGwmXD71LCqdLVXer7kBkn1izQcW6tYSukOr9u70wlkGjNlAlxMXd6K0vn + jcT0QnjH8/MZmmWbUFQIZvhp5se5ymjDy67bcK1MJeG+JFxd0RmxiUhdsRq5mTldEyA1B+7cuXNdhIvs + u4xwjR7RaVPfuN+jmO1cYRbojWEcKk92OD1wOWiy2VJ/XsILzJQpi3BVnDWZsbflInaCO88sshwftQbB + 0Wuo2ajdPAWs13JoltBk13pKeSJtuMYW6KXLhpOXVDpsa1asQU7GWjN+3p1w9bipi/UuJXwYc5Lu95gZ + T9ZqU00XUuilWa7GE6dzJnstgkW0BX1WxZkZpPzu3paLeE0GkTo3ZBOjorON76LJIpoSFuoqxNSIZIau + D5Nsh9dTJy/JcalIWZGG7MxcQ/i2bdtM54tmx1iEdx85u064Pmh7TX5o9Z5DS4N3ubBZP+Xjbwif5knC + KHcGRseU4Ek+8DjPeqreXD5UHqaQ0GnW8Kghm/DrJNzNuDoyFyOXlJoOk7FsNJrLNlfj5z4KyzR4QsLt + j5lJBCFs7RbhmtLcnXBrDboFSb0IN44dK7C35QrD5JkbNS51ToyJyjHXRzJUU7imnrgpThJuJjyScHnq + 5CYpPhWJK9OQ9aUJ1xJlibdm0Hj3A0BrfSMCfHzgo6VCvkEk437M8ixjJcdh3JIsqtpsSux6jIhaj9Gs + +ClsqWELSaDpKiWB2vPEjIcvpUpKZJiVZRYMqFdMjURqW+SaBqI1WRritD9KCV9hxs/HsoGoA2KkibFL + TeUYj5Z/b9lsS7K9ufW5t+VeSIXLjgvy0uW3PBVVaRq86Yp2UqX7U6X7+MLfz6vSExKTEUtkZX9ZGy7C + NWvG2hGAOr21vhl2zU3TAL0fvUOSN8ezlOplOcYvSTOEP/FqIZ5QD5izhIQXkfAk3vcDc68ZEHGI8L92 + Ea6VIuo+FOFanKBpQWavN+2eoI4XhzpePuicErXW9JPLaRPZqhyLcMtmW5Kia16b2PtwXbUXmYmdoTSP + cuRE+JNR24xJC6Z6nybhYH2KaEvzxq1KxAerVn8FwtW/LrL1uXN7wMbGZhKtnR80MC9ppfRFxtGJWIVx + MXlU6RvwxBLNYNlsCA+LpF1epKVGVNGScMd9n0O4V8L7CPeiZwjvtreL2ROdeV0TCXeQcC3t1YJ+x/cw + MzKJsWEqxkUV4Ul3GaV7B52wrQiOKMI0quAuG67RL23P2aXS2UgYZgVHl3Sp9C7CzXywPsLvKOFt1OMt + 1OnKWw3aca2FhPvLdnuJ0KyLGSRiQrj2aqHzRe9xuGcPRri28dwGNoZMzFz4Psl+hKA9dnhnbnyWcDp7 + XYTH8fvp1fcRzuM7SLhIbibhyvXvs4Q/xPz7ZogudHE6vegiqvEyetI7MMa5GSHheZjtXoPZr7xLsh8k + +Dfa4oKmwEt4MgukMezSTsLXGcI1xbiP8B6RcC/lynXEy6htbiThUum04WaO1SOY51qBqYvjMZXSOpEk + a8GfFhOGLU7DfFcSnn7lTd7Pe2UGughfhslOEkiSgzVjlaFVH+HX0WM2XHutynbzyOQNTSRcMZ9mUJoN + aYbiOdd/YPaid82K0KmMoae7Uk2HwMzFK/EMvfdfvfxnEkd1rh2FDenDTBzuJXw948tyM9CvYxOW9RHe + Q4Sra02eeksHWhoa6aXrQ7vpzfFz2EkGSVeIZk0fVtilBQOGLDlp6jzhMaXbVyspfNQ5IAl/AHMiqNKd + qSS5oI/wm6BHCG+v5UFnp0tzbSPaGZLVV1VhUFAANGfc4e8Du78fSST5agDaZVkevDbokY0fxNjb7NdC + qdZKSG14o5wN4PlXNfkw3Sz2HxNVQcLLbiBc05ClFfoIv2OEd9Twf3W4EK3Xmjs70xvwT//4P82ojH7E + hz8ieOePE36E5kdrSYwWC2jEy+zOZEdAoGy/l/A54cugrb3GuopJeCUJ12C/1n9nkHCGcX2E33nCDdmS + cHLdWkOVLo1Omx77/rsY8fjPEORvQ4Cdkq4uvU7iP9UAtHWVT3/cN5TxOh/EQDsx27+FZ6PizarJMVTl + o1mAPsI/jZ4h3GuyDTpaWqGXrmmv1eamWhw/dggnThziF+3Brl2VKC8vRMG6bGSlJyMlKR6J8QlIWJWO + 95fH491338aQwUEIoAkwat33fsxY8B5CI7TjcikJ32Hid4tw9ZubuL2PcB7fScKZvKMqeqdoO5pbG1DX + cI3H8txbUVV9CefPn+WXHcKObdtRXFhkBt3TVqciJXENViWlIjklFWkpieaBBLNpXeDDmO+M6yP8FugR + whV717fV4VpTNbW6InKNjbficn01Tpw7g3OXLuPEmfM4dPg4du7cj/KynSguqERh7mYU5JQhLTXbbEaz + IS/T2Pwh/emlawy9S8JzSfgmjPbs7CP8BvQI4VYvWwMaedSM8zUX+X87alp1Hqiqa8TFKzX45NRFHDhw + Aju3H0JF+W6Ub/wIZcU7sG3zDuTn5JLwbPNAgwbSe5eX7vsgnvEkYTIlfJy2+/BswyhnOcbRY9f+LjOc + Gl1jSNcXlvH4DhIuNW5BHS+t7S1oaWMTIPTiums1dbhadQ3nL1zCqZPnzOK1A/uPYM/uA9j90T4c3rUf + 20orsL1im1Hl9v73k0CSOOTvzE4I2t8lNKIII15chzmvf4RJzmJMWpyHkAUplPC/JeGM6/sIv7M23Eo6 + qYu6SXZd0BJUbQqnXQE1I/LUqVNm7xF9+ZFDh3Fk9z4c23cQxw8fI3GUbNMzp+7Y72Lygvcxx5ONOdrQ + 5sVMTI0oxMQF2ZjLQsyKzIVt4P/oI/xuIdwiXasQ9cdaoKapM9pgRqsb9MXnzp7G1TNnceHEcZw9eYKq + nA6b2TmZpDsexAuvxWPqwuWYtyQb08LTMcudjbCFq/Cr6AxMfPFdkt2n0nuccIt0i3jlIl4T27UMVcRr + ZYO+tOZaFdBUj0unPkHV5XNewtUh049xuGMQpr0Ug+kvv4H57pWY40zAs55kzF28DPNdyxD6whI4HtJC + d5LdR3jPEK5kkd4dFunWToD6MkFvMGyvr0HdFW3s3kDiSLZmVQbRS3c4MOCxH8M2QLscfJuSr/52eeVU + 4f6U6sEP8FgmgE5eH+E9R/iNqTvp1hd0fUl7KxqrLqsTnnc2eHvf1O0a1Em8neo9kGGXpFgDL9rWQpv4 + aC+T/n6wDxbh8uj7CL9rCLeSRbwF70mgvbERaGUEX1+Fn/2MThil3LefDT5auK59SWTT5cz5D6Cq14hb + Z6OwoM1s+gi/+wi/adJ3qFu2mTa/uQkpyQn4u7//MXxEtNS7IVwLGfzh0AwaPqxG4ALYIPw710nZ9H60 + PsJ7EeEafNG8dubtzS2or6vGhYuncfTjg9i9dw/KN1WicEMp1iSnI5kPmJwQi6SV7yBhxZ/MYEwf4b2M + 8A5DNI812tbcgYa6evOOzWPHjmL//v3YWrETpcWbkZORh6zUTKQnJyFjdSxSEt7qI7w3Et4uwjtJb22C + 2Q7y6uUrOH3yFI4e/hi7dh5A5eYPUZxfhsJ1xcjLzEb+2gyszUgwBZC67yO8N0l4q5fwNqKFpDc1NKOm + +hounDuPUyfO4tD+4/hox0FK+m5s3bQTJQUbsbl0I4o35HR21PR56b2K8PY2kk3SGaajhVCcXl+vrlj1 + yF3CiU/O4sC+T7B/73Hs23MMFZu3Y9euPdiytZxE9xHeqwjXV2hGVAv/E9ktre1obWtEE+Py2roqs93z + xQtXcfz4OZw6dcVg165DOHbyDPYe2uclvC8O53EvI1zvwW5q01vvG9HaUY+W9ho0NFebiRS1dQ04S9Kv + XmvBFeLQsdM4X12Dj8+eonT3Ed4rCW8xhGtI1Uu40NxWj4amWjPEeqlKDaADjbTzx0+fRy3V/pmrl1gI + eujm9ZRDDOHaxWmaXn3lSkGox7t81nqthMbQLWjTAPPGhM7rWlPeK6EykGi9MkNr5sOcaZji1Hlt7qPG + nY/JkelmMqhGILV8O5CEa6JJQuIqxCbeaRvOpAWnBqTfLEa8AfpB/ZRekl5X32jyi5cvoZXG3+arzQYG + E8Mw4Lv/HWPnheM3r63E3Ih3Efa7N/ArzwrMWPiOwaxOaDHErMXvYnb4e5hp8H6vxYzwD4g4zFi8ErMX + ryA+wJxF1zF30Xv4jecDTH/WhX79H4Z2u/LTnAMSH7c8ERlp2ci+gXBtCCBTau23+rUTri+6FbQTgZIG + X6xjPYBgNoLXO0k1fi5o0Xv/R4z6MhighQq8LljndI8Q8CDxbYL391b0+w7z71+H3ijh/xjBa2YLcZbT + 5z74+bPcZq/4QPRzDDCkf/DOB3jnjbex9ha7OH0jEn4jwTdCRFvJIlxJm8CaVSqOwfAd8JCXeNnyLw2a + A5mEXomhBMk0izAJbX+i7VKsTf/N4g7vlLGg/jxHogcNGIz+gUHITs/A6oR45HTbp+3GnRhV/3ec8O5J + 5OucHkKE//wXv/RKOQvkZ5YnBZm8/5AHEDRQkh/Igmut2i1yswSql0Kzg/Tucb0nxoDH5pyusWx0aPsN + 5Hm7A756UxRtt8YiBg0MRGLccsTFLsPatVmfu/WmVdd3nHDZEuu4e9Jrmx544CEMGKAXzPuyQHrR+pfL + zcIHOjK9E3x+89qPTphjnhMUsuoeKyeG3j8QDz40FJMmB9N2pyArcw1ycrJRXFzcRXiPq3QlORBW0o+r + ASjV19bxC9px5cJ5HN6/D3s+3Imtm8tRkJdLlZWGnMwMtuRYJMSu6EL8iuXdsMwgLvZ909p7Wx4btwwf + rFzeCR1fxwpeE1YmLkds/DK8t/QtJCYtxxtv/gnpGatIdCpWr1qJ/Py8z+ymbBEujdojhOvHlfTZehA1 + gvbWNtRcvYJLjMnPfPIxjh8+gD07t2HjhnzkZqYhOy0FqasSDNYkxRukJK40SE6Iow0jEmOJ5b0yT7oJ + EpM+jdXJ8V3H8QnLmcchM2uN+ZyekULpLsSWLVvMQJX13nFNOpVK7zEJ7+6p68eVLJUjwuuqq4yUHz14 + ANsqNqOsuAglGwpQtD4fedlZyM3KNJDEC2sz0o0GyE5fQ7WWalRbb8Xam8B7TeVKRUY6G33aahQU5CMh + YSU98gJjt9PS1qCyssJIt0KyQ4cOdYVkmmksLaq6/toJ/6J0YwO4EXV1DVRBtbh48TJb6GkcPHgYH320 + m4XZhs2bt7AFb7wFilFUIhT2Skg6S4sKUNYdDLFKi4RilBAbi0tMXlRUQrKLzRsQSjaWo2zTFpSzfnbv + 3m3eeSJ1LvutmcXSnpLw7hGSlXqYcHXItOKahlSr6nD6/CUcO34aew8ewa7dB7D9oz2o3PohKrbt/Ny8 + Ytt2bGYL74155bat2FG5FTu3fBo7tmzvwoc7dmPn9l3Yvu0jbNtK8HjHzj34aNd+7N5zgJJ9xKwTuPF9 + J5Zk35h6lHD10DWxEda3dKCmvg2Xqutw9kK16X49evwsDn58AgcOn8D+I8c/Nxf2Hj3G/Fivyw8QRw4d + w8cHj94AnfNeO3bkpMGRw58QJ3H0yCkc+/iMGZA6cfIcTp8+a7pTRbZst2UqVb83Sz1OuJROcxslvVmk + t+DqtQZculqL85eqzaDLmfNXPhenL/RunLlwGefPXcaFW+D82UsGZ894ce6s/uYKLlyswsVLVbh6tdqo + 8S96X5mVetyGi/Q2ah4NrzY1txsVX1ffjJraRlyraUAVpf6LcOVa74T1/NXVNZ+Lqiq9Vbg7qni+2oRe + gvUyeZF9s77zG1OPE252ciYUoumNua3NLQYtTc0GjfUNt0RDQ1OvRj1R29jwKdQ31nWhsVGvl/SiqZlS + fANaWrxES7KF7oQLN6YeJZxMw0yZMXOkmm+OFoZ0t0BHS7PZuaI3oq21GU3tbNQWOhoNNK+gqZ1SS1jD + ze0dDWhHnUFbRy1JFepZj16Cu6Orfm+Sep5wTYq7FbpmSX4erEbTC8Hyk3Z498D05lqr74VW6TO0Itlt + INkkvAMkGI1e4jsJ5xd5K5qpq15vkb5xwr846YFvAypfb0XXIaWyK7+Oz5aXAtCVW8dfLt0FhPelO5n6 + CL+nEvD/AHX8BSDBEHp6AAAAAElFTkSuQmCC - - 282, 19 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 123 diff --git a/app.config b/app.config index 69d4667..a3de27b 100644 --- a/app.config +++ b/app.config @@ -12,7 +12,7 @@ - + diff --git a/bin/Debug/AForge.Math.dll b/bin/Debug/AForge.Math.dll new file mode 100644 index 0000000..c15ebb2 Binary files /dev/null and b/bin/Debug/AForge.Math.dll differ diff --git a/bin/Debug/AForge.dll b/bin/Debug/AForge.dll new file mode 100644 index 0000000..2f851a0 Binary files /dev/null and b/bin/Debug/AForge.dll differ diff --git a/bin/Debug/Accord.Math.dll b/bin/Debug/Accord.Math.dll new file mode 100644 index 0000000..84d60b9 Binary files /dev/null and b/bin/Debug/Accord.Math.dll differ diff --git a/bin/Debug/Accord.Statistics.dll b/bin/Debug/Accord.Statistics.dll new file mode 100644 index 0000000..4f31d5c Binary files /dev/null and b/bin/Debug/Accord.Statistics.dll differ diff --git a/bin/Debug/Accord.dll b/bin/Debug/Accord.dll new file mode 100644 index 0000000..9041e25 Binary files /dev/null and b/bin/Debug/Accord.dll differ diff --git a/bin/Debug/AlgLib.dll b/bin/Debug/AlgLib.dll new file mode 100644 index 0000000..eb22230 Binary files /dev/null and b/bin/Debug/AlgLib.dll differ diff --git a/bin/Debug/AviRecorder.dll b/bin/Debug/AviRecorder.dll new file mode 100644 index 0000000..7d0c756 Binary files /dev/null and b/bin/Debug/AviRecorder.dll differ diff --git a/bin/Debug/BioCSharp.dll b/bin/Debug/BioCSharp.dll new file mode 100644 index 0000000..42736e9 Binary files /dev/null and b/bin/Debug/BioCSharp.dll differ diff --git a/bin/Debug/BioCSharp.pdb b/bin/Debug/BioCSharp.pdb new file mode 100644 index 0000000..5b30b0f Binary files /dev/null and b/bin/Debug/BioCSharp.pdb differ diff --git a/bin/Debug/Cosmo.dll b/bin/Debug/Cosmo.dll new file mode 100644 index 0000000..e3603ce Binary files /dev/null and b/bin/Debug/Cosmo.dll differ diff --git a/bin/Debug/DataSetViewerControls.dll b/bin/Debug/DataSetViewerControls.dll new file mode 100644 index 0000000..bed762a Binary files /dev/null and b/bin/Debug/DataSetViewerControls.dll differ diff --git a/bin/Debug/DataSetViewerCore.dll b/bin/Debug/DataSetViewerCore.dll new file mode 100644 index 0000000..a61a692 Binary files /dev/null and b/bin/Debug/DataSetViewerCore.dll differ diff --git a/bin/Debug/DynamicDataDisplay.Controls.dll b/bin/Debug/DynamicDataDisplay.Controls.dll new file mode 100644 index 0000000..fa641b6 Binary files /dev/null and b/bin/Debug/DynamicDataDisplay.Controls.dll differ diff --git a/bin/Debug/DynamicDataDisplay.Maps.Extra.dll b/bin/Debug/DynamicDataDisplay.Maps.Extra.dll new file mode 100644 index 0000000..437bc0a Binary files /dev/null and b/bin/Debug/DynamicDataDisplay.Maps.Extra.dll differ diff --git a/bin/Debug/DynamicDataDisplay.Maps.dll b/bin/Debug/DynamicDataDisplay.Maps.dll new file mode 100644 index 0000000..f0b9a95 Binary files /dev/null and b/bin/Debug/DynamicDataDisplay.Maps.dll differ diff --git a/bin/Debug/DynamicDataDisplay.Markers.dll b/bin/Debug/DynamicDataDisplay.Markers.dll new file mode 100644 index 0000000..de583bc Binary files /dev/null and b/bin/Debug/DynamicDataDisplay.Markers.dll differ diff --git a/bin/Debug/DynamicDataDisplay.dll b/bin/Debug/DynamicDataDisplay.dll new file mode 100644 index 0000000..98b6d59 Binary files /dev/null and b/bin/Debug/DynamicDataDisplay.dll differ diff --git a/bin/Debug/DynamicDataDisplayViews.dll b/bin/Debug/DynamicDataDisplayViews.dll new file mode 100644 index 0000000..0c79f4b Binary files /dev/null and b/bin/Debug/DynamicDataDisplayViews.dll differ diff --git a/bin/Debug/Emgu.CV.dll b/bin/Debug/Emgu.CV.dll new file mode 100644 index 0000000..468f4fa Binary files /dev/null and b/bin/Debug/Emgu.CV.dll differ diff --git a/bin/Debug/Emgu.Util.dll b/bin/Debug/Emgu.Util.dll new file mode 100644 index 0000000..cb89e98 Binary files /dev/null and b/bin/Debug/Emgu.Util.dll differ diff --git a/bin/Debug/FreeImage.NET.dll b/bin/Debug/FreeImage.NET.dll new file mode 100644 index 0000000..3761ad7 Binary files /dev/null and b/bin/Debug/FreeImage.NET.dll differ diff --git a/bin/Debug/FreeImage.dll b/bin/Debug/FreeImage.dll new file mode 100644 index 0000000..b148316 Binary files /dev/null and b/bin/Debug/FreeImage.dll differ diff --git a/bin/Debug/HCSAnalyzer.application b/bin/Debug/HCSAnalyzer.application new file mode 100644 index 0000000..4df9dfd --- /dev/null +++ b/bin/Debug/HCSAnalyzer.application @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + YBSoivHCIl1oNy33ZxRc/Kxfcq+w8gs9JdZl4WdykdI= + + + + \ No newline at end of file diff --git a/bin/Debug/HCSAnalyzer.exe b/bin/Debug/HCSAnalyzer.exe new file mode 100644 index 0000000..26c2e13 Binary files /dev/null and b/bin/Debug/HCSAnalyzer.exe differ diff --git a/bin/Debug/HCSAnalyzer.exe.config b/bin/Debug/HCSAnalyzer.exe.config new file mode 100644 index 0000000..a3de27b --- /dev/null +++ b/bin/Debug/HCSAnalyzer.exe.config @@ -0,0 +1,23 @@ + + + + +
+ + + + + + http://soap.genome.jp/keggapi/request_v6.2.cgi + + + + + + + + + + + + diff --git a/bin/Debug/HCSAnalyzer.exe.manifest b/bin/Debug/HCSAnalyzer.exe.manifest new file mode 100644 index 0000000..7f2caad --- /dev/null +++ b/bin/Debug/HCSAnalyzer.exe.manifest @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8KOJnwib7U9JdLKRIi8YWOytNjiIiFViXVihhk80KsQ= + + + + + + + + + + + + MlvgoKHc8ZqLhru+z7L0NoTAC2Y4Sduw9zgSDMc7kKE= + + + + + + + + + + + + ROOsglSFnp4oKJRY9JZjOWgjZmJgOE2Fino8ko+ytHE= + + + + + + + + + + + + dOoGGvE9uB490Mj/QuL2GmwVX7p6Br73U0Rp0LaC6/Y= + + + + + + + + + + + + I26n5ALaj6ms4PfrFDOyKedcCJpFa2uqlmg4lMk+Pm4= + + + + + + + + + + + + orvTJce9vfsTnJVs0l3cLIVKW8J6DTMKcpEY0hX8x48= + + + + + + + + + + + + 8IzhgSOiUFUlqVUP2NiftA0mAvSp4MrWkVmYN05Ptlw= + + + + + + + + + + + + OwqhyweXx8w/t4mZJ9C8Me1eC/cpbL4t4AfwcONjWV4= + + + + + + + + + + + + UWH2aMLlI2dKoaGcuykhfwcs04J9zZsvN+UydZ6uG1w= + + + + + + + + + + + + T3pPGb3I8Y+lJPPes8AQvBnbnQoIaBnnR0Ixi44NVkA= + + + + + + + + + + + + /DVtur+HnWSULpUk52hXP5IjU+ELxV3Bx2YKD4MO/sI= + + + + + + + + + + + + xtKew1bu0hB/+/5L0wxQeRKE7n2eAH0aidhoGvodomw= + + + + + + + + + + + + pFFLzgsAfA+RrG/fyd1JX9SlTxI00KOoaZsxfVlNCPQ= + + + + + + + + + + + + JSRGnOx5Min0J6AkXr85eNEGWZJkRDcgLCdm7a455bI= + + + + + + + + + + + + LqcswZtROX7GtsKoPtYSDTmtFLd/+y1z7LGdeBUP9lM= + + + + + + + + + + + + bVaxaz2utuQjFWdvJ6JBPozuW94yUTUqyJeWvebUQD0= + + + + + + + + + + + + /advakMUFUP2zdPia1tFyiKZqtdBqlNZI1JsCC/tuDE= + + + + + + + + + + + + DE7mrDPZUhtxcBzZte/N7UAOVH7gMf0Y1nqH7nlzH8o= + + + + + + + + + + + + Zqi7bUZMKc71Ra4IxR3PjwpOYxDVoGRFWRPHqC7yfgQ= + + + + + + + + + + + + hDEUMU038nVuTJV0UHn5ycsLR9Kx1+9E7uMEvHlm6l0= + + + + + + + + + + + + wqQq374TSWtQHUfp70nTyDosjGFjcgZu7ohTONFB7X4= + + + + + + + + + + + + nLtFEWQq9LqfjTJ+P1CHx4s1qGauRrVETQE3yQJksD4= + + + + + + + + + + + + 1I0AW0SA/p/4cpayVGv3dXirugfWWL1uhLTnH44k/FU= + + + + + + + + + + + + 6zRtqzcEh4l0cvbl7FMiglD1zzUuG3+pj3PuejX3pa8= + + + + + + + + + + + + 7jk97KPFeCvbq1URUEGsWRVRfUXuh845xUyGfzL2P4M= + + + + + + + + + + + + kEsXbShajCmjdP9nIzREmPshLL+rZhFoSWt8S0xWTdw= + + + + + + + + + + + + w5hGrac1Gh+HSD070qT06C7MnWlNbeRDTQNl/qkhezo= + + + + + + + + + + + + OTAgwa9LTpjDE5bnj+FuUjlw9YgxipvW6Hy4VtSoi+s= + + + + + + + + + + + + 4FX9WU1Z0t2PdwDgx1xc1JeomZO3g5lQiHQF9vPaY64= + + + + + + + + + + + + nKECbYpu5JPf2QnU3zowrZAHe1iTIxQtUKEOZpsAyP0= + + + + + + + + + + + + Ktyzx0HR0//WOgP79hoN7obafRXXTLupTXa1u+FNurc= + + + + + + + + + + + + MHQayEZMIh3ooEzA8blC2q1bUeM94vxAcPd7RO34Y8A= + + + + + + + + + + + + uR39PCjv4qsMJrEAr3UY6Uto9j+w6oVFqIPYedSNP4s= + + + + + + + + + + + + quoc17XtvxXSG2uFE89cxqN6LWluIvkDJLZnFPhCSqo= + + + + + + + + + + + + dNNdP+gyRfeTv6aaeL4sy81FGMUkGj3n2eh6T/uMdT4= + + + + + + + + + + + + 4Y+jwhiQq+bqLOBQ4Q419Ga8oinjwmCFMbL0yZbOluE= + + + + + + + + + + + + VRNrGOI7Eqao15Zn+x1PROjnBe4P2hMDdhpCN906ctM= + + + + + + + + + + + + 9RtFrT2hHc0w7AySwKv5kj7t+WEeKhrg+V8SoKIOV7Q= + + + + + + + + + + + + JcqvRftiwBMXfTA1EuXhx9cPCIg9LNFd5OYnZC9pgMI= + + + + + + + + + + + + iP+0aOV+cIZBnhjVk7junLLxUKNNbYIZDyM9saNq66c= + + + + + + + + + + + + c2qaEVhfHpmvhvKqYrygbkEADogK0LdDnzpF7o6WY+A= + + + + + + + + + + + + b7qYEK4B2DGn+TLiBrZeVt2+ZI9daTDf5FLZqFdXBZQ= + + + + + + + + + + + + WcE8QTAUFF6HIkduMcHvTSaUH1PYP9fqieCijfbdk3k= + + + + + + + + + + + + IYSvp7pIOjt8unEI2xjNF0sf0NP4GkQWvokJdkp6V10= + + + + + + + + + + + + eGtZ2tznuTcJjjTN53Yp6KP5dI0iwD4Fy8fsz5Vqln0= + + + + + + + + + + + + BxjDLyGE/isXep8d+t/P/MLBdV3oT2WXMLojfhMzmvc= + + + + + + + + + + + + kmyGDNFNJGjHKLDiZyJbH3PnTRi7pcP2WsPocH9t83Q= + + + + + + + + + + + + 8hJyZUBkWNAb0geD9cMRzzdbLTnVwdA+aHYlK3b9g0Q= + + + + + + + + + + + + vVh/J0ypxp8GFxJbqQMaMbi5k3Fzcr3mQMJtD9v7j5g= + + + + + + + + + + + + 2wcQrKrt9SKkjJFpsft73X0RPZ1YAeGI8NzTMBWNMdI= + + + + + + + + + + + + veeJGlCkso/RwoTvFj9fiwmMSHQ5IEC37H3EG7OYjVo= + + + + + + + + + + + + uVuOW0FP3fnEzr02cSSq7HmRiLRBNzhrkmcmOucBOjI= + + + + + + + + + + + + hxV3+qsTJzt5/C9DdgAQUzJRvxeM8Qc5AD3y/yzw1OY= + + + + + + + + + + + + isqBFx7tOXKA0l5AeMof0r84VRi2y38xTYHBvDDWlS8= + + + + + + + + + + + + 4wKXB0Iu8uVcw2aMz+ADbWNfb1oVZTcnNfCIjdB3eJw= + + + + + + + + + + + + BP7EVxT4R2/XjSb5mXt2mxtecSp4Y+VHvpWeXhT/cvs= + + + + + + + + + + + + T7rkgGwP7my5YKuIEih91dnN+TAYEZYo2umJXTuDJ8U= + + + + + + + + + + + + wmA1PXzoVfv0P5Bxiu0VhtE7I5H5/i2q77nkRQxIpWM= + + + + + + + + + + + + jUUkMAZHEYAKpZNtYTYMJmiSQ4YIYHyvOUfdQum7a+U= + + + + + + + + + + + + AOJp8j/x7phKomo9bDR7cLpJM2svuB+dvd0seBlE+CQ= + + + + + + + + + + + + t9SfQ6zPy1Jv/GXjp6GxVsqM2tJfSAuPrF/RLaUZVqA= + + + + + + + + + + + + zrKGNYT1OyC+fCGh9IC8oEWgquZGI4V4vXUMNHAR1QQ= + + + + + + + + + + + + iGZyAXhWLUr7a0hOA4buoz7bbfGIfipQiTDxPU/AJf0= + + + + + + + + + + + + g49msnmXij1Vzkyjmm/lDNI/Q5LTibKAQuLFe1E76+g= + + + + + + + + + + YW7vPho7Zr+OmPJfQ+rtVJQ32cLG5zi/ybqfuPJzopA= + + + + + + + + + AOJzOomFU1O8eDvCEjjyNk/jG63GeS+46p+1Uw2WUcA= + + + + + + + + + riqnp/GV0TU9TOVK42QRSjnbJafehBgHAcFQnWsAIbg= + + + + + + + + + AJ2ThaNzw0s60ZlnY74ZNZrAQAbfREc4MmXi6CrukRQ= + + + + + + + + + P7l7JKeQFRtCUNerUEyoryN/X52C76maVCjEAbe3gW0= + + + + + + + + + QOX0W9BhofXgA3Jqwt3e/C5FCvIGCaNFomDQUNCHYho= + + + \ No newline at end of file diff --git a/bin/Debug/HCSAnalyzer.pdb b/bin/Debug/HCSAnalyzer.pdb new file mode 100644 index 0000000..7f9d337 Binary files /dev/null and b/bin/Debug/HCSAnalyzer.pdb differ diff --git a/bin/Debug/HCSAnalyzer.vshost.application b/bin/Debug/HCSAnalyzer.vshost.application new file mode 100644 index 0000000..2c78ac5 --- /dev/null +++ b/bin/Debug/HCSAnalyzer.vshost.application @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + AbTJkpGoD+d7sHYTHISVQKWgRtZwDq2F+HLfonG9msE= + + + + \ No newline at end of file diff --git a/bin/Debug/HCSAnalyzer.vshost.exe b/bin/Debug/HCSAnalyzer.vshost.exe new file mode 100644 index 0000000..8c84517 Binary files /dev/null and b/bin/Debug/HCSAnalyzer.vshost.exe differ diff --git a/bin/Debug/HCSAnalyzer.vshost.exe.config b/bin/Debug/HCSAnalyzer.vshost.exe.config new file mode 100644 index 0000000..a3de27b --- /dev/null +++ b/bin/Debug/HCSAnalyzer.vshost.exe.config @@ -0,0 +1,23 @@ + + + + +
+ + + + + + http://soap.genome.jp/keggapi/request_v6.2.cgi + + + + + + + + + + + + diff --git a/bin/Debug/HCSAnalyzer.vshost.exe.manifest b/bin/Debug/HCSAnalyzer.vshost.exe.manifest new file mode 100644 index 0000000..429e150 --- /dev/null +++ b/bin/Debug/HCSAnalyzer.vshost.exe.manifest @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8KOJnwib7U9JdLKRIi8YWOytNjiIiFViXVihhk80KsQ= + + + + + + + + + + + + MlvgoKHc8ZqLhru+z7L0NoTAC2Y4Sduw9zgSDMc7kKE= + + + + + + + + + + + + ROOsglSFnp4oKJRY9JZjOWgjZmJgOE2Fino8ko+ytHE= + + + + + + + + + + + + dOoGGvE9uB490Mj/QuL2GmwVX7p6Br73U0Rp0LaC6/Y= + + + + + + + + + + + + I26n5ALaj6ms4PfrFDOyKedcCJpFa2uqlmg4lMk+Pm4= + + + + + + + + + + + + orvTJce9vfsTnJVs0l3cLIVKW8J6DTMKcpEY0hX8x48= + + + + + + + + + + + + 8IzhgSOiUFUlqVUP2NiftA0mAvSp4MrWkVmYN05Ptlw= + + + + + + + + + + + + OwqhyweXx8w/t4mZJ9C8Me1eC/cpbL4t4AfwcONjWV4= + + + + + + + + + + + + UWH2aMLlI2dKoaGcuykhfwcs04J9zZsvN+UydZ6uG1w= + + + + + + + + + + + + T3pPGb3I8Y+lJPPes8AQvBnbnQoIaBnnR0Ixi44NVkA= + + + + + + + + + + + + /DVtur+HnWSULpUk52hXP5IjU+ELxV3Bx2YKD4MO/sI= + + + + + + + + + + + + xtKew1bu0hB/+/5L0wxQeRKE7n2eAH0aidhoGvodomw= + + + + + + + + + + + + pFFLzgsAfA+RrG/fyd1JX9SlTxI00KOoaZsxfVlNCPQ= + + + + + + + + + + + + JSRGnOx5Min0J6AkXr85eNEGWZJkRDcgLCdm7a455bI= + + + + + + + + + + + + LqcswZtROX7GtsKoPtYSDTmtFLd/+y1z7LGdeBUP9lM= + + + + + + + + + + + + bVaxaz2utuQjFWdvJ6JBPozuW94yUTUqyJeWvebUQD0= + + + + + + + + + + + + /advakMUFUP2zdPia1tFyiKZqtdBqlNZI1JsCC/tuDE= + + + + + + + + + + + + DE7mrDPZUhtxcBzZte/N7UAOVH7gMf0Y1nqH7nlzH8o= + + + + + + + + + + + + Zqi7bUZMKc71Ra4IxR3PjwpOYxDVoGRFWRPHqC7yfgQ= + + + + + + + + + + + + s6IL7ZCn1vtcnk7kIJdAXp3vwYIcUWMLT2Wz/+/t5vg= + + + + + + + + + + + + wqQq374TSWtQHUfp70nTyDosjGFjcgZu7ohTONFB7X4= + + + + + + + + + + + + nLtFEWQq9LqfjTJ+P1CHx4s1qGauRrVETQE3yQJksD4= + + + + + + + + + + + + 1I0AW0SA/p/4cpayVGv3dXirugfWWL1uhLTnH44k/FU= + + + + + + + + + + + + 6zRtqzcEh4l0cvbl7FMiglD1zzUuG3+pj3PuejX3pa8= + + + + + + + + + + + + 7jk97KPFeCvbq1URUEGsWRVRfUXuh845xUyGfzL2P4M= + + + + + + + + + + + + kEsXbShajCmjdP9nIzREmPshLL+rZhFoSWt8S0xWTdw= + + + + + + + + + + + + w5hGrac1Gh+HSD070qT06C7MnWlNbeRDTQNl/qkhezo= + + + + + + + + + + + + OTAgwa9LTpjDE5bnj+FuUjlw9YgxipvW6Hy4VtSoi+s= + + + + + + + + + + + + 4FX9WU1Z0t2PdwDgx1xc1JeomZO3g5lQiHQF9vPaY64= + + + + + + + + + + + + nKECbYpu5JPf2QnU3zowrZAHe1iTIxQtUKEOZpsAyP0= + + + + + + + + + + + + Ktyzx0HR0//WOgP79hoN7obafRXXTLupTXa1u+FNurc= + + + + + + + + + + + + MHQayEZMIh3ooEzA8blC2q1bUeM94vxAcPd7RO34Y8A= + + + + + + + + + + + + uR39PCjv4qsMJrEAr3UY6Uto9j+w6oVFqIPYedSNP4s= + + + + + + + + + + + + quoc17XtvxXSG2uFE89cxqN6LWluIvkDJLZnFPhCSqo= + + + + + + + + + + + + dNNdP+gyRfeTv6aaeL4sy81FGMUkGj3n2eh6T/uMdT4= + + + + + + + + + + + + 4Y+jwhiQq+bqLOBQ4Q419Ga8oinjwmCFMbL0yZbOluE= + + + + + + + + + + + + VRNrGOI7Eqao15Zn+x1PROjnBe4P2hMDdhpCN906ctM= + + + + + + + + + + + + 9RtFrT2hHc0w7AySwKv5kj7t+WEeKhrg+V8SoKIOV7Q= + + + + + + + + + + + + JcqvRftiwBMXfTA1EuXhx9cPCIg9LNFd5OYnZC9pgMI= + + + + + + + + + + + + iP+0aOV+cIZBnhjVk7junLLxUKNNbYIZDyM9saNq66c= + + + + + + + + + + + + c2qaEVhfHpmvhvKqYrygbkEADogK0LdDnzpF7o6WY+A= + + + + + + + + + + + + b7qYEK4B2DGn+TLiBrZeVt2+ZI9daTDf5FLZqFdXBZQ= + + + + + + + + + + + + WcE8QTAUFF6HIkduMcHvTSaUH1PYP9fqieCijfbdk3k= + + + + + + + + + + + + IYSvp7pIOjt8unEI2xjNF0sf0NP4GkQWvokJdkp6V10= + + + + + + + + + + + + eGtZ2tznuTcJjjTN53Yp6KP5dI0iwD4Fy8fsz5Vqln0= + + + + + + + + + + + + BxjDLyGE/isXep8d+t/P/MLBdV3oT2WXMLojfhMzmvc= + + + + + + + + + + + + kmyGDNFNJGjHKLDiZyJbH3PnTRi7pcP2WsPocH9t83Q= + + + + + + + + + + + + 8hJyZUBkWNAb0geD9cMRzzdbLTnVwdA+aHYlK3b9g0Q= + + + + + + + + + + + + vVh/J0ypxp8GFxJbqQMaMbi5k3Fzcr3mQMJtD9v7j5g= + + + + + + + + + + + + 2wcQrKrt9SKkjJFpsft73X0RPZ1YAeGI8NzTMBWNMdI= + + + + + + + + + + + + veeJGlCkso/RwoTvFj9fiwmMSHQ5IEC37H3EG7OYjVo= + + + + + + + + + + + + uVuOW0FP3fnEzr02cSSq7HmRiLRBNzhrkmcmOucBOjI= + + + + + + + + + + + + hxV3+qsTJzt5/C9DdgAQUzJRvxeM8Qc5AD3y/yzw1OY= + + + + + + + + + + + + isqBFx7tOXKA0l5AeMof0r84VRi2y38xTYHBvDDWlS8= + + + + + + + + + + + + 4wKXB0Iu8uVcw2aMz+ADbWNfb1oVZTcnNfCIjdB3eJw= + + + + + + + + + + + + BP7EVxT4R2/XjSb5mXt2mxtecSp4Y+VHvpWeXhT/cvs= + + + + + + + + + + + + T7rkgGwP7my5YKuIEih91dnN+TAYEZYo2umJXTuDJ8U= + + + + + + + + + + + + wmA1PXzoVfv0P5Bxiu0VhtE7I5H5/i2q77nkRQxIpWM= + + + + + + + + + + + + jUUkMAZHEYAKpZNtYTYMJmiSQ4YIYHyvOUfdQum7a+U= + + + + + + + + + + + + AOJp8j/x7phKomo9bDR7cLpJM2svuB+dvd0seBlE+CQ= + + + + + + + + + + + + t9SfQ6zPy1Jv/GXjp6GxVsqM2tJfSAuPrF/RLaUZVqA= + + + + + + + + + + + + zrKGNYT1OyC+fCGh9IC8oEWgquZGI4V4vXUMNHAR1QQ= + + + + + + + + + + + + iGZyAXhWLUr7a0hOA4buoz7bbfGIfipQiTDxPU/AJf0= + + + + + + + + + + + + g49msnmXij1Vzkyjmm/lDNI/Q5LTibKAQuLFe1E76+g= + + + + + + + + + + YW7vPho7Zr+OmPJfQ+rtVJQ32cLG5zi/ybqfuPJzopA= + + + + + + + + + AOJzOomFU1O8eDvCEjjyNk/jG63GeS+46p+1Uw2WUcA= + + + + + + + + + riqnp/GV0TU9TOVK42QRSjnbJafehBgHAcFQnWsAIbg= + + + + + + + + + AJ2ThaNzw0s60ZlnY74ZNZrAQAbfREc4MmXi6CrukRQ= + + + + + + + + + P7l7JKeQFRtCUNerUEyoryN/X52C76maVCjEAbe3gW0= + + + + + + + + + QOX0W9BhofXgA3Jqwt3e/C5FCvIGCaNFomDQUNCHYho= + + + \ No newline at end of file diff --git a/bin/Debug/HCSPlugin.dll b/bin/Debug/HCSPlugin.dll new file mode 100644 index 0000000..0d57cc1 Binary files /dev/null and b/bin/Debug/HCSPlugin.dll differ diff --git a/bin/Debug/ICSharpCode.SharpZipLib.dll b/bin/Debug/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000..77bafe8 Binary files /dev/null and b/bin/Debug/ICSharpCode.SharpZipLib.dll differ diff --git a/bin/Debug/IKVM.AWT.WinForms.dll b/bin/Debug/IKVM.AWT.WinForms.dll new file mode 100644 index 0000000..154bc2e Binary files /dev/null and b/bin/Debug/IKVM.AWT.WinForms.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Beans.dll b/bin/Debug/IKVM.OpenJDK.Beans.dll new file mode 100644 index 0000000..c2402c4 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Beans.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Charsets.dll b/bin/Debug/IKVM.OpenJDK.Charsets.dll new file mode 100644 index 0000000..1bcff82 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Charsets.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Corba.dll b/bin/Debug/IKVM.OpenJDK.Corba.dll new file mode 100644 index 0000000..22c6f5a Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Corba.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Core.dll b/bin/Debug/IKVM.OpenJDK.Core.dll new file mode 100644 index 0000000..dce0118 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Core.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Jdbc.dll b/bin/Debug/IKVM.OpenJDK.Jdbc.dll new file mode 100644 index 0000000..49c54d2 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Jdbc.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Management.dll b/bin/Debug/IKVM.OpenJDK.Management.dll new file mode 100644 index 0000000..8d566ab Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Management.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Media.dll b/bin/Debug/IKVM.OpenJDK.Media.dll new file mode 100644 index 0000000..1ed612e Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Media.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Misc.dll b/bin/Debug/IKVM.OpenJDK.Misc.dll new file mode 100644 index 0000000..a4a51e4 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Misc.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Naming.dll b/bin/Debug/IKVM.OpenJDK.Naming.dll new file mode 100644 index 0000000..a148b04 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Naming.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Remoting.dll b/bin/Debug/IKVM.OpenJDK.Remoting.dll new file mode 100644 index 0000000..a897d5c Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Remoting.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Security.dll b/bin/Debug/IKVM.OpenJDK.Security.dll new file mode 100644 index 0000000..659682f Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Security.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.SwingAWT.dll b/bin/Debug/IKVM.OpenJDK.SwingAWT.dll new file mode 100644 index 0000000..53dce66 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.SwingAWT.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Text.dll b/bin/Debug/IKVM.OpenJDK.Text.dll new file mode 100644 index 0000000..6fc4f19 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Text.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Tools.dll b/bin/Debug/IKVM.OpenJDK.Tools.dll new file mode 100644 index 0000000..baec57c Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Tools.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.Util.dll b/bin/Debug/IKVM.OpenJDK.Util.dll new file mode 100644 index 0000000..2244658 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.Util.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.API.dll b/bin/Debug/IKVM.OpenJDK.XML.API.dll new file mode 100644 index 0000000..d183463 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.API.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.Bind.dll b/bin/Debug/IKVM.OpenJDK.XML.Bind.dll new file mode 100644 index 0000000..9a646eb Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.Bind.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.Crypto.dll b/bin/Debug/IKVM.OpenJDK.XML.Crypto.dll new file mode 100644 index 0000000..6952e6f Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.Crypto.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.Parse.dll b/bin/Debug/IKVM.OpenJDK.XML.Parse.dll new file mode 100644 index 0000000..8c565b1 Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.Parse.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.Transform.dll b/bin/Debug/IKVM.OpenJDK.XML.Transform.dll new file mode 100644 index 0000000..6ca0f6e Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.Transform.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.WebServices.dll b/bin/Debug/IKVM.OpenJDK.XML.WebServices.dll new file mode 100644 index 0000000..20f2bfa Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.WebServices.dll differ diff --git a/bin/Debug/IKVM.OpenJDK.XML.XPath.dll b/bin/Debug/IKVM.OpenJDK.XML.XPath.dll new file mode 100644 index 0000000..b382b2f Binary files /dev/null and b/bin/Debug/IKVM.OpenJDK.XML.XPath.dll differ diff --git a/bin/Debug/IKVM.Reflection.dll b/bin/Debug/IKVM.Reflection.dll new file mode 100644 index 0000000..c2b777c Binary files /dev/null and b/bin/Debug/IKVM.Reflection.dll differ diff --git a/bin/Debug/IKVM.Runtime.JNI.dll b/bin/Debug/IKVM.Runtime.JNI.dll new file mode 100644 index 0000000..14e7224 Binary files /dev/null and b/bin/Debug/IKVM.Runtime.JNI.dll differ diff --git a/bin/Debug/IKVM.Runtime.dll b/bin/Debug/IKVM.Runtime.dll new file mode 100644 index 0000000..aa9799e Binary files /dev/null and b/bin/Debug/IKVM.Runtime.dll differ diff --git a/bin/Debug/Kitware.VTK.dll b/bin/Debug/Kitware.VTK.dll new file mode 100644 index 0000000..a73fa63 Binary files /dev/null and b/bin/Debug/Kitware.VTK.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll new file mode 100644 index 0000000..0ddf04b Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll new file mode 100644 index 0000000..ed6d15d Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll new file mode 100644 index 0000000..a547767 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll new file mode 100644 index 0000000..1d86e3f Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll new file mode 100644 index 0000000..13c74bf Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll new file mode 100644 index 0000000..0137866 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll new file mode 100644 index 0000000..e4cb7d6 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkIO.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkIO.Unmanaged.dll new file mode 100644 index 0000000..17c5654 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkIO.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll new file mode 100644 index 0000000..43d24f2 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll new file mode 100644 index 0000000..c2065ad Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll new file mode 100644 index 0000000..a77bf71 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll new file mode 100644 index 0000000..979d2fc Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkViews.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkViews.Unmanaged.dll new file mode 100644 index 0000000..75ef047 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkViews.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll new file mode 100644 index 0000000..8afddf4 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll b/bin/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll new file mode 100644 index 0000000..4728ce7 Binary files /dev/null and b/bin/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.mummy.Runtime.Unmanaged.dll b/bin/Debug/Kitware.mummy.Runtime.Unmanaged.dll new file mode 100644 index 0000000..3cf2f2c Binary files /dev/null and b/bin/Debug/Kitware.mummy.Runtime.Unmanaged.dll differ diff --git a/bin/Debug/Kitware.mummy.Runtime.dll b/bin/Debug/Kitware.mummy.Runtime.dll new file mode 100644 index 0000000..fb2b32b Binary files /dev/null and b/bin/Debug/Kitware.mummy.Runtime.dll differ diff --git a/bin/Debug/MIConvexHullPlugin.dll b/bin/Debug/MIConvexHullPlugin.dll new file mode 100644 index 0000000..f04ae0b Binary files /dev/null and b/bin/Debug/MIConvexHullPlugin.dll differ diff --git a/bin/Debug/MINE.dll b/bin/Debug/MINE.dll new file mode 100644 index 0000000..81ce60d Binary files /dev/null and b/bin/Debug/MINE.dll differ diff --git a/bin/Debug/MathNet.Numerics.IO.dll b/bin/Debug/MathNet.Numerics.IO.dll new file mode 100644 index 0000000..09c3a22 Binary files /dev/null and b/bin/Debug/MathNet.Numerics.IO.dll differ diff --git a/bin/Debug/MathNet.Numerics.IO.pdb b/bin/Debug/MathNet.Numerics.IO.pdb new file mode 100644 index 0000000..d1854fb Binary files /dev/null and b/bin/Debug/MathNet.Numerics.IO.pdb differ diff --git a/bin/Debug/MathNet.Numerics.IO.xml b/bin/Debug/MathNet.Numerics.IO.xml new file mode 100644 index 0000000..c390792 --- /dev/null +++ b/bin/Debug/MathNet.Numerics.IO.xml @@ -0,0 +1,1145 @@ + + + + MathNet.Numerics.IO + + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Base class to read a single from a file or stream. + + The type of Matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Reads a from a file. + + The file to read the matrix from. + A containing the data from the file. is returned if the file is empty. + If is . + If the file doesn't exist. + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Reads a from a . + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + If is . + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Subclasses override this method to do the actual reading. + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + + + + The function that will do the conversion for a given type. + + + + + Initializes static members of the class. + + + + + Converts the string into a Complex32. + + The number to convert. + The converted number. + + + + Converts the string into a Complex. + + The number to convert. + The converted number. + + + + Converts the string into a double. + + The number to convert. + The converted number. + + + + Converts the string into a float. + + The number to convert. + The converted number. + + + + Constructor to create matrix instance. + + + + + The base regular expression. + + + + + The regular expression to use. + + + + + The to use. + + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Performs the actual reading. + + The to read the matrix from. + + A matrix containing the data from the . is returned if the is empty. + + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + + + + Gets or sets a value indicating whether the files has a header row. + + + true if this instance has a header row; otherwise, false. + + Defaults to . + + + + Converts a string into the given data type. + + + The number as a string to convert. + + The converted number. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Creates matrices from Matlab files. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + The name of the file to read from. + + + + + The stream to read from if we are not reading from a file directly. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Reads the first matrix from the file or stream. + + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + + + + + Reads the named matrix from the file or stream. + + The name of the matrix to read. + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + is returned if a matrix with the requests name doesn't exist. + + + + + Reads all matrices from the file or stream. + + All matrices from the file or stream. The key to the + is the matrix's name. + + + + Reads the named matrices from the file or stream. + + The names of the matrices to retrieve. + + The named matrices from the file or stream. The key to the + is the matrix's name. + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Writes an to delimited text file. If the user does not + specify a delimiter, a tab separator is used. + + + + + Base class to write a single to a file or stream. + + + + + The to use. + + + + + Writes the given to the given file. If the file already exists, + the file will be overwritten. + + The matrix to write. + The file to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given stream. + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given . + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Subclasses must implement this method to do the actually writing. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to serialize. + The to write the matrix to. + The number format to use. + The culture to use. + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + This property is only used for matrix writers that write out text files. + + + + Gets or sets he number format to use. + + The number format to use when writing out each element. + This property is only used for matrix writers that write out text files. + + + + The delimiter to use. + + + + + Initializes a new instance of the class. + a comma as the delimiter. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Writes the given to the given . + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to write. + The to write the matrix to. + The number format to use on each element. + The culture to use. + If either or is null. + + + + Gets or sets the column header values. + + The column header values. + Will write the column headers if the list is not empty or null. + + + + Writes matrices to a Matlab file. + + + + + The file header value + + + + + The length of the header text. + + + + + Have we written the header yet. + + + + + The binary writer to write to. + + + + + Initializes a new instance of the class. + + The name of the Matlab file to save the matrices to. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Writes the given to the file. + + The matrix to write. + The name of the matrix to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the file. + + The matrices to write. + The names of the matrices to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Closes the stream the being written to. + + Calls . + + + + Writes the matrix tag and name. + + The writer we are using. + The array class we are writing. + if set to true if this a complex matrix. + The name name of the matrix. + The number of rows. + The columns of columns. + The maximum number of non-zero elements. + + + + Compresses the data array. + + The data to compress. + The compressed data. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Writes the compressed data. + + The data to write. + + + + Writes the file header. + + + + + Pads the data with the given byte. + + Where to write the pad values. + The number of bytes to pad. + What value to pad with. + + + + Computes the Adler-32 checksum of the given data. + + The data to create the checksum. + The checksum + + + + Enumeration for the Matlab array types + + + + + mxUNKNOWN CLASS + + + + + mxCELL CLASS + + + + + mxSTRUCT CLASS + + + + + mxOBJECT CLASS + + + + + mxCHAR CLASS + + + + + mxSPARSE CLASS + + + + + mxDOUBLE CLASS + + + + + mxSINGLE CLASS + + + + + mxINT8 CLASS + + + + + mxUINT8 CLASS + + + + + mxINT16 CLASS + + + + + mxUINT16 CLASS + + + + + mxINT32 CLASS + + + + + mxUINT32 CLASS + + + + + mxINT64 CLASS + + + + + mxUINT64 CLASS + + + + + mxFUNCTION CLASS + + + + + Matlab Array Flags + + + + + Complex flag + + + + + Global flag + + + + + Logical flag + + + + + Matlab data types + + + + + Unkown type + + + + + miINT8 type + + + + + miUINT8 type + + + + + miINT16 type + + + + + miUINT16 type + + + + + miINT32 type + + + + + miUINT32 type + + + + + miSINGLE type + + + + + miDOUBLE type + + + + + miINT64 type + + + + + miUINT6 4type + + + + + miMATRIX type + + + + + miCOMPRESSED type + + + + + miUTF8 type + + + + + miUTF16 type + + + + + miUTF32 type + + + + + Represents a Matlab file + + The data type of the matrix to return. + + + + Matrices in a matlab file stored as 1-D arrays + + + + + Gets or sets the header text. + + The header text. + + + + Gets or sets the first name of the matrix. + + The first name of the matrix. + + + + Gets the first matrix. + + The first matrix. + + + + Gets the matrices. + + The matrices. + + + + Parse a Matlab file + + The data type of the matrix. + + + + Large Block Size + + + + + Little Endian Indicator + + + + + Small Block Size + + + + + Holds the names of the matrices in the file. + + + + + The stream to read the matlab file from. + + + + + Initializes a new instance of the class. + + Name of the file. + + + + Initializes a new instance of the class. + + The stream to read from. + + + + Initializes a new instance of the class. + + The stream to read from. + The name of the objects to retrieve. + + + + Initializes a new instance of the class. + + Name of the file. + The name of the objects to retrieve. + + + + Copies the names of the objects to retrieve to a local field. + + The name of the objects to retrieve. + + + + Parses the file. + + The parsed Matlab file as a object. + + + + Aligns the data. + + The stream. + The size of the array. + if set to true if reading from a small block. + + + + Decompresses the block. + + The compressed data. + The type data type contained in the block. + The decompressed block. + + + + Adds a matrix from the actual file into our presentation of a matlab file. + + The data of the matrix. + The instance. + + + + Populates a sparse matrix. + + The reader. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The size of the block. + A populated sparse matrix. + + + + Populates the double sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the float sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the complex sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates the complex32 sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates a dense matrix. + + The Matlab data type. + The reader to read from. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The length of the stored data. + Returns a populated dense matrix. + + + + Populates the double dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Populates the complex dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the complex32 dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the float dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Creates a matrix. + + if set to true, creates a sparse matrix. + The number of rows. + The number of columns. + A matrix with the specified storage. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + diff --git a/bin/Debug/MathNet.Numerics.dll b/bin/Debug/MathNet.Numerics.dll new file mode 100644 index 0000000..89f9e7d Binary files /dev/null and b/bin/Debug/MathNet.Numerics.dll differ diff --git a/bin/Debug/MathNet.Numerics.pdb b/bin/Debug/MathNet.Numerics.pdb new file mode 100644 index 0000000..90349fa Binary files /dev/null and b/bin/Debug/MathNet.Numerics.pdb differ diff --git a/bin/Debug/MathNet.Numerics.xml b/bin/Debug/MathNet.Numerics.xml new file mode 100644 index 0000000..6c9973f --- /dev/null +++ b/bin/Debug/MathNet.Numerics.xml @@ -0,0 +1,45847 @@ + + + + MathNet.Numerics + + + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + Supported data types are double, single, , and . + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiply elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. On exit, work[0] contains the optimal work size value. + + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix + The number of columns of B. + On exit, the solution matrix. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + The B matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Not used in the managed provider. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + How to transpose a matrix. + + + + + Don't transpose a matrix. + + + + + Transpose a matrix. + + + + + Conjugate transpose a complex matrix. + + If a conjugate transpose is used with a real matrix, then the matrix is just transposed. + + + + Types of matrix norms. + + + + + The 1-norm. + + + + + The Frobenius norm. + + + + + The infinity norm. + + + + + The largest absolute value norm. + + + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex.One and beta set to Complex.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex32.One and beta set to Complex32.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex32.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0f and beta set to 0.0f, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0f + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + P/Invoke methods to the native math libraries. + + + + + Name of the native DLL. + + + + + Useful extension methods for Arrays. + + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Enumerative Combinatorics and Counting. + + + + + Counts the number of possible variations without repetition. + The order matters and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of distinct variations. + + + + Counts the number of possible variations with repetition. + The order matters and each object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of distinct variations with repetition. + + + + Counts the number of possible combinations without repetition. + The order does not matter and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of combinations. + + + + Counts the number of possible combinations with repetition. + The order does not matter and an object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of combinations with repetition. + + + + Counts the number of possible permutations (without repetition). + + Number of (distinguishable) elements in the set. + Maximum number of permutations without repetition. + + + + Extension methods for the Complex type provided by System.Numerics + + + + + Gets the squared magnitude of the Complex number. + + The number to perfom this operation on. + The squared magnitude of the Complex number. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex. + + + + Gets the conjugate of the Complex number. + + The number to perfom this operation on. + + The semantic of setting the conjugate is such that + + // a, b of type Complex32 + a.Conjugate = b; + + is equivalent to + + // a, b of type Complex32 + a = b.Conjugate + + + The conjugate of the number. + + + + Returns the multiplicative inverse of a complex number. + + + + + Exponential of this Complex (exp(x), E^x). + + The number to perfom this operation on. + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex (Base E). + + The number to perfom this operation on. + + The natural logarithm of this complex number. + + + + + Common Logarithm of this Complex (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex with custom base. + + The logarithm of this complex number. + + + + Raise this Complex to the given value. + + The number to perfom this operation on. + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex to the inverse of the given value. + + The number to perfom this operation on. + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex + + The number to perfom this operation on. + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex + + The number to perfom this operation on. + + The square root of this complex number. + + + + + Gets a value indicating whether the Complex32 is zero. + + The number to perfom this operation on. + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + The number to perfom this operation on. + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + The number to perfom this operation on. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + The number to perfom this operation on. + + true if this instance is NaN; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + The number to perfom this operation on. + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + The number to perfom this operation on. + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + The number to perfom this operation on. + + true if this instance is real nonnegative number; otherwise, false. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + The number to perfom this operation on. + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The number to perfom this operation on. + The value to compare with. + A norm of the difference between this and the other value. + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as double. + + + + + Converts the string representation of a complex number to a double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + A collection of frequently used mathematical constants. + + + + The number e + + + The number log[2](e) + + + The number log[10](e) + + + The number log[e](2) + + + The number log[e](10) + + + The number log[e](pi) + + + The number log[e](2*pi)/2 + + + The number 1/e + + + The number sqrt(e) + + + The number sqrt(2) + + + The number sqrt(1/2) = 1/sqrt(2) = sqrt(2)/2 + + + The number sqrt(3)/2 + + + The number pi + + + The number 2*pi + + + The number 1/pi + + + The number pi/2 + + + The number pi/4 + + + The number sqrt(pi) + + + The number sqrt(2pi) + + + The number sqrt(2*pi*e) + + + The number log(sqrt(2*pi)) + + + The number log(sqrt(2*pi*e)) + + + The number log(2 * sqrt(e / pi)) + + + The number 1/pi + + + The number 2/pi + + + The number 1/sqrt(pi) + + + The number 1/sqrt(2pi) + + + The number 2/sqrt(pi) + + + The number 2 * sqrt(e / pi) + + + The number (pi)/180 - factor to convert from Degree (deg) to Radians (rad). + + + + + The number (pi)/200 - factor to convert from NewGrad (grad) to Radians (rad). + + + + + The number ln(10)/20 - factor to convert from Power Decibel (dB) to Neper (Np). Use this version when the Decibel represent a power gain but the compared values are not powers (e.g. amplitude, current, voltage). + + + The number ln(10)/10 - factor to convert from Neutral Decibel (dB) to Neper (Np). Use this version when either both or neither of the Decibel and the compared values represent powers. + + + The Catalan constant + Sum(k=0 -> inf){ (-1)^k/(2*k + 1)2 } + + + The Euler-Mascheroni constant + lim(n -> inf){ Sum(k=1 -> n) { 1/k - log(n) } } + + + The number (1+sqrt(5))/2, also known as the golden ratio + + + The Glaisher constant + e^(1/12 - Zeta(-1)) + + + The Khinchin constant + prod(k=1 -> inf){1+1/(k*(k+2))^log(k,2)} + + + + The size of a double in bytes. + + + + + The size of an int in bytes. + + + + + The size of a float in bytes. + + + + + The size of a Complex in bytes. + + + + + The size of a Complex in bytes. + + + + Speed of Light in Vacuum: c_0 = 2.99792458e8 [m s^-1] (defined, exact; 2007 CODATA) + + + Magnetic Permeability in Vacuum: mu_0 = 4*Pi * 10^-7 [N A^-2 = kg m A^-2 s^-2] (defined, exact; 2007 CODATA) + + + Electric Permittivity in Vacuum: epsilon_0 = 1/(mu_0*c_0^2) [F m^-1 = A^2 s^4 kg^-1 m^-3] (defined, exact; 2007 CODATA) + + + Characteristic Impedance of Vacuum: Z_0 = mu_0*c_0 [Ohm = m^2 kg s^-3 A^-2] (defined, exact; 2007 CODATA) + + + Newtonian Constant of Gravitation: G = 6.67429e-11 [m^3 kg^-1 s^-2] (2007 CODATA) + + + Planck's constant: h = 6.62606896e-34 [J s = m^2 kg s^-1] (2007 CODATA) + + + Reduced Planck's constant: h_bar = h / (2*Pi) [J s = m^2 kg s^-1] (2007 CODATA) + + + Planck mass: m_p = (h_bar*c_0/G)^(1/2) [kg] (2007 CODATA) + + + Planck temperature: T_p = (h_bar*c_0^5/G)^(1/2)/k [K] (2007 CODATA) + + + Planck length: l_p = h_bar/(m_p*c_0) [m] (2007 CODATA) + + + Planck time: t_p = l_p/c_0 [s] (2007 CODATA) + + + Elementary Electron Charge: e = 1.602176487e-19 [C = A s] (2007 CODATA) + + + Magnetic Flux Quantum: theta_0 = h/(2*e) [Wb = m^2 kg s^-2 A^-1] (2007 CODATA) + + + Conductance Quantum: G_0 = 2*e^2/h [S = m^-2 kg^-1 s^3 A^2] (2007 CODATA) + + + Josephson Constant: K_J = 2*e/h [Hz V^-1] (2007 CODATA) + + + Von Klitzing Constant: R_K = h/e^2 [Ohm = m^2 kg s^-3 A^-2] (2007 CODATA) + + + Bohr Magneton: mu_B = e*h_bar/2*m_e [J T^-1] (2007 CODATA) + + + Nuclear Magneton: mu_N = e*h_bar/2*m_p [J T^-1] (2007 CODATA) + + + Fine Structure Constant: alpha = e^2/4*Pi*e_0*h_bar*c_0 [1] (2007 CODATA) + + + Rydberg Constant: R_infty = alpha^2*m_e*c_0/2*h [m^-1] (2007 CODATA) + + + Bor Radius: a_0 = alpha/4*Pi*R_infty [m] (2007 CODATA) + + + Hartree Energy: E_h = 2*R_infty*h*c_0 [J] (2007 CODATA) + + + Quantum of Circulation: h/2*m_e [m^2 s^-1] (2007 CODATA) + + + Fermi Coupling Constant: G_F/(h_bar*c_0)^3 [GeV^-2] (2007 CODATA) + + + Weak Mixin Angle: sin^2(theta_W) [1] (2007 CODATA) + + + Electron Mass: [kg] (2007 CODATA) + + + Electron Mass Energy Equivalent: [J] (2007 CODATA) + + + Electron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Electron Compton Wavelength: [m] (2007 CODATA) + + + Classical Electron Radius: [m] (2007 CODATA) + + + Tomson Cross Section: [m^2] (2002 CODATA) + + + Electron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Electon G-Factor: [1] (2007 CODATA) + + + Muon Mass: [kg] (2007 CODATA) + + + Muon Mass Energy Equivalent: [J] (2007 CODATA) + + + Muon Molar Mass: [kg mol^-1] (2007 CODATA) + + + Muon Compton Wavelength: [m] (2007 CODATA) + + + Muon Magnetic Moment: [J T^-1] (2007 CODATA) + + + Muon G-Factor: [1] (2007 CODATA) + + + Tau Mass: [kg] (2007 CODATA) + + + Tau Mass Energy Equivalent: [J] (2007 CODATA) + + + Tau Molar Mass: [kg mol^-1] (2007 CODATA) + + + Tau Compton Wavelength: [m] (2007 CODATA) + + + Proton Mass: [kg] (2007 CODATA) + + + Proton Mass Energy Equivalent: [J] (2007 CODATA) + + + Proton Molar Mass: [kg mol^-1] (2007 CODATA) + + + Proton Compton Wavelength: [m] (2007 CODATA) + + + Proton Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton G-Factor: [1] (2007 CODATA) + + + Proton Shielded Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Proton Shielded Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Neutron Mass: [kg] (2007 CODATA) + + + Neutron Mass Energy Equivalent: [J] (2007 CODATA) + + + Neutron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Neuron Compton Wavelength: [m] (2007 CODATA) + + + Neutron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Neutron G-Factor: [1] (2007 CODATA) + + + Neutron Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Deuteron Mass: [kg] (2007 CODATA) + + + Deuteron Mass Energy Equivalent: [J] (2007 CODATA) + + + Deuteron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Deuteron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Helion Mass: [kg] (2007 CODATA) + + + Helion Mass Energy Equivalent: [J] (2007 CODATA) + + + Helion Molar Mass: [kg mol^-1] (2007 CODATA) + + + Avogadro constant: [mol^-1] (2010 CODATA) + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 + + + The SI prefix factor corresponding to 1 000 + + + The SI prefix factor corresponding to 100 + + + The SI prefix factor corresponding to 10 + + + The SI prefix factor corresponding to 0.1 + + + The SI prefix factor corresponding to 0.01 + + + The SI prefix factor corresponding to 0.001 + + + The SI prefix factor corresponding to 0.000 001 + + + The SI prefix factor corresponding to 0.000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 000 001 + + + + Sets parameters for the library. + + + + + Given the number elements, should the operation be parallelized. + + The number elements to check. + true if the operation should be parallelized; false otherwise. + + + + Gets or sets a value indicating whether the distribution classes check validate each parameter. + For the multivariate distributions this could involve an expensive matrix factorization. + The default setting of this property is true. + + + + + Gets or sets a value indicating whether to use thread safe random number generators (RNG). + Thread safe RNG about two and half time slower than non-thread safe RNG. + + + true to use thread safe random number generators ; otherwise, false. + + + + + Gets or sets a value indicating whether parallelization shall be disabled globally. + + + + + Gets or sets the linear algebra provider. + + The linear algebra provider. + + + + Gets or sets a value indicating how many parallel worker threads shall be used + when parallelization is applicable. + + Default to the number of processor cores, must be between 1 and 1024 (inclusive). + + + + Gets or sets the the block size to use for + the native linear algebra provider. + + The block size. Default 512, must be at least 32. + + + + Gets or sets the order of the matrix when linear algebra provider + must calculate multiply in parallel threads. + + The order. Default 64, must be at least 3. + + + + Gets or sets the number of elements a vector or matrix + must contain before we multiply threads. + + Number of elements. Default 300, must be at least 3. + + + + Maximum number of columns to print in ToString methods by default. + + + + + Maximum number of rows to print in ToString methods by default. + + + + + 32-bit single precision complex numbers class. + + + + The class Complex32 provides all elementary operations + on complex numbers. All the operators +, -, + *, /, ==, != are defined in the + canonical way. Additional complex trigonometric functions + are also provided. Note that the Complex32 structures + has two special constant values and + . + + + + Complex32 x = new Complex32(1f,2f); + Complex32 y = Complex32.FromPolarCoordinates(1f, Math.Pi); + Complex32 z = (x + y) / (x - y); + + + + For mathematical details about complex numbers, please + have a look at the + Wikipedia + + + + + + Support Interface for Precision Operations (like AlmostEquals). + + Type of the implementing class. + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The value to compare with. + A norm of the difference between this and the other value. + + + + The real component of the complex number. + + + + + The imaginary component of the complex number. + + + + + Initializes a new instance of the Complex32 structure with the given real + and imaginary parts. + + The value for the real component. + The value for the imaginary component. + + + + Creates a complex number from a point's polar coordinates. + + A complex number. + The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number. + The phase, which is the angle from the line to the horizontal axis, measured in radians. + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to one and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to one. + + + + + Returns a new instance + with real and imaginary numbers positive infinite. + + + + + Returns a new instance + with real and imaginary numbers not a number. + + + + + Gets a value indicating whether the Complex32 is zero. + + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + + true if this instance is ; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + + true if this instance is real nonnegative number; otherwise, false. + + + + + Exponential of this Complex32 (exp(x), E^x). + + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex32 (Base E). + + The natural logarithm of this complex number. + + + + Common Logarithm of this Complex32 (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex32 with custom base. + + The logarithm of this complex number. + + + + Raise this Complex32 to the given value. + + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex32 to the inverse of the given value. + + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex32 + + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex32 + + + The square root of this complex number. + + + + + Equality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real and imaginary components of the two complex numbers are equal; false otherwise. + + + + Inequality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real or imaginary components of the two complex numbers are not equal; false otherwise. + + + + Unary addition. + + The complex number to operate on. + Returns the same complex number. + + + + Unary minus. + + The complex number to operate on. + The negated value of the . + + + Addition operator. Adds two complex numbers together. + The result of the addition. + One of the complex numbers to add. + The other complex numbers to add. + + + Subtraction operator. Subtracts two complex numbers. + The result of the subtraction. + The complex number to subtract from. + The complex number to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The complex numbers to add. + The float value to add. + + + Subtraction operator. Subtracts float value from a complex value. + The result of the subtraction. + The complex number to subtract from. + The float value to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The float value to add. + The complex numbers to add. + + + Subtraction operator. Subtracts complex value from a float value. + The result of the subtraction. + The float vale to subtract from. + The complex value to subtract. + + + Multiplication operator. Multiplies two complex numbers. + The result of the multiplication. + One of the complex numbers to multiply. + The other complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The float value to multiply. + The complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The complex number to multiply. + The float value to multiply. + + + Division operator. Divides a complex number by another. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a float value by a complex number. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a complex number by a float value. + The result of the division. + The dividend. + The divisor. + + + + Computes the conjugate of a complex number and returns the result. + + + + + Returns the multiplicative inverse of a complex number. + + + + + Converts the value of the current complex number to its equivalent string representation in Cartesian form. + + The string representation of the current instance in Cartesian form. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format for its real and imaginary parts. + + The string representation of the current instance in Cartesian form. + A standard or custom numeric format string. + + is not a valid format string. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified culture-specific formatting information. + + The string representation of the current instance in Cartesian form, as specified by . + An object that supplies culture-specific formatting information. + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format and culture-specific format information for its real and imaginary parts. + The string representation of the current instance in Cartesian form, as specified by and . + A standard or custom numeric format string. + An object that supplies culture-specific formatting information. + + is not a valid format string. + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + The hash code for the complex number. + + + The hash code of the complex number. + + + The hash code is calculated as + System.Math.Exp(ComplexMath.Absolute(complexNumber)). + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + + A norm of this value. + + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + + The value to compare with. + + + A norm of the difference between this and the other value. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as float. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Explicit conversion of a real decimal to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Explicit conversion of a Complex to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Implicit conversion of a real byte to a Complex32. + + The byte value to convert. + The result of the conversion. + + + + Implicit conversion of a real short to a Complex32. + + The short value to convert. + The result of the conversion. + + + + Implicit conversion of a signed byte to a Complex32. + + The signed byte value to convert. + The result of the conversion. + + + + Implicit conversion of a unsgined real short to a Complex32. + + The unsgined short value to convert. + The result of the conversion. + + + + Implicit conversion of a real int to a Complex32. + + The int value to convert. + The result of the conversion. + + + + Implicit conversion of a BigInteger int to a Complex32. + + The BigInteger value to convert. + The result of the conversion. + + + + Implicit conversion of a real long to a Complex32. + + The long value to convert. + The result of the conversion. + + + + Implicit conversion of a real uint to a Complex32. + + The uint value to convert. + The result of the conversion. + + + + Implicit conversion of a real ulong to a Complex32. + + The ulong value to convert. + The result of the conversion. + + + + Implicit conversion of a real float to a Complex32. + + The float value to convert. + The result of the conversion. + + + + Implicit conversion of a real double to a Complex32. + + The double value to convert. + The result of the conversion. + + + + Converts this Complex32 to a . + + A with the same values as this Complex32. + + + + Returns the additive inverse of a specified complex number. + + The result of the and components of the parameter multiplied by -1. + A complex number. + + + + Computes the conjugate of a complex number and returns the result. + + The conjugate of . + A complex number. + + + + Adds two complex numbers and returns the result. + + The sum of and . + The first complex number to add. + The second complex number to add. + + + + Subtracts one complex number from another and returns the result. + + The result of subtracting from . + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + + + Returns the product of two complex numbers. + + The product of the and parameters. + The first complex number to multiply. + The second complex number to multiply. + + + + Divides one complex number by another and returns the result. + + The quotient of the division. + The complex number to be divided. + The complex number to divide by. + + + + Returns the multiplicative inverse of a complex number. + + The reciprocal of . + A complex number. + + + + Returns the square root of a specified complex number. + + The square root of . + A complex number. + + + + Gets the absolute value (or magnitude) of a complex number. + + The absolute value of . + A complex number. + + + + Returns e raised to the power specified by a complex number. + + The number e raised to the power . + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a complex number. + + The complex number raised to the power . + A complex number to be raised to a power. + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a single-precision floating-point number. + + The complex number raised to the power . + A complex number to be raised to a power. + A single-precision floating-point number that specifies a power. + + + + Returns the natural (base e) logarithm of a specified complex number. + + The natural (base e) logarithm of . + A complex number. + + + + Returns the logarithm of a specified complex number in a specified base. + + The logarithm of in base . + A complex number. + The base of the logarithm. + + + + Returns the base-10 logarithm of a specified complex number. + + The base-10 logarithm of . + A complex number. + + + + Returns the sine of the specified complex number. + + The sine of . + A complex number. + + + + Returns the cosine of the specified complex number. + + The cosine of . + A complex number. + + + + Returns the tangent of the specified complex number. + + The tangent of . + A complex number. + + + + Returns the angle that is the arc sine of the specified complex number. + + The angle which is the arc sine of . + A complex number. + + + + Returns the angle that is the arc cosine of the specified complex number. + + The angle, measured in radians, which is the arc cosine of . + A complex number that represents a cosine. + + + + Returns the angle that is the arc tangent of the specified complex number. + + The angle that is the arc tangent of . + A complex number. + + + + Returns the hyperbolic sine of the specified complex number. + + The hyperbolic sine of . + A complex number. + + + + Returns the hyperbolic cosine of the specified complex number. + + The hyperbolic cosine of . + A complex number. + + + + Returns the hyperbolic tangent of the specified complex number. + + The hyperbolic tangent of . + A complex number. + + + + Gets the real component of the complex number. + + The real component of the complex number. + + + + Gets the real imaginary component of the complex number. + + The real imaginary component of the complex number. + + + + Gets the phase or argument of this Complex32. + + + Phase always returns a value bigger than negative Pi and + smaller or equal to Pi. If this Complex32 is zero, the Complex32 + is assumed to be positive real with an argument of zero. + + The phase or argument of this Complex32 + + + + Gets the magnitude (or absolute value) of a complex number. + + The magnitude of the current instance. + + + + Gets the squared magnitude (or squared absolute value) of a complex number. + + The squared magnitude of the current instance. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex32. + + + + Compound Monthly Return or Geometric Return or Annualized Return + + + + + + + Average Gain or Gain Mean + This is a simple average (arithmetic mean) of the periods with a gain. It is calculated by summing the returns for gain periods (return 0) + and then dividing the total by the number of gain periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Average Loss or LossMean + This is a simple average (arithmetic mean) of the periods with a loss. It is calculated by summing the returns for loss periods (return < 0) + and then dividing the total by the number of loss periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Calculation is similar to Standard Deviation , except it calculates an average (mean) return only for periods with a gain + and measures the variation of only the gain periods around the gain mean. Measures the volatility of upside performance. + © Copyright 1996, 1999 Gary L.Gastineau. First Edition. © 1992 Swiss Bank Corporation. + + + + + + + Similar to standard deviation, except this statistic calculates an average (mean) return for only the periods with a loss and then + measures the variation of only the losing periods around this loss mean. This statistic measures the volatility of downside performance. + + + + http://www.offshore-library.com/kb/statistics.php + + + + This measure is similar to the loss standard deviation except the downside deviation + considers only returns that fall below a defined minimum acceptable return (MAR) rather than the arithmetic mean. + For example, if the MAR is 7%, the downside deviation would measure the variation of each period that falls below + 7%. (The loss standard deviation, on the other hand, would take only losing periods, calculate an average return for + the losing periods, and then measure the variation between each losing return and the losing return average). + + + + + + + + A measure of volatility in returns below the mean. It's similar to standard deviation, but it only + looks at periods where the investment return was less than average return. + + + + + + + Measures a fund’s average gain in a gain period divided by the fund’s average loss in a losing + period. Periods can be monthly or quarterly depending on the data frequency. + + + + + + + Defines the base class for Matrix classes. + + + Defines the base class for Matrix classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns a that describes the type, dimensions and shape of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that summarizes this matrix. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + The value of 1.0. + + + + + The value of 0.0. + + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of this matrix with a scalar. + + The scalar to multiply with. + The result of the multiplication. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Divides each element of this matrix with a scalar. + + The scalar to divide with. + The result of the division. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.ColumnCount != rightSide.Count. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ). + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.ColumnCount. + If the result matrix's dimensions are not the this.RowCount x other.RowCount. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.ColumnCount. + If the other matrix is . + The result of the multiplication. + + + + Multiplies the transpose of this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != rightSide.Count. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Rows != other.RowCount. + If the result matrix's dimensions are not the this.ColumnCount x other.ColumnCount. + + + + Multiplies the transpose of this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Rows != other.RowCount. + If the other matrix is . + The result of the multiplication. + + + + Negate each element of this matrix. + + A matrix containing the negated values. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Complex conjugate each element of this matrix. + + A matrix containing the conjugated values. + + + + Complex conjugate each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Pointwise multiplies this matrix with another matrix. + + The matrix to pointwise multiply with this one. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise multiplication of this matrix and . + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Pointwise divide this matrix by another matrix. + + The matrix to pointwise subtract this one by. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise division of this matrix and . + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + A matrix containing the results. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Calculates the rank of the matrix + + effective numerical rank, obtained from SVD + + + Calculates the condition number of this matrix. + The condition number of the matrix. + The condition number is calculated using singular value decomposition. + + + Computes the determinant of this matrix. + The determinant of this matrix. + + + Computes the inverse of this matrix. + The inverse of this matrix. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + If other is . + The kronecker product of the two matrices. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + The kronecker product of the two matrices. + If other is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows * lower.rows) x (this.Columns * lower.Columns). + + + + Normalizes the columns of a matrix. + + The norm under which to normalize the columns under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Normalizes the rows of a matrix. + + The norm under which to normalize the rows under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Initializes a new instance of the Matrix class. + + + + + Constructs matrix from a list of column vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of column vectors. + Creates a matrix of size Max([i].Count) x .Count + + + + Constructs matrix from a list of row vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of row vectors. + Creates a matrix of size Max(.Count) x [i].Count + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + + + + Sets the value of the given element without range checking. + + + The row of the element. + + + The column of the element. + + + The value to set the element to. + + + + + Sets all values to zero. + + + + + Sets all values of a column to zero. + + + + + Sets all values of a row to zero. + + + + + Sets all values of a submatrix to zero. + + + + + Creates a clone of this instance. + + + A clone of the instance. + + + + + Copies the elements of this matrix to the given matrix. + + + The matrix to copy values into. + + + If target is . + + + If this and the target matrix do not have the same dimensions.. + + + + + Creates a Matrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A Matrix with the given dimensions. + + + Creates a matrix of the same matrix type as the current matrix. + + + + + Creates a Vector with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A Vector with the given dimension. + + + Creates a vector of the same type as the current matrix. + + + + + Copies a row into an Vector. + + The row to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of rows. + + + + Copies a row into to the given Vector. + + The row to copy. + The Vector to copy the row into. + If the result vector is . + If is negative, + or greater than or equal to the number of rows. + If this.Columns != result.Count. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of rows. + is negative, + or greater than or equal to the number of columns. + (columnIndex + length) >= Columns. + If is not positive. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Copies a column into a new Vector>. + + The column to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of columns. + + + + Copies a column into to the given Vector. + + The column to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If this.Rows != result.Count. + + + + Copies the requested column elements into a new Vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of columns. + is negative, + or greater than or equal to the number of rows. + (rowIndex + length) >= Rows. + + If is not positive. + + + + Copies the requested column elements into the given vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Returns the elements of the diagonal in a Vector. + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a new matrix and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Copies the values of the given Vector to the specified column. + + The column to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + + + + Copies the values of the given array to the specified column. + + The column to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + If the size of does not + equal the number of rows of this Matrix. + + + + Creates a new matrix and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Copies the values of the given Vector to the specified row. + + The row to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of the given array to the specified row. + + The row to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of a given matrix into a region in this matrix. + + The row to start copying to. + The number of rows to copy. Must be positive. + The column to start copying to. + The number of columns to copy. Must be positive. + The sub-matrix to copy from. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If is + the size of is not at least x . + If or + is not positive. + + + + Copies the values of the given Vector to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + + + + Concatenates this matrix with the given matrix. + + The matrix to concatenate. + The combined matrix. + + + + Concatenates this matrix with the given matrix and places the result into the result matrix. + + The matrix to concatenate. + The combined matrix. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Diagonally stacks his matrix on top of the given matrix. The new matrix is a M-by-N matrix, + where M = this.Rows + lower.Rows and N = this.Columns + lower.Columns. + The values of off the off diagonal matrices/blocks are set to zero. + + The lower, right matrix. + If lower is . + the combined matrix + + + + Diagonally stacks his matrix on top of the given matrix and places the combined matrix into the result matrix. + + The lower, right matrix. + The combined matrix + If lower is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows + lower.rows) x (this.Columns + lower.Columns). + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + For sparse matrices, the L2 norm is computed using a dense implementation of singular value decomposition. + In a later release, it will be replaced with a sparse implementation. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Returns an that enumerates over the matrix columns. + + An that enumerates over the matrix columns + + + + + Returns an that enumerates the requested matrix columns. + + The column to start enumerating over. + The number of columns to enumerating over. + An that enumerates over requested matrix columns. + + If: + is negative, + or greater than or equal to the number of columns. + (index + length) >= Columns. + + If is not positive. + + + + Returns an that enumerates the requested matrix rows. + + The row to start enumerating over. + The number of rows to enumerating over. + An that enumerates over requested matrix rows. + + If: + is negative, + or greater than or equal to the number of rows. + (index + length) >= Rows. + If is not positive. + + + + Returns an that enumerates over the matrix rows. + + An that enumerates over the matrix rows + + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Returns this matrix as a multidimensional array. + + A multidimensional containing the values of this matrix. + + + + Returns the matrix's elements as an array with the data laid out column-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 4, 7, 2, 5, 8, 3, 6, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Returns the matrix's elements as an array with the data laid row-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 2, 3, 4, 5, 6, 7, 8, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Applies a function to each value of this matrix and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Applies a function to each value of this matrix and replaces the value with its result. + The row and column indices of each value (zero-based) are passed as first arguments to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Gets the raw matrix data storage. + + + + + Gets the number of columns. + + The number of columns. + + + + Gets the number of rows. + + The number of rows. + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Defines the generic class for Vector classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a that describes the type, dimensions and shape of this vector. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that summarizes this vector. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + Returns a that summarizes this vector. + + + + + The zero value for type T. + + + + + The value of 1.0 for type T. + + + + + Initializes a new instance of the Vector class. + + + + Gets the value at the given without range checking.. + The index of the value to get or set. + The value of the vector at the given . + + + Sets the at the given without range checking.. + The index of the value to get or set. + The value to set. + + + + Resets all values to zero. + + + + + Sets all values of a subvector to zero. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + The number of rows. + The number of columns. + A matrix with the given dimensions. + + + + Creates a Vector of the given size using the same storage type + as this vector. + + The size of the Vector to create. + The new Vector. + + + + Negates vector and save result to + + Target vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The result of the division. + + + + Adds a scalar to each element of the vector. + + The scalar to add. + A copy of the vector with the scalar added. + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + If the result vector is . + If this vector and are not the same size. + + + + Returns a copy of this vector. + + This vector. + + Added as an alternative to the unary addition operator. + + + + + Adds another vector to this vector. + + The vector to add to this one. + A new vector containing the sum of both vectors. + If the other vector is . + If this vector and are not the same size. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Subtracts a scalar from each element of the vector. + + The scalar to subtract. + A new vector containing the subtraction of this vector and the scalar. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + If the result vector is . + If this vector and are not the same size. + + + + Returns a negated vector. + + The negated vector. + Added as an alternative to the unary negation operator. + + + + Negates vector and save result to + + Target vector + + + + Subtracts another vector from this vector. + + The vector to subtract from this one. + A new vector containing the subtraction of the the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Return vector with complex conjugate values of the source vector + + Conjugated vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Multiplies a scalar to each element of the vector. + + The scalar to multiply. + A new vector that is the multiplication of the vector and the scalar. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + If the result vector is . + If this vector and are not the same size. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + If is not of the same size. + If is . + + + + Divides each element of the vector by a scalar. + + The scalar to divide with. + A new vector that is the division of the vector and the scalar. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + If the result vector is . + If this vector and are not the same size. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector containing the result. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector. + + The vector to pointwise multiply with this one. + A new vector which is the pointwise multiplication of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector. + + The vector to pointwise divide this one by. + A new vector which is the pointwise division of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Returns a Vector containing the same values of . + + This method is included for completeness. + The vector to get the values from. + A vector containing the same values as . + If is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Adds a scalar to each element of a vector. + + The vector to add to. + The scalar value to add. + The result of the addition. + If is . + + + + Adds a scalar to each element of a vector. + + The scalar value to add. + The vector to add to. + The result of the addition. + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of a vector. + + The vector to subtract from. + The scalar value to subtract. + The result of the subtraction. + If is . + + + + Substracts each element of a vector from a scalar. + + The scalar value to subtract from. + The vector to subtract. + The result of the subtraction. + If is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of maximum element. + + The value of maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of the minimum element. + + The value of the minimum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Returns a deep-copy clone of the vector. + + A deep-copy clone of the vector. + + + + Set the values of this vector to the given values. + + The array containing the values to use. + If is . + If is not the same size as this vector. + + + + Copies the values of this vector into the target vector. + + The vector to copy elements into. + If is . + If is not the same size as this vector. + + + + Creates a vector containing specified elements. + + The first element to begin copying from. + The number of elements to copy. + A vector containing a copy of the specified elements. + If is not positive or + greater than or equal to the size of the vector. + If + is greater than or equal to the size of the vector. + + If is not positive. + + + + Copies the values of a given vector into a region in this vector. + + The field to start copying to + The number of fields to cpy. Must be positive. + The sub-vector to copy from. + If is + + + + Copies the requested elements from this vector to another. + + The vector to copy the elements to. + The element to start copying from. + The element to start copying to. + The number of elements to copy. + + + + Returns the data contained in the vector as an array. + + + The vector's data as an array. + + + + + Create a matrix based on this vector in column form (one single column). + + + This vector as a column matrix. + + + + + Create a matrix based on this vector in row form (one single row). + + + This vector as a row matrix. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an that contains the position and value of the element, for all non-zero elements. + + + An over this vector that contains the position and value of each element. + + + The enumerator returns a + with the first value being the element index and the second value + being the value of the element at that index. + The enumerator will exclude all elements with a zero value. + + + + + Applies a function to each value of this vector and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Applies a function to each value of this vector and replaces the value with its result. + The index of each value (zero-based) is passed as first argument to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Gets the raw vector data storage. + + + + + Gets the number of items. + + + + Gets or sets the value at the given . + The index of the value to get or set. + The value of the vector at the given . + If is negative or + greater than the size of the vector. + + + + Evaluation functions, useful for function approximation. + + + + + Evaluate polynomials. + + The coefficients of the polynomial. + The location where to evaluate the polynomial at. + the evaluation of the polynomial. + + + + Numerically stable series summation + + provides the summands sequentially + Sum + + + Evaluates the series of Chebyshev polynomials Ti at argument x/2. + The series is given by +
+                  N-1
+                   - '
+            y  =   >   coef[i] T (x/2)
+                   -            i
+                  i=0
+            
+ Coefficients are stored in reverse order, i.e. the zero + order term is last in the array. Note N is the number of + coefficients, not the order. +

+ If coefficients are for the interval a to b, x must + have been transformed to x -> 2(2x - b - a)/(b-a) before + entering the routine. This maps x from (a, b) to (-1, 1), + over which the Chebyshev polynomials are defined. +

+ If the coefficients are for the inverted interval, in + which (a, b) is mapped to (1/b, 1/a), the transformation + required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity, + this becomes x -> 4a/x - 1. +

+ SPEED: +

+ Taking advantage of the recurrence properties of the + Chebyshev polynomials, the routine requires one more + addition per loop than evaluating a nested polynomial of + the same degree. +

+ The coefficients of the polynomial. + Argument to the polynomial. + + Reference: https://bpm2.svn.codeplex.com/svn/Common.Numeric/Arithmetic.cs +

+ Marked as Deprecated in + http://people.apache.org/~isabel/mahout_site/mahout-matrix/apidocs/org/apache/mahout/jet/math/Arithmetic.html + + + +

+ Summation of Chebyshev polynomials, using the Clenshaw method with Reinsch modification. + + The no. of terms in the sequence. + The coefficients of the Chebyshev series, length n+1. + The value at which the series is to be evaluated. + + ORIGINAL AUTHOR: + Dr. Allan J. MacLeod; Dept. of Mathematics and Statistics, University of Paisley; High St., PAISLEY, SCOTLAND + REFERENCES: + "An error analysis of the modified Clenshaw method for evaluating Chebyshev and Fourier series" + J. Oliver, J.I.M.A., vol. 20, 1977, pp379-391 + +
+ + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the logistic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the harmonic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the error function. + + + + + The order of the approximation. + + + + + Auxiliary variable when evaluating the function. + + + + + Returns the modified Struve function of order 0. + + The value to compute the function of. + + + + + Returns the modified Struve function of order 1. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I0 and Struve L0 functions. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I1 and Struve L1 functions. + + The value to compute the function of. + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi0 * + ************************************** + + Chebyshev coefficients for exp(-x) I0(x) + in the interval [0, 8]. + + lim(x->0){ exp(-x) I0(x) } = 1. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I0(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi1 * + ************************************** + + Chebyshev coefficients for exp(-x) I1(x) / x + in the interval [0, 8]. + + lim(x->0){ exp(-x) I1(x) / x } = 1/2. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I1(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk0, bessk0e * + ************************************** + + Chebyshev coefficients for K0(x) + log(x/2) I0(x) + in the interval [0, 2]. The odd order coefficients are all + zero; only the even order coefficients are listed. + + lim(x->0){ K0(x) + log(x/2) I0(x) } = -EUL. + + + + Chebyshev coefficients for exp(x) sqrt(x) K0(x) + in the inverted interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K0(x) } = sqrt(pi/2). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk1, bessk1e * + ************************************** + + Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) + in the interval [0, 2]. + + lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. + + + + Chebyshev coefficients for exp(x) sqrt(x) K1(x) + in the interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). + + + + Returns the modified Bessel function of first kind, order 0 of the argument. +

+ The function is defined as i0(x) = j0( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of first kind, + order 1 of the argument. +

+ The function is defined as i1(x) = -i j1( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of the second kind + of order 0 of the argument. +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 0 of the argument. + + The value to compute the bessel function of. + + + + Returns the modified Bessel function of the second kind + of order 1 of the argument. +

+ The range is partitioned into the two intervals [0, 2] and + (2, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 1 of the argument. +

+ k1e(x) = exp(x) * k1(x). +

+ The value to compute the bessel function of. + +
+ + + Computes the logistic function. see: http://en.wikipedia.org/wiki/Logistic + + The parameter for which to compute the logistic function. + The logistic function of . + + + + Computes the logit function, the inverse of the sigmoid logistic function. see: http://en.wikipedia.org/wiki/Logit + + The parameter for which to compute the logit function. This number should be + between 0 and 1. + The logarithm of divided by 1.0 - . + + + + Computes the 'th Harmonic number. + + The Harmonic number which needs to be computed. + The t'th Harmonic number. + + + + Compute the generalized harmonic number of order n of m. (1 + 1/2^m + 1/3^m + ... + 1/n^m) + + The order parameter. + The power parameter. + General Harmonic number. + + + + Computes the logarithm of the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The logarithm of the Euler Beta function evaluated at z,w. + If or are not positive. + + + + Computes the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The Euler Beta function evaluated at z,w. + If or are not positive. + + + + Returns the lower incomplete (unregularized) beta function + I_x(a,b) = int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The lower incomplete (unregularized) beta function. + + + + Returns the regularized lower incomplete beta function + I_x(a,b) = 1/Beta(a,b) * int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The regularized lower incomplete beta function. + + + Calculates the error function. + The value to evaluate. + the error function evaluated at given value. + + + returns 1 if x == Double.PositiveInfinity. + returns -1 if x == Double.NegativeInfinity. + + + + + Calculates the complementary error function. + The value to evaluate. + the complementary error function evaluated at given value. + + + returns 0 if x == Double.PositiveInfinity. + returns 2 if x == Double.NegativeInfinity. + + + + + Calculates the inverse error function evaluated at z. + The inverse error function evaluated at given value. + + + returns Double.PositiveInfinity if z >= 1.0. + returns Double.NegativeInfinity if z <= -1.0. + + + Calculates the inverse error function evaluated at z. + value to evaluate. + the inverse error function evaluated at Z. + + + + Implementation of the error function. + + Where to evaluate the error function. + Whether to compute 1 - the error function. + the error function. + + + Calculates the complementary inverse error function evaluated at z. + The complementary inverse error function evaluated at given value. + We have tested this implementation against the arbitrary precision mpmath library + and found cases where we can only guarantee 9 significant figures correct. + + returns Double.PositiveInfinity if z <= 0.0. + returns Double.NegativeInfinity if z >= 2.0. + + + calculates the complementary inverse error function evaluated at z. + value to evaluate. + the complementary inverse error function evaluated at Z. + + + + The implementation of the inverse error function. + + First intermediate parameter. + Second intermediate parameter. + Third intermediate parameter. + the inverse error function. + + + + Initializes static members of the SpecialFunctions class. + + + + + Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up + to 22! exactly, all numbers up to 170! using a double representation. All larger values will overflow. + + A value value! for value > 0 + + If you need to multiply or divide various such factorials, consider using the logarithmic version + instead so you can add instead of multiply and subtract instead of divide, and + then exponentiate the result using . This will also circumvent the problem that + factorials become very large even for small parameters. + + + + + + Computes the logarithmic factorial function x -> ln(x!) of an integer number > 0. + + A value value! for value > 0 + + + + Computes the binomial coefficient: n choose k. + + A nonnegative value n. + A nonnegative value h. + The binomial coefficient: n choose k. + + + + Computes the natural logarithm of the binomial coefficient: ln(n choose k). + + A nonnegative value n. + A nonnegative value h. + The logarithmic binomial coefficient: ln(n choose k). + + + + Computes the multinomial coefficient: n choose n1, n2, n3, ... + + A nonnegative value n. + An array of nonnegative values that sum to . + The multinomial coefficient. + if is . + If or any of the are negative. + If the sum of all is not equal to . + + + + Polynomial coefficients for the approximation. + + + + + Computes the logarithm of the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which achieves an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + Our unit tests suggest that the accuracy of the Gamma function is correct up to 14 floating point digits. + + + + + Computes the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which should achieve an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + + Our unit tests suggest that the accuracy of the Gamma function is correct up to 13 floating point digits. + + + + + Returns the upper incomplete regularized gamma function + Q(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete regularized gamma function. + + + + Returns the upper incomplete gamma function + Gamma(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete gamma function. + + + + Returns the lower incomplete gamma function + gamma(a,x) = int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Returns the lower incomplete regularized gamma function + P(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Computes the Digamma function which is mathematically defined as the derivative of the logarithm of the gamma function. + This implementation is based on + Jose Bernardo + Algorithm AS 103: + Psi ( Digamma ) Function, + Applied Statistics, + Volume 25, Number 3, 1976, pages 315-317. + Using the modifications as in Tom Minka's lightspeed toolbox. + + The argument of the digamma function. + The value of the DiGamma function at . + + + + Computes the inverse Digamma function: this is the inverse of the logarithm of the gamma function. This function will + only return solutions that are positive. + This implementation is based on the bisection method. + + The argument of the inverse digamma function. + The positive solution to the inverse DiGamma function at . + + + + Numerically stable exponential minus one, i.e. x -> exp(x)-1 + + A number specifying a power. + Returns exp(power)-1. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Statistics operating on arrays assumed to be unsorted. + WARNING: Methods with the Inplace-suffix may modify the data array by reordering its entries. + + + + + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the order statistic (order 1..N) from the unsorted data array. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the p-Percentile value from the unsorted data array. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the third quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the inter-quartile range from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + Quantile definition, to choose what product/definition it should be consistent with + + + + Statistics operating on an IEnumerable in a single pass, without keeping the full data in memory. + Can be used in a streaming way, e.g. on large datasets not fitting into memory. + + + + + + + + Returns the smallest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Returns the largest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Statistics operating on an array already sorted ascendingly. + + + + + + + + Returns the smallest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the largest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the order statistic (order 1..N) from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the p-Percentile value from the sorted data array (ascending). + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the third quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the inter-quartile range from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + The Cauchy distribution is a symmetric continuous probability distribution. For details about this distribution, see + Wikipedia - Cauchy distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for continuous univariate distributions. + + + + + The interface for univariate distributions. + + + + + Computes the cumulative distribution function (cdf) for this probability distribution. + + The location at which to compute the cumulative distribution function. + the cumulative distribution at location . + + + + Gets or sets the random number generator which is used to generate random samples from the distribution. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + The probability density of the distribution. + + The location at which to compute the density. + the density at . + + + + The log probability density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by a double. + + + + + Gets the largest element in the domain of the distributions which can be represented by a double. + + + + + The scale of the Cauchy distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class with the location parameter set to 0 and the scale parameter set to 1 + + + + + Initializes a new instance of the class. + + + The location parameter for the distribution. + + + The scale parameter for the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + Location parameter. + Scale parameter. Must be greater than 0. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Location parameter. + Scale parameter. Must be greater than 0. + True when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Chi distribution. This distribution is + a continuous probability distribution. The distribution usually arises when a k-dimensional vector's orthogonal + components are independent and each follow a standard normal distribution. The length of the vector will + then have a chi distribution. + Wikipedia - Chi distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the degrees of freedom for the Chi distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Chi distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Chi distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Chi distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + Degrees of Freedom + a random number from the distribution. + + + + Generates a sample from the Chi distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Chi distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + Degrees of Freedom + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + Degrees of Freedom + a sequence of samples from the distribution. + + + + Gets or sets the degrees of freedom of the Chi distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the ChiSquare distribution. This distribution is + a sum of the squares of k independent standard normal random variables. + Wikipedia - ChiSquare distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the ChiSquare distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the ChiSquare distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the ChiSquare distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The degrees of freedom. + a random number from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ChiSquare distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Gets or sets the degrees of freedom of the ChiSquare distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Erlang distribution. This distribution is + is a continuous probability distribution with wide applicability primarily due to its + relation to the exponential and Gamma distributions. + Wikipedia - Erlang distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Erlang shape parameter. + + + + + Erlang inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape of the Erlang distribution. + + + The inverse scale of the Erlang distribution. + + + + + Constructs a Erlang distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The scale of the Erlang distribution. + a normal distribution. + + + + Constructs a Erlang distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + a normal distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the Erlang distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the density. + the density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Erlang Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Erlang distributed random variable. + + + + Generates a sample from the Erlang distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Erlang distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Erlang distribution. + + + + + Gets or sets the scale of the Erlang distribution. + + + + + Gets or sets the inverse scale of the Erlang distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum value. + + + + + Gets the Maximum value. + + + + + The exponential distribution is a distribution over the real numbers parameterized by one non-negative parameter. + Wikipedia - exponential distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The lambda parameter of the Exponential distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter of the Exponential distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + Lambda parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Lambda parameter. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + a sequence of samples from the distribution. + + + + Draws a random sample from the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a sequence of samples from the distribution. + + + + Gets or sets the lambda parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the FisherSnedecor distribution. For details about this distribution, see + Wikipedia - FisherSnedecor distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The first parameter - degree of freedom. + + + + + The second parameter - degree of freedom. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The first parameter - degree of freedom. + + + The second parameter - degree of freedom. + + + + + Sets the parameters of the distribution after checking their validity. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + + + + Checks whether the parameters of the distribution are valid. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates one sample from the FisherSnedecor distribution without parameter checking. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a FisherSnedecor distributed random number. + + + + Generates a sample from the FisherSnedecor distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the FisherSnedecor distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sequence of samples from the distribution. + + + + Gets or sets the first parameter - degree of freedom. + + + + + Gets or sets the second parameter - degree of freedom. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The inverse Gamma distribution is a distribution over the positive real numbers parameterized by + two positive parameters. + Wikipedia - InverseGamma distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Inverse Gamma shape parameter. + + + + + Inverse Gamma scale parameter scale. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape (alpha) parameter. + + + + + Gets or sets The scale (beta) parameter. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Throws . + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Laplace distribution is a distribution over the real numbers parameterized by a mean and + scale parameter. The PDF is: + p(x) = \frac{1}{2 * scale} \exp{- |x - mean| / scale}. + Wikipedia - Laplace distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale of the Laplace distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class (location = 0, scale = 1). + + + + + Initializes a new instance of the class. + + + The location for the Laplace distribution. + + + The scale for the Laplace distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Samples a Laplace distributed random variable. + + a sample from the distribution. + + + + Generates a sample from the Laplace distribution. + + a sample from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Laplace distribution. + + + + + Gets or sets the scale of the Laplace distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Pareto distribution is a power law probability distribution that coincides with social, + scientific, geophysical, actuarial, and many other types of observable phenomena. + For details about this distribution, see + Wikipedia - Pareto distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The shape parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + The shape parameter of the distribution. + + + If or are negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + The shape parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + The shape parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Pareto distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + The shape parameter. + a random number from the Pareto distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Pareto distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the shape parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Rayleigh distribution (pronounced /ˈreɪli/) is a continuous probability distribution. As an + example of how it arises, the wind speed will have a Rayleigh distribution if the components of + the two-dimensional wind velocity vector are uncorrelated and normally distributed with equal variance. + For details about this distribution, see + Wikipedia - Rayleigh distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Rayleigh distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + a random number from the Rayleigh distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Rayleigh distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + A random variable is said to be stable (or to have a stable distribution) if it has + the property that a linear combination of two independent copies of the variable has + the same distribution, up to location and scale parameters. + For details about this distribution, see + Wikipedia - Stable distribution. + + The distribution will use the by default.` + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The stability parameter of the distribution. + + + + + The skewness parameter of the distribution. + + + + + The scale parameter of the distribution. + + + + + The location parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The stability parameter of the distribution. + + + The skewness parameter of the distribution. + + + The scale parameter of the distribution. + + + The location parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + Throws a not supported exception if Alpha != 2, (Alpha != 1 and Beta !=0), or (Alpha != 0.5 and Beta != 1) + + + + Computes the cumulative distribution function of the Levy distribution. + + The scale parameter. + The location parameter. + The location at which to compute the cumulative density. + + the cumulative density at . + + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the density of the Levy distribution. + + The scale parameter of the distribution. + The location parameter of the distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Stable distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the stability parameter of the distribution. + + + + + Gets or sets The skewness parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets he entropy of the distribution. + + Always throws a not supported exception. + + + + Gets the skewness of the distribution. + + Throws a not supported exception of Alpha != 2. + + + + Gets the mode of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the median of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Conway-Maxwell-Poisson distribution is a generalization of the Poisson, Geometric and Bernoulli + distributions. It is parameterized by two real numbers "lambda" and "nu". For + + nu = 0 the distribution reverts to a Geometric distribution + nu = 1 the distribution reverts to the Poisson distribution + nu -> infinity the distribution converges to a Bernoulli distribution + + This implementation will cache the value of the normalization constant. + Wikipedia - ConwayMaxwellPoisson distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for discrete univariate distributions. + + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Since many properties of the distribution can only be computed approximately, the tolerance + level specifies how much error we accept. + + + + + The mean of the distribution. + + + + + The variance of the distribution. + + + + + Caches the value of the normalization constant. + + + + + The lambda parameter. + + + + + The nu parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter. + + + The nu parameter. + + + + + Sets the parameters of the distribution after checking their validity. + + The lambda parameter. + The nu parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The lambda parameter. + The nu parameter. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the ConwayMaxwellPoisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the log probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Computes an approximate normalization constant for the CMP distribution. + + The lambda parameter for the CMP distribution. + The nu parameter for the CMP distribution. + + an approximate normalization constant for the CMP distribution. + + + + + Returns one trials from the distribution. + + The random number generator to use. + The lambda parameter + The nu parameter. + The z parameter. + + One sample from the distribution implied by , , and . + + + + + Samples a Conway-Maxwell-Poisson distributed random variable. + + a sample from the distribution. + + + + Samples a sequence of a Conway-Maxwell-Poisson distributed random variables. + + + a sequence of samples from a Conway-Maxwell-Poisson distribution. + + + + + Samples a random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Gets or sets the lambda parameter. + + The value of the lambda parameter. + + + + Gets or sets the Nu parameter. + + The value of the Nu parameter. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the normalization constant of the Conway-Maxwell-Poisson distribution. + + + + + The Geometric distribution is a distribution over positive integers parameterized by one positive real number. + This implementation of the Geometric distribution will never generate 0's. + Wikipedia - geometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The geometric distribution parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Geometric class. + + The probability of generating one. + If the Geometric parameter is not in the range [0,1]. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Returns one sample from the distribution. + + The random number generator to use. + The p parameter + + One sample from the distribution implied by . + + + + + Samples a Geometric distributed random variable. + + A sample from the Geometric distribution. + + + + Samples an array of Geometric distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The p parameter + + + + Samples a sequence of this random variable. + + The random number generator to use. + The p parameter + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a not supported exception. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the Hypergeometric distribution. This distribution is + a discrete probability distribution that describes the number of successes in a sequence + of n draws from a finite population without replacement, just as the binomial distribution + describes the number of successes for draws with replacement + Wikipedia - Hypergeometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The size of the population. + + + + + The m parameter of the distribution. + + + + + The n parameter (number to draw) of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Hypergeometric class. + + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Hypergeometric distribution without doing parameter checking. + + The random number generator to use. + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + a random number from the Hypergeometric distribution. + + + + Samples a Hypergeometric distributed random variable. + + The number of successes in n trials. + + + + Samples an array of Hypergeometric distributed random variables. + + a sequence of successes in n trials. + + + + Samples a random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the population size. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the m parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The negative binomial is a distribution over the natural numbers with two parameters r,p. For the special + case that r is an integer one can interpret the distribution as the number of tails before the r'th head + when the probability of head is p. + Wikipedia - NegativeBinomial distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The r parameter of the distribution. + + + + + The p parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The number of trials. + The probability of a trial resulting in success. + + + + Sets the parameters of the distribution after checking their validity. + + The number of trials. + The probability of a trial resulting in success. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The number of trials. + The probability of a trial resulting in success. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the NegativeBinomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Samples a negative binomial distributed random variable. + + The random number generator to use. + The r parameter. + The p parameter. + a sample from the distribution. + + + + Samples a NegativeBinomial distributed random variable. + + a sample from the distribution. + + + + Samples an array of NegativeBinomial distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Gets or sets the number of trials. + + + + + Gets or sets the probability of success. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Pseudo-random generation of poisson distributed deviates. + + + Distribution is described at Wikipedia - Poisson distribution. + Knuth's method is used to generate Poisson distributed random variables. + f(x) = exp(-λ)*λ^x/x!; + + + + + The Poisson distribution parameter λ. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The Poisson distribution parameter λ. + If is equal or less then 0.0. + + + + Sets the parameters of the distribution after checking their validity. + + The mean (λ) of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean (λ) of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Poisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Poisson distribution. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by Knuth's method. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by "Rejection method PA". + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + "Rejection method PA" from "The Computer Generation of Poisson Random Variables" by A. C. Atkinson, + Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28, No. 1. (1979) + The article is on pages 29-35. The algorithm given here is on page 32. + + + + Samples a Poisson distributed random variable. + + A sample from the Poisson distribution. + + + + Samples an array of Poisson distributed random variables. + + a sequence of successes in N trials. + + + + Samples a Poisson distributed random variable. + + The random number generator to use. + The Poisson distribution parameter λ. + A sample from the Poisson distribution. + + + + Samples a sequence of Poisson distributed random variables. + + The random number generator to use. + The Poisson distribution parameter λ. + a sequence of samples from the distribution. + + + + Gets or sets the Poisson distribution parameter λ. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Zipf's law, an empirical law formulated using mathematical statistics, refers to the fact + that many types of data studied in the physical and social sciences can be approximated with + a Zipfian distribution, one of a family of related discrete power law probability distributions. + For details about this distribution, see + Wikipedia - Zipf distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The s parameter of the distribution. + + + + + The n parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The s parameter of the distribution. + + + The n parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The s parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The s parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The integer location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Zipf distribution without doing parameter checking. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + a random number from the Zipf distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of zipf distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the s parameter of the distribution. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the inverse Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The inverse Wishart distribution + is the conjugate prior for the covariance matrix of a multivariate normal distribution. + Wikipedia - Inverse-Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the inverse Wishart distribution. + + + + + The scale matrix for the inverse Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the inverse Wishart distribution. + + + The scale matrix for the inverse Wishart distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the inverse Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + a sample from the distribution. + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sample from the distribution. + + + + Gets or sets the degrees of freedom for the inverse Wishart distribution. + + + + + Gets or sets the scale matrix for the inverse Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + A. O'Hagan, and J. J. Forster (2004). Kendall's Advanced Theory of Statistics: Bayesian Inference. 2B (2 ed.). Arnold. ISBN 0-340-80752-0. + + + + Gets the variance of the distribution. + + The variance of the distribution. + Kanti V. Mardia, J. T. Kent and J. M. Bibby (1979). Multivariate Analysis. + + + + This class implements functionality for matrix valued normal distributions. The distribution + is parameterized by a mean matrix (M), a covariance matrix for the rows (V) and a covariance matrix + for the columns (K). If the dimension of M is d-by-m then V is d-by-d and K is m-by-m. + Wikipedia - MatrixNormal distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The mean of the matrix normal distribution. + + + + + The covariance matrix for the rows. + + + + + The covariance matrix for the columns. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The mean of the matrix normal. + + + The covariance matrix for the rows. + + + The covariance matrix for the columns. + + + If the dimensions of the mean and two covariance matrices don't match. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the matrix normal distribution. + + The matrix at which to evaluate the density at. + the density at + If the argument does not have the correct dimensions. + + + + Samples a matrix normal distributed random variable. + + A random number from this distribution. + + + + Samples a matrix normal distributed random variable. + + The random number generator to use. + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + If the dimensions of the mean and two covariance matrices don't match. + a sequence of samples from the distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The covariance matrix of the vector normal distribution. + a sequence of samples from defined distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The Cholesky factorization of the covariance matrix. + a sequence of samples from defined distribution. + + + + Gets or sets the mean. (M) + + The mean of the distribution. + + + + Gets or sets the row covariance. (V) + + The row covariance. + + + + Gets or sets the column covariance. (K) + + The column covariance. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + This class implements functionality for the Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The Wishart distribution + is the conjugate prior for the precision (inverse covariance) matrix of the multivariate + normal distribution. + Wikipedia - Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the Wishart distribution. + + + + + The scale matrix for the Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Wishart distribution. + + + The scale matrix for the Wishart distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Evaluates the probability density function for the Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + A random number from this distribution. + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sequence of samples from the distribution. + + + + Samples the distribution. + + The random number generator to use. + The nu parameter to use. + The S parameter to use. + The cholesky decomposition to use. + a random number from the distribution. + + + + Gets or sets the degrees of freedom for the Wishart distribution. + + + + + Gets or sets the scale matrix for the Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + + + + Gets the variance of the distribution. + + The variance of the distribution. + + + + Retrieves the requested element without range checking. + + The index of the element. + The requested element. + Not range-checked. + + + + Sets the element without range checking. + + The index of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given index, with range checking. + + + The index of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this vector can be set to any value. + False if some fields are fixed. + + + + + Array that contains the indices of the non-zero values. + + + + + Array that contains the non-zero elements of the vector. + + + + + Gets the number of non-zero elements in the vector. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed, like an off-diagonal field on a diagonal matrix. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this matrix can be set to any value. + False if some fields are fixed, like on a diagonal matrix. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + Supported data types are double, single, , and . + + + + Classes that solves a system of linear equations, AX = B. + + Supported data types are double, single, , and . + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, Ax = b + + The right hand side vector, b. + The left hand side Vector, x. + + + + Solves a system of linear equations, Ax = b. + + The right hand side vector, b. + The left hand side Matrix>, x. + + + + Internal method which routes the call to perform the Cholesky factorization to the appropriate class. + + The matrix to factor. + A cholesky factorization object. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets the lower triangular form of the Cholesky matrix + + + + + Gets the lower triangular form of the Cholesky matrix. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + An EVD object. + + + Returns the eigen values as a . + The eigen values. + + + Returns the right eigen vectors as a . + The eigen vectors. + + + Returns the block diagonal eigenvalue matrix . + The block diagonal eigenvalue matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether matrix is symmetric or not + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Gets or sets the eigen values (λ) of matrix in ascending value. + + + + + Gets or sets eigenvectors. + + + + + Gets or sets the block diagonal eigenvalue matrix. + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + Supported data types are double, single, , and . + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + The type of QR factorization to perform. + A QR factorization object. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets orthogonal Q matrix + + + + + Gets or sets upper triangular factor R + + + + + The QR factorization method. + + + + + Gets orthogonal Q matrix + + + + + Gets the upper triangular factor R. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + A QR factorization object. + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + Supported data types are double, single, , and . + + + + Value of one for T. + + + + + Internal method which routes the call to perform the LU factorization to the appropriate class. + + The matrix to factor. + An LU factorization object. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + Gets or sets both the L and U factors in the same matrix. + + + + + Gets or sets the pivot indices of the LU factorization. + + + + + Gets the lower triangular factor. + + + + + Gets the upper triangular factor. + + + + + Gets the permutation applied to LU factorization. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + Compute the singular U and VT vectors or not. + An SVD object. + + + Returns the left singular vectors as a . + The left singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + + + Returns the right singular vectors as a . + The right singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + This is the transpose of the V matrix. + + + Returns the singular values as a diagonal . + The singular values as a diagonal . + + + Returns the singular values as a . + the singular values as a . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether to compute U and VT matrices during SVD factorization or not + + + + + Gets or sets the singular values (Σ) of matrix in ascending value. + + + + + Gets or sets left singular vectors (U - m-by-m unitary matrix) + + + + + Gets or sets transpose right singular vectors (transpose of V, an n-by-n unitary matrix + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + Complex version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A Complex dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + double version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + double version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A setup functions to help simplify the generic code. + + + + + Sets the value of 1.0 for type T. + + The type to return the value of 1.0 of. + The value of 1.0 for type T. + + + + Sets the value of 0.0 for type T. + + The type to return the value of 0.0 of. + The value of 0.0 for type T. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex32 value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex32 value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex32 value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A Complex32 dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex32 dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex32 value z1 + Complex32 value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex value z1 + Complex value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + float version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + float version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + The type of QR factorization go perform. + + + + + Compute the full QR factorization of a matrix. + + + + + Compute the thin QR factorixation of a matrix. + + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + It may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was canceled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Indicates that a calculation was cancelled by the user. + + + + + Defines the base interface for calculation status objects. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has converged to the desired convergence levels. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation diverged. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has failed for some reason. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the state of the calculation is indetermined, not started or stopped. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation is running and no results are yet known. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation has been stopped due to reaching the stopping + limits, but that convergence was not achieved. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Iteration stop criteria. + + + + + Monitor calculation failures in the iterative calculation. + + + + + Monitor the calculation for signs of divergence. + + + + + Guard the calculation against unlimited continuation + by monitoring user specified limits, e.g. the maximum number of iterations. + + + + + Monitor the calculation for convergence, usually + based on the residuals of the calculation. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + The array containing the row indices of the existing rows. Element "j" of the array gives the index of the + element in the array that is first non-zero element in a row "j" + + + + + An array containing the column indices of the non-zero values. Element "I" of the array + is the number of the column in matrix that contains the I-th value in the array. + + + + + Array that contains the non-zero elements of matrix. Values of the non-zero elements of matrix are mapped into the values + array using the row-major storage mapping described in a compressed sparse row (CSR) format. + + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + Delete value from internal storage + + Index of value in nonZeroValues array + Row number of matrix + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Find item Index in nonZeroValues array + + Matrix row index + Matrix column index + Item index + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Class to represent a permutation for a subset of the natural numbers. + + + + + Entry _indices[i] represents the location to which i is permuted to. + + + + + Initializes a new instance of the Permutation class. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + + + + Computes the inverse of the permutation. + + The inverse of the permutation. + + + + Construct an array from a sequence of inversions. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + The set of inversions to construct the permutation from. + A permutation generated from a sequence of inversions. + + + + Construct a sequence of inversions from the permutation. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + A sequence of inversions. + + + + Checks whether the array represents a proper permutation. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + True if represents a proper permutation, false otherwise. + + + + Gets the number of elements this permutation is over. + + + + + Computes where permutes too. + + The index to permute from. + The index which is permuted to. + + + + Implements the Beta distribution. For details about this distribution, see + Wikipedia - Beta distribution. + + + There are a few special cases for the parameterization of the Beta distribution. When both + shape parameters are positive infinity, the Beta distribution degenerates to a point distribution + at 0.5. When one of the shape parameters is positive infinity, the distribution degenerates to a point + distribution at the positive infinity. When both shape parameters are 0.0, the Beta distribution + degenerates to a Bernoulli distribution with parameter 0.5. When one shape parameter is 0.0, the + distribution degenerates to a point distribution at the non-zero shape parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Beta shape parameter a. + + + + + Beta shape parameter b. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Beta class. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + If any of the Beta parameters are negative. + + + + A string representation of the distribution. + + A string representation of the Beta distribution. + + + + Checks whether the parameters of the distribution are valid. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + When the parameters don't pass the function. + + + + Computes the density of the Beta distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Beta distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Beta distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples Beta distributed random variables by sampling two Gamma variables and normalizing. + + The random number generator to use. + The A shape parameter. + The B shape parameter. + a random number from the Beta distribution. + + + + Generates a sample from the Beta distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Beta distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sequence of samples from the distribution. + + + + Gets or sets the A shape parameter of the Beta distribution. + + + + + Gets or sets the B shape parameter of the Beta distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Beta distribution. + + + + + Gets the variance of the Beta distribution. + + + + + Gets the standard deviation of the Beta distribution. + + + + + Gets the entropy of the Beta distribution. + + + + + Gets the skewness of the Beta distribution. + + + + + Gets the mode of the Beta distribution; when there are multiple answers, this routine will return 0.5. + + + + + Gets the median of the Beta distribution. + + + + + Gets the minimum of the Beta distribution. + + + + + Gets the maximum of the Beta distribution. + + + + + The continuous uniform distribution is a distribution over real numbers. For details about this distribution, see + Wikipedia - Continuous uniform distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the ContinuousUniform class with lower bound 0 and upper bound 1. + + + + + Initializes a new instance of the ContinuousUniform class with given lower and upper bounds. + + Lower bound. + Upper bound; must be at least as large as . + If the upper bound is smaller than the lower bound. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the ContinuousUniform distribution without parameter checking. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed random number. + + + + Generates a sample from the ContinuousUniform distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed sample. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of uniformly distributed samples. + + + + Gets or sets the lower bound of the distribution. + + + + + Gets or sets the upper bound of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + + Gets the median of the distribution. + + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Log-Normal distribution. For details about this distribution, see + Wikipedia - Log-Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mu of the logarithm of the log-log-normal distribution. + + + + + Keeps track of the standard deviation of the logarithm of the log-log-normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + The distribution will be initialized with the default + random number generator. + + + The mu of the logarithm of the distribution. + + + The standard deviation of the logarithm of the distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + When the parameters don't pass the function. + + + + Computes the density of the log-normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the log-normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the log-normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the mean of the logarithm of the log-normal. + + + + + Gets or sets the standard deviation of the logarithm of the log-normal. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mu of the log-normal distribution. + + + + + Gets the variance of the log-normal distribution. + + + + + Gets the standard deviation of the log-normal distribution. + + + + + Gets the entropy of the log-normal distribution. + + + + + Gets the skewness of the log-normal distribution. + + + + + Gets the mode of the log-normal distribution. + + + + + Gets the median of the log-normal distribution. + + + + + Gets the minimum of the log-normal distribution. + + + + + Gets the maximum of the log-normal distribution. + + + + + Implements the Weibull distribution. For details about this distribution, see + Wikipedia - Weibull distribution. + + + The Weibull distribution is parametrized by a shape and scale parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Weibull shape parameter. + + + + + Weibull inverse scale parameter. + + + + + Reusable intermediate result 1 / ( ^ ) + + + By caching this parameter we can get slightly better numerics precision + in certain constellations without any additional computations. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Weibull class. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Weibull distribution. + The scale of the Weibull distribution. + true when the parameters positive valid floating point numbers, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + When the parameters don't pass the function. + + + + Computes the density of the Weibull distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Weibull distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Weibull distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the Weibull distribution. This method doesn't perform + any parameter checks. + + The random number generator to use. + The shape of the Weibull distribution. + The scale of the Weibull distribution. + A sample from a Weibull distributed random variable. + + + + Generates a sample from the Weibull distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Weibull distribution. + + + + + Gets or sets the scale of the Weibull distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Weibull distribution. + + + + + Gets the variance of the Weibull distribution. + + + + + Gets the standard deviation of the Weibull distribution. + + + + + Gets the entropy of the Weibull distribution. + + + + + Gets the skewness of the Weibull distribution. + + + + + Gets the mode of the Weibull distribution. + + + + + Gets the median of the Weibull distribution. + + + + + Gets the minimum of the Weibull distribution. + + + + + Gets the maximum of the Weibull distribution. + + + + + Implements the univariate Gamma distribution. For details about this distribution, see + Wikipedia - Gamma distribution. + + + The Gamma distribution is parametrized by a shape and inverse scale parameter. When we want + to specify a Gamma distribution which is a point distribution we set the shape parameter to be the + location of the point distribution and the inverse scale as positive infinity. The distribution + with shape and inverse scale both zero is undefined. + Random number generation for the Gamma distribution is based on the algorithm in: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Gamma shape parameter. + + + + + Gamma inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Gamma class. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + + + + Constructs a Gamma distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The scale of the Gamma distribution. + a normal distribution. + + + + Constructs a Gamma distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + When the parameters don't pass the function. + + + + Computes the density of the Gamma distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Gamma distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Gamma distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Gamma distributed random variable. + + + + Generates a sample from the Gamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Gamma distribution. + + + + + Gets or sets the scale of the Gamma distribution. + + + + + Gets or sets the inverse scale of the Gamma distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Gamma distribution. + + + + + Gets the variance of the Gamma distribution. + + + + + Gets the standard deviation of the Gamma distribution. + + + + + Gets the entropy of the Gamma distribution. + + + + + Gets the skewness of the Gamma distribution. + + + + + Gets the mode of the Gamma distribution. + + + + + Gets the median of the Gamma distribution. + + + + + Gets the minimum of the Gamma distribution. + + + + + Gets the maximum of the Gamma distribution. + + + + + Implements the univariate Normal (or Gaussian) distribution. For details about this distribution, see + Wikipedia - Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mean of the normal distribution. + + + + + Keeps track of the standard deviation of the normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Normal class. This is a normal distribution with mean 0.0 + and standard deviation 1.0. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the Normal class with a particular mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + + + + Constructs a normal distribution from a mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and variance. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The variance of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and precision. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The precision of the normal distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + When the parameters don't pass the function. + + + + Computes the density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the log density at . + + + + Computes the density of the normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the inverse cumulative distribution function of the normal distribution. + + The location at which to compute the inverse cumulative density. + the inverse cumulative density at . + + + + Samples a pair of standard normal distributed random variables using the Box-Muller algorithm. + + The random number generator to use. + a pair of random numbers from the standard normal distribution. + + + + Samples the distribution. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a random number from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the precision of the normal distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets or sets the mean of the normal distribution. + + + + + Gets or sets the variance of the normal distribution. + + + + + Gets or sets the standard deviation of the normal distribution. + + + + + Gets the entropy of the normal distribution. + + + + + Gets the skewness of the normal distribution. + + + + + Gets the mode of the normal distribution. + + + + + Gets the median of the normal distribution. + + + + + Gets the minimum of the normal distribution. + + + + + Gets the maximum of the normal distribution. + + + + + The Bernoulli distribution is a distribution over bits. The parameter + p specifies the probability that a 1 is generated. + Wikipedia - Bernoulli distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The probability of generating a one. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Bernoulli class. + + The probability of generating one. + If the Bernoulli parameter is not in the range [0,1]. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Bernoulli distribution. + + The random source to use. + The probability of generating a one. + A random sample from the Bernoulli distribution. + + + + Samples a Bernoulli distributed random variable. + + A sample from the Bernoulli distribution. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a Bernoulli distributed random variable. + + The random number generator to use. + The probability of generating a 1. + A sample from the Bernoulli distribution. + + + + Samples a sequence of Bernoulli distributed random variables. + + The random number generator to use. + The probability of generating a 1. + a sequence of samples from the distribution. + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the binomial distribution. For details about this distribution, see + Wikipedia - Binomial distribution. + + The distribution is parameterized by a probability (between 0.0 and 1.0). + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized binomial probability. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Binomial class. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The success probability of a trial. + The number of trials. + false is not in the interval [0.0,1.0] or is negative, true otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates a sample from the Binomial distribution without doing parameter checking. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successful trials. + + + + Samples a Binomially distributed random variable. + + The number of successes in N trials. + + + + Samples an array of Binomially distributed random variables. + + a sequence of successes in N trials. + + + + Samples a binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successes in trials. + + + + Samples a sequence of binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + a sequence of successes in trials. + + + + Gets or sets the success probability. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the categorical distribution. For details about this distribution, see + Wikipedia - Categorical distribution. This + distribution is sometimes called the Discrete distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the unnormalized categorical probabilities. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Categorical class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative or do not sum to one. + + + + Initializes a new instance of the Categorical class from a . The distribution + will not be automatically updated when the histogram changes. The categorical distribution will have + one value for each bucket and a probability for that value proportional to the bucket count. + + The histogram from which to create the categorical variable. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative returns false, or if the sum of parameters is 0.0; otherwise true + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Computes the unnormalized cumulative distribution function. This method performs no + parameter checking. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + An array representing the unnormalized cumulative distribution function. + + + + Returns one trials from the categorical distribution. + + The random number generator to use. + The cumulative distribution of the probability distribution. + One sample from the categorical distribution implied by . + + + + Samples a Binomially distributed random variable. + + The number of successful trials. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of successful trial counts. + + + + Samples one categorical distributed random variable; also known as the Discrete distribution. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + One random integer between 0 and the size of the categorical (exclusive). + + + + Samples a categorically distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + random integers between 0 and the size of the categorical (exclusive). + + + + Gets or sets the normalized probability vector of the multinomial. + + Sometimes the normalized probability vector cannot be represented + exactly in a floating point representation. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a . + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets he mode of the distribution. + + Throws a . + + + + Gets the median of the distribution. + + + + + The discrete uniform distribution is a distribution over integers. The distribution + is parameterized by a lower and upper bound (both inclusive). + Wikipedia - Discrete uniform distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the DiscreteUniform class. + + Lower bound. + Upper bound; must be at least as large as . + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates one sample from the discrete uniform distribution. This method does not do any parameter checking. + + The random source to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A random sample from the discrete uniform distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of uniformly distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a uniformly distributed random variable. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A sample from the discrete uniform distribution. + + + + Samples a sequence of uniformly distributed random variables. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of samples from the discrete uniform distribution. + + + + Gets or sets the lower bound of the probability distribution. + + + + + Gets or sets the upper bound of the probability distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution; since every element in the domain has the same probability this method returns the middle one. + + + + + Gets the median of the distribution. + + + + + Implements the multivariate Dirichlet distribution. For details about this distribution, see + Wikipedia - Dirichlet distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The Dirichlet distribution parameters. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Dirichlet class. The distribution will + be initialized with the default random number generator. + + An array with the Dirichlet parameters. + + + + Initializes a new instance of the class. + + random number generator. + + + The value of each parameter of the Dirichlet distribution. + + + The dimension of the Dirichlet distribution. + + + + + Checks whether the parameters of the distribution are valid: no + parameter can be less than zero and at least one parameter should be + larger than zero. + + The parameters of the Dirichlet distribution. + + true when the parameters are valid, false + otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The parameters of the Dirichlet distribution. + When the parameters don't pass the function. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the density of the distribution. + + The locations at which to compute the density. + the density at . + The Dirichlet distribution requires that the sum of the components of x equals 1. + You can also leave out the last component, and it will be computed from the others. + + + + Computes the log density of the distribution. + + The locations at which to compute the density. + the density at . + + + + Samples a Dirichlet distributed random vector. + + A sample from this distribution. + + + + Samples a Dirichlet distributed random vector. + + The random number generator to use. + The Dirichlet distribution parameter. + a sample from the distribution. + + + + Gets the dimension of the Dirichlet distribution. + + + + + Gets or sets the parameters of the Dirichlet distribution. + + + + + Gets the sum of the Dirichlet parameters. + + + + + Gets the mean of the Dirichlet distribution. + + + + + Gets the variance of the Dirichlet distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Implements the multinomial distribution. For details about this distribution, see + Wikipedia - Multinomial distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized multinomial probabilities. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Multinomial class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + Initializes a new instance of the Multinomial class from histogram . The distribution will + not be automatically updated when the histogram changes. + + Histogram instance + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative returns false, + if the sum of parameters is 0.0, or if the number of trials is negative; otherwise true. + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + When the parameters don't pass the function. + + + + Computes values of the probability mass function. + + Non-negative integers x1, ..., xk + The probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Computes values of the log probability mass function. + + Non-negative integers x1, ..., xk + The log probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Samples one multinomial distributed random variable. + + the counts for each of the different possible values. + + + + Samples a sequence multinomially distributed random variables. + + a sequence of counts for each of the different possible values. + + + + Samples one multinomial distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + the counts for each of the different possible values. + + + + Samples a multinomially distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of variables needed. + a sequence of counts for each of the different possible values. + + + + Gets or sets the proportion of ratios. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + + + Naive generic DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Corresponding frequency-space vector. + + + + Naive forward DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Hartley Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DHT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Hartley Transform Convention Options. + Corresponding time-space vector. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Hartley Transform Convention + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling. + + + + + Globalized String Handling Helpers + + + + + Tries to get a from the format provider, + returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format + provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Globalized Parsing: Tokenize a node by splitting it into several nodes. + + Node that contains the trimmed string to be tokenized. + List of keywords to tokenize by. + keywords to skip looking for (because they've already been handled). + + + + Globalized Parsing: Parse a double number + + First token of the number. + Culture Info. + The parsed double number using the given culture information. + + + + + Globalized Parsing: Parse a float number + + First token of the number. + Culture Info. + The parsed float number using the given culture information. + + + + + Barycentric Polynomial Interpolation where the given sample points are equidistant. + + + This algorithm neither supports differentiation nor integration. + + + + + Interpolation within the range of a discrete set of known data points. + + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t is equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sampls in the interval [leftBound,rightBound]. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Count of Sample Values x(t). + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + + + Extract the exponent sign to be used in forward transforms according to the + provided convention options. + + Fourier Transform Convention Options. + Fourier series exponent sign. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Generate the bluestein sequence for the provided problem size. + + Number of samples. + Bluestein sequence exp(I*Pi*k^2/N) + + + + Convolution with the bluestein sequence (Parallel Version). + + Sample Vector. + + + + Swap the real and imaginary parts of each sample. + + Sample Vector. + + + + Bluestein generic FFT for arbitrary sized sample vectors. + + Time-space sample vector. + Fourier series exponent sign. + + + + Bluestein forward FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Bluestein inverse FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Naive generic DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier series exponent sign. + Corresponding frequency-space vector. + + + + Naive forward DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DFT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Fourier Transform Convention Options. + Corresponding time-space vector. + + + + Radix-2 Reorder Helper Method + + Sample type + Sample vector + + + + Radix-2 Step Helper Method + + Sample vector. + Fourier series exponent sign. + Level Group Size. + Index inside of the level. + + + + Radix-2 generic FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 generic FFT for power-of-two sample vectors (Parallel Version). + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 forward FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Radix-2 inverse FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Integral Transforms (including FFT). + + + + + Shared internal DET algorithm. + + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Fourier Transform Convention + + + + + Inverse integrand exponent (forward: positive sign; inverse: negative sign). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling and common exponent (used in Maple). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction (used in Matlab). [= AsymmetricScaling] + + + + + Inverse integrand exponent; No scaling at all (used in all Numerical Recipes based implementations). [= InverseExponent | NoScaling] + + + + + Analytic integration algorithm for smooth functions with no discontinuities + or derivative discontinuities and no poles inside the interval. + + + + + Maximum number of iterations, until the asked + maximum error is (likely to be) satisfied. + + + + + Precomputed abscissa vector per level. + + + + + Precomputed weight vector per level. + + + + + Abscissa vector per level provider. + + + + + Weight vector per level provider. + + + + + Approximate the integral by the double exponential transformation + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Abscissa vector per level provider. + + Level Enumerator. + + + + Weight vector per level provider. + + Level Enumerator. + + + + Compute the abscissa vector for a single level. + + The level to evaluate the abscissa vector for. + Abscissa Vector. + + + + Compute the weight vector for a single level. + + The level to evaluate the weight vector for. + Weight Vector. + + + + Approximation algorithm for definite integrals by Simpson's rule. + + + + + Direct 3-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Even number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Approximation algorithm for definite integrals by the Trapezium rule of the Newton-Cotes family. + + + Wikipedia - Trapezium Rule + + + + + Direct 2-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Abscissa vector per level provider. + Weight vector per level provider. + First Level Step + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Numeric Integration (Quadrature). + + + + + Shared internal DET algorithm. + + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Akima Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Three-Point Differentiation Helper. + + Sample Points t. + Sample Values x(t). + Index of the point of the differentiation. + Index of the first sample. + Index of the second sample. + Index of the third sample. + The derivative approximation. + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Interpolation Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Sample Points t. + + + + + Sample Values x(t). + + + + + Barycentric Weights w(t). + + + + + Initializes a new instance of the BarycentricInterpolation class. + + + + + Initializes a new instance of the BarycentricInterpolation class. + + Sample Points t (no sorting assumed) + Sample Values x(t) + Barycentric weights w(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + Barycentric weights w(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Rational Interpolation (with poles) using Roland Bulirsch and Josef Stoer's Algorithm. + + + + This algorithm supports neither differentiation nor integration. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Spline Interpolation Algorithm with continuous first and second derivatives. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Coefficient Vector + + + + Tridiagonal Solve Helper. + + The a-vector[n]. + The b-vector[n], will be modified by this function. + The c-vector[n]. + The d-vector[n], will be modified by this function. + The x-vector[n] + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Hermite Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Rational Interpolation without poles, using Mike Floater and Kai Hormann's Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Initialize the interpolation method with the given sample set. + + + The interpolation scheme order will be set to 3. + + Sample Points t (no sorting assumed) + Sample Values x(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Linear Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Lagrange Polynomial Interpolation using Neville's Algorithm. + + + + This algorithm supports differentiation, but doesn't support integration. + + + When working with equidistant or Chebyshev sample points it is + recommended to use the barycentric algorithms specialized for + these cases instead of this arbitrary Neville algorithm. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Third-Degree Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Sample Points t. + + + + + Spline Coefficients c(t). + + + + + Number of samples. + + + + + Initializes a new instance of the SplineInterpolation class. + + + + + Initializes a new instance of the SplineInterpolation class. + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Find the index of the greatest sample point smaller than t. + + The value to look for. + The sample point index. + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Interpolation Factory. + + + + + Creates an interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a linear spline interpolation based on arbitrary points (sorted ascending). + + The sample points t, sorted ascending. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a floater hormann rational pole-free interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a burlish stoer rational interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Left and right boundary conditions. + + + + + Natural Boundary (Zero second derivative). + + + + + Parabolically Terminated boundary. + + + + + Fixed first derivative at the boundary. + + + + + Fixed second derivative at the boundary. + + + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + + + Returns the greatest common divisor (gcd) of two big integers. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two big integers. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Find out whether the provided 32 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 64 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 32 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 64 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 32 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find out whether the provided 64 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find the closest perfect power of two that is larger or equal to the provided + 32 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Find the closest perfect power of two that is larger or equal to the provided + 64 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 31). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 63). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Find out whether the provided 32 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Find out whether the provided 64 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Returns the greatest common divisor (gcd) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's + algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Utilities for working with floating point numbers. + + + + Useful links: + + + http://docs.sun.com/source/806-3568/ncg_goldberg.html#689 - What every computer scientist should know about floating-point arithmetic + + + http://en.wikipedia.org/wiki/Machine_epsilon - Gives the definition of machine epsilon + + + + + + + + The base number for binary values + + + + + The number of binary digits used to represent the binary number for a double precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The number of binary digits used to represent the binary number for a single precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The maximum relative precision of a double + + + + + The maximum relative precision of a single + + + + + The number of significant figures that a double-precision floating point has. + + + + + The number of significant figures that a single-precision floating point has. + + + + Value representing 10 * 2^(-52) + + + Value representing 10 * 2^(-52) + + + + Initializes static members of the Precision class. + + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the number divided by it's magnitude, effectively returning a number between -10 and 10. + + The value. + The value of the number. + + + + Gets the equivalent long value for the given double value. + + The double value which should be turned into a long value. + + The resulting long value. + + + + + Returns a 'directional' long value. This is a long value which acts the same as a double, + e.g. a negative double value will return a negative double value starting at 0 and going + more negative as the double value gets more negative. + + The input double value. + A long value which is roughly the equivalent of the double value. + + + + Returns a 'directional' int value. This is a int value which acts the same as a float, + e.g. a negative float value will return a negative int value starting at 0 and going + more negative as the float value gets more negative. + + The input float value. + An int value which is roughly the equivalent of the double value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + How many times the number should be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + How many times the number should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The absolute threshold for to consider it as zero. + Zero if || is smaller than , otherwise. + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero. + + The real number to coerce to zero, if it is almost zero. + Zero if || is smaller than 2^(-53) = 1.11e-16, otherwise. + + + + Determines the range of floating point numbers that will match the specified value with the given tolerance. + + The value. + The ulps difference. + The bottom range end. + The top range end. + + Thrown if is smaller than zero. + + + + + Returns the floating point number that will match the value with the tolerance on the maximum size (i.e. the result is + always bigger than the value) + + The value. + The ulps difference. + The maximum floating point number which is larger than the given . + + + + Returns the floating point number that will match the value with the tolerance on the minimum size (i.e. the result is + always smaller than the value) + + The value. + The ulps difference. + The minimum floating point number which is smaller than the given . + + + + Determines the range of ulps that will match the specified value with the given tolerance. + + The value. + The relative difference. + The number of ULPS between the value and the value - relativeDifference. + The number of ULPS between the value and the value + relativeDifference. + + Thrown if is smaller than zero. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Evaluates the count of numbers between two double numbers + + The first parameter. + The second parameter. + The second number is included in the number, thus two equal numbers evaluate to zero and two neighbor numbers evaluate to one. Therefore, what is returned is actually the count of numbers between plus 1. + The number of floating point values between and . + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two structures with precision support are almost equal. + + The type of the structures. Must implement . + The first structure + The second structure + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both doubles are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two structure with precision support and determines if they are equal + within the specified maximum relative error. + + + The type of the structures. Must implement . + + The first structure. + The second structure. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two lists of structures with precision support and determines if they + are equal within the specified maximum error. + + + The type of the structures. Must implement . + + The first structure list. + The second structure list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum absolute error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The absolute accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum absolute error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum relative error. + + The first value. + The second value. + The difference of the two values (according to some norm). + + The relative accuracy required for being + almost equal. + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + + + Determines the 'number' of floating point numbers between two values (i.e. the number of discrete steps + between the two numbers) and then checks if that is within the specified tolerance. So if a tolerance + of 1 is passed then the result will be true only if the two numbers have the same binary representation + OR if they are two adjacent numbers that only differ by one step. + + + The comparison method used is explained in http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm . The article + at http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx explains how to transform the C code to + .NET enabled code without using pointers and unsafe code. + + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both doubles are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two floats and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both floats are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two doubles and determines if the first value is larger than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is larger than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The maximum error in terms of Units in Last Place (ulps), i.e. the maximum number of decimals that may be different. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than the tolerance. + + + 0 + is equal to within the tolerance. + + + 1 + is bigger than by more than the tolerance. + + + + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The number of decimal places on which the values must be compared. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than a magnitude equal to . + + + 0 + is equal to within a magnitude equal to . + + + 1 + is bigger than by more than a magnitude equal to . + + + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + + Relative Epsilon (positive double or NaN). + + Evaluates the negative epsilon. The more common positive epsilon is equal to two times this negative epsilon. + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + Relative Epsilon (positive double or NaN) + Evaluates the positive epsilon. See also + + + + + Converts a float valut to a bit array stored in an int. + + The value to convert. + The bit array. + + + + Gets the maximum relative precision of a double. + + The maximum relative precision of a double. + + + + Gets the maximum relative precision of a single. + + The maximum relative precision of a single. + + + + Gets the number of decimal places for floats. + + The number of decimal places for floats. + + + + Gets the number of decimal places for doubles. + + The number of decimal places for doubles. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The array arguments must have the same length.. + + + + + Looks up a localized string similar to The given array is the wrong length. Should be {0}.. + + + + + Looks up a localized string similar to The argument must be between 0 and 1.. + + + + + Looks up a localized string similar to Value cannot be in the range -1 < x < 1.. + + + + + Looks up a localized string similar to Value must be even.. + + + + + Looks up a localized string similar to The histogram does not contains the value.. + + + + + Looks up a localized string similar to Value is expected to be between {0} and {1} (including {0} and {1}).. + + + + + Looks up a localized string similar to At least one item of {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be greater than or equal to one.. + + + + + Looks up a localized string similar to han the given upper bound.. + + + + + Looks up a localized string similar to Matrix dimensions must agree.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: {0}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}, op3 is {2}.. + + + + + Looks up a localized string similar to The requested matrix does not exist.. + + + + + Looks up a localized string similar to The matrix indices must not be out of range of the given matrix.. + + + + + Looks up a localized string similar to Matrix must not be rank deficient.. + + + + + Looks up a localized string similar to Matrix must not be singular.. + + + + + Looks up a localized string similar to Matrix must be positive definite.. + + + + + Looks up a localized string similar to Matrix column dimensions must agree.. + + + + + Looks up a localized string similar to Matrix row dimensions must agree.. + + + + + Looks up a localized string similar to Matrix must have exactly one column.. + + + + + Looks up a localized string similar to Matrix must have exactly one column and row, thus have only one cell.. + + + + + Looks up a localized string similar to Matrix must have exactly one row.. + + + + + Looks up a localized string similar to Matrix must be square.. + + + + + Looks up a localized string similar to Matrix must be symmetric.. + + + + + Looks up a localized string similar to Matrix must be symmetric positive definite.. + + + + + Looks up a localized string similar to In the specified range, the minimum is greater than maximum.. + + + + + Looks up a localized string similar to Value must be positive.. + + + + + Looks up a localized string similar to Value must neither be infinite nor NaN.. + + + + + Looks up a localized string similar to Value must not be negative (zero is ok).. + + + + + Looks up a localized string similar to {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be odd.. + + + + + Looks up a localized string similar to {0} must be greater than {1}.. + + + + + Looks up a localized string similar to {0} must be greater than or equal to {1}.. + + + + + Looks up a localized string similar to The chosen parameter set is invalid (probably some value is out of range).. + + + + + Looks up a localized string similar to The given expression does not represent a complex number.. + + + + + Looks up a localized string similar to Value must be positive (and not zero).. + + + + + Looks up a localized string similar to Size must be a Power of Two.. + + + + + Looks up a localized string similar to Size must be a Power of Two in every dimension.. + + + + + Looks up a localized string similar to The range between {0} and {1} must be less than or equal to {2}.. + + + + + Looks up a localized string similar to Arguments must be different objects.. + + + + + Looks up a localized string similar to Array must have exactly one dimension (and not be null).. + + + + + Looks up a localized string similar to Value is too large.. + + + + + Looks up a localized string similar to Value is too large for the current iteration limit.. + + + + + Looks up a localized string similar to Type mismatch.. + + + + + Looks up a localized string similar to Array length must be a multiple of {0}.. + + + + + Looks up a localized string similar to All vectors must have the same dimensionality.. + + + + + Looks up a localized string similar to The vector must have 3 dimensions.. + + + + + Looks up a localized string similar to The given array is too small. It must be at least {0} long.. + + + + + Looks up a localized string similar to Big endian files are not supported.. + + + + + Looks up a localized string similar to The supplied collection is empty.. + + + + + Looks up a localized string similar to Complex matrices are not supported.. + + + + + Looks up a localized string similar to An algorithm failed to converge.. + + + + + Looks up a localized string similar to This feature is not implemented yet (but is planned).. + + + + + Looks up a localized string similar to The given file doesn't exist.. + + + + + Looks up a localized string similar to Sample points should be sorted in strictly ascending order. + + + + + Looks up a localized string similar to All sample points should be unique.. + + + + + Looks up a localized string similar to Invalid parameterization for the distribution.. + + + + + Looks up a localized string similar to Invalid Left Boundary Condition.. + + + + + Looks up a localized string similar to The operation could not be performed because the accumulator is empty.. + + + + + Looks up a localized string similar to The operation could not be performed because the histogram is empty.. + + + + + Looks up a localized string similar to Not enough points in the distribution.. + + + + + Looks up a localized string similar to No Samples Provided. Preparation Required.. + + + + + Looks up a localized string similar to Invalid Right Boundary Condition.. + + + + + Looks up a localized string similar to ddd MMM dd HH:mm:ss yyyy. + + + + + Looks up a localized string similar to The number of columns of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows or columns of a matrix must be positive.. + + + + + Looks up a localized string similar to Only 1 and 2 dimensional arrays are supported.. + + + + + Looks up a localized string similar to Data must contain at least {0} values.. + + + + + Looks up a localized string similar to Name cannot contain a space. name: {0}. + + + + + Looks up a localized string similar to {0} is not a supported type.. + + + + + Looks up a localized string similar to The two arguments can't be compared (maybe they are part of a partial ordering?). + + + + + Looks up a localized string similar to The integer array does not represent a valid permutation.. + + + + + Looks up a localized string similar to The sampler's proposal distribution is not upper bounding the target density.. + + + + + Looks up a localized string similar to The number of rows must greater than or equal to the number of columns.. + + + + + Looks up a localized string similar to The singular vectors were not computed.. + + + + + Looks up a localized string similar to This special case is not supported yet (but is planned).. + + + + + Looks up a localized string similar to The given stop criterium already exist in the collection.. + + + + + Looks up a localized string similar to There is no stop criterium in the collection.. + + + + + Looks up a localized string similar to String parameter cannot be empty or null.. + + + + + Looks up a localized string similar to We only support sparse matrix with less than int.MaxValue elements.. + + + + + Looks up a localized string similar to The moment of the distribution is undefined.. + + + + + Looks up a localized string similar to A user defined provider has not been specified.. + + + + + Looks up a localized string similar to The given work array is too small. Check work[0] for the corret size.. + + + + + Abstract class for random number generators. This class introduces a layer between + and the Math.Net Numerics random number generators to provide thread safety. + + + + + The method that actually generates samples. + + + + + The object that will be locked for thread safety. + + + + + Initializes a new instance of the class using + the value of to set whether + the instance is thread safe or not. + + + + + Initializes a new instance of the class. + + if set to true , the class is thread safe. + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns an array of uniformly distributed random doubles in the interval [0.0,1.0]. + + The size of the array. + + An array of uniformly distributed random doubles in the interval [0.0,1.0]. + + if n is not greater than 0. + + + + Returns a nonnegative random number. + + + A 32-bit signed integer greater than or equal to zero and less than . + + + + + Returns a random number less then a specified maximum. + + The exclusive upper bound of the random number returned. + A 32-bit signed integer less than . + is negative. + + + + Returns a random number within a specified range. + + The inclusive lower bound of the random number returned. + The exclusive upper bound of the random number returned. must be greater than or equal to . + + A 32-bit signed integer greater than or equal to and less than ; that is, the range of return values includes but not . If equals , is returned. + + is greater than . + + + + Fills the elements of a specified array of bytes with random numbers. + + An array of bytes to contain random numbers. + is null. + + + + Returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + Thread safe version of which returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0 + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + A delegate type that represents a method that generates random numbers. + + Randomly distributed numbers. + + + + Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Random number generator using Mersenne Twister 19937 algorithm. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + Uses the value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + A 32-bit combined multiple recursive generator with 2 components of order 3. + + Based off of P. L'Ecuyer, "Combined Multiple Recursive Random Number Generators," Operations Research, 44, 5 (1996), 816--822. + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Represents a Parallel Additive Lagged Fibonacci pseudo-random number generator. + + + The type bases upon the implementation in the + Boost Random Number Library. + It uses the modulus 232 and by default the "lags" 418 and 1279. Some popular pairs are presented on + Wikipedia - Lagged Fibonacci generator. + + + + + Default value for the ShortLag + + + + + Default value for the LongLag + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The ShortLag value + TheLongLag value + + + + Stores an array of random numbers + + + + + Stores an index for the random number array element that will be accessed next. + + + + + Fills the array with new unsigned random numbers. + + + Generated random numbers are 32-bit unsigned integers greater than or equal to 0 + and less than or equal to . + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Gets the short lag of the Lagged Fibonacci pseudo-random number generator. + + + + + Gets the long lag of the Lagged Fibonacci pseudo-random number generator. + + + + + A random number generator based on the class in the .NET library. + + + + + Construct a new random number generator with a random seed. + + Uses and uses the value of + to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + Uses the value of to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + Uses + if set to true , the class is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + This class implements extension methods for the System.Random class. The extension methods generate + pseudo-random distributed numbers for types other than double and int32. + + + + + Returns a nonnegative random number less than . + + + The random object to extend. + + + A 64-bit signed integer greater than or equal to 0, and less than ; that is, + the range of return values includes 0 but not . + + + + + + Returns a random number of the full Int32 range. + + + The random object to extend. + + + A 32-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a random number of the full Int64 range. + + + The random object to extend. + + + A 64-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a nonnegative decimal floating point random number less than 1.0. + + + The random object to extend. + + + A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, + the range of return values includes 0.0 but not 1.0. + + + + + Wichmann-Hill’s 1982 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (1982), "Algorithm AS 183: + An efficient and portable pseudo-random number generator". Applied Statistics 31 (1982) 188-190 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Wichmann-Hill’s 2006 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (2006), "Generating good pseudo-random numbers". + Computational Statistics & Data Analysis 51:3 (2006) 1614-1622 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Implements a multiply-with-carry Xorshift pseudo random number generator (RNG) specified in Marsaglia, George. (2003). Xorshift RNGs. + Xn = a * Xn−3 + c mod 2^32 + http://www.jstatsoft.org/v08/i14/paper + + + + + The default value for X1. + + + + + The default value for X2. + + + + + The default value for the multiplier. + + + + + The default value for the carry over. + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Note: must be less than . + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Seed or last but three unsigned random number. + + + + + Last but two unsigned random number. + + + + + Last but one unsigned random number. + + + + + The value of the carry over. + + + + + The multiplier. + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a two-domain function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function at the roots of the Chebyshev polynomial of the first kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*(2i-1)/(2n)) + + + + + + Samples a function at the roots of the Chebyshev polynomial of the second kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*i/(n-1)) + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant continuously starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated sample enumerator. + + + + + Samples a function equidistant with the provided start and step length to an integer-domain function + + The real-domain function to sample. + The real domain location where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated samples integer-domain function. + + + + + Sorting algorithms for single, tuple and triple lists. + + + + + Sort a list of keys, in place using the quick sort algorithm. + + The type of elements stored in the list. + List to sort. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the item list. + List to sort. + List to permute the same way as the key list. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the first item list. + The type of elements stored in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + + + + Sort a list of keys, in place using the quick sort algorithm using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + Comparison, defining the sort order. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the item list. + List to sort. + List to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the first item list. + The type of elements in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of element in the list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + Comparison, defining the sort order. + + + + Recursive implementation for an in place quick sort on a list. + + The type of the list on which the quick sort is performed. + The list which is sorted using quick sort. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on a list while reordering one other list accordingly. + + The type of the list on which the quick sort is performed. + The type of the list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on one list while reordering two other lists accordingly. + + The type of the list on which the quick sort is performed. + The type of the first list which is automatically reordered accordingly. + The type of the second list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The first list which is automatically reordered accordingly. + The second list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Performs an in place swap of two elements in a list. + + The type of elements stored in the list. + The list in which the elements are stored. + The index of the first element of the swap. + The index of the second element of the swap. + + + + A class with correlation measures between two datasets. + + + + + Computes the Pearson product-moment correlation coefficient. + + Sample data A. + Sample data B. + The Pearson product-moment correlation coefficient. + + + + Computes the basic statistics of data set. The class meets the + NIST standard of accuracy for mean, variance, and standard deviation + (the only statistics they provide exact values for) and exceeds them + in increased accuracy mode. + + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Computes descriptive statistics from a stream of data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of data values using high accuracy. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values using high accuracy. + + A sequence of datapoints. + + + + Internal use. Method use for setting the statistics. + + For setting Mean. + For setting Variance. + For setting Skewness. + For setting Kurtosis. + For setting Minimum. + For setting Maximum. + For setting Count. + + + + Gets the size of the sample. + + The size of the sample. + + + + Gets the sample mean. + + The sample mean. + + + + Gets the unbiased population variance estimator (on a dataset of size N will use an N-1 normalizer). + + The sample variance. + + + + Gets the unbiased population standard deviation (on a dataset of size N will use an N-1 normalizer). + + The sample standard deviation. + + + + Gets the sample skewness. + + The sample skewness. + Returns zero if is less than three. + + + + Gets the sample median. + + The sample median. + + + + Gets the sample kurtosis. + + The sample kurtosis. + Returns zero if is less than four. + + + + Gets the maximum sample value. + + The maximum sample value. + + + + Gets the minimum sample value. + + The minimum sample value. + + + + A consists of a series of s, + each representing a region limited by a lower bound (exclusive) and an upper bound (inclusive). + + + + + Initializes a new instance of the Bucket class. + + + + + Initializes a new instance of the Bucket class. + + + + + Creates a copy of the Bucket with the lowerbound, upperbound and counts exactly equal. + + A cloned Bucket object. + + + + This method check whether a point is contained within this bucket. + + The point to check. + 0 if the point falls within the bucket boundaries; -1 if the point is + smaller than the bucket, +1 if the point is larger than the bucket. + + + + Comparison of two disjoint buckets. The buckets cannot be overlapping. + + + + + Checks whether two Buckets are equal; this method tolerates a difference in lowerbound, upperbound + and count given by . + + + + + Provides a hash code for this bucket. + + + + + Formats a human-readable string for this bucket. + + + + + + Lower Bound of the Bucket. + + + + + Upper Bound of the Bucket. + + + + + The number of datapoints in the bucket. + + + + + Width of the Bucket. + + + + + Default comparer. + + + + + This IComparer performs comparisons between a point and a bucket. + + + + + Compares a point and a bucket. The point will be encapsulated in a bucket with width 0. + + The first bucket to compare. + The second bucket to compare. + -1 when the point is less than this bucket, 0 when it is in this bucket and 1 otherwise. + + + + A class which computes histograms of data. + + + + + Contains all the Buckets of the Histogram. + + + + + Indicates whether the elements of buckets are currently sorted. + + + + + Initializes a new instance of the Histogram class. + + + + + Constructs a Histogram with a specific number of equally sized buckets. The upper and lower bound of the histogram + will be set to the smallest and largest datapoint. + + The datasequence to build a histogram on. + The number of buckets to use. + + + + Constructs a Histogram with a specific number of equally sized buckets. + + The datasequence to build a histogram on. + The number of buckets to use. + The histogram lower bound. + The histogram upper bound. + + + + Add one data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The datapoint which we want to add. + + + + Add a sequence of data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The sequence of datapoints which we want to add. + + + + Adds a Bucket to the Histogram. + + + + + Sort the buckets if needed. + + + + + Returns the Bucket that contains the value v. + + The point to search the bucket for. + A copy of the bucket containing point . + + + + Returns the index in the Histogram of the Bucket + that contains the value v. + + The point to search the bucket index for. + The index of the bucket containing the point. + + + + Prints the buckets contained in the . + + + + + Returns the lower bound of the histogram. + + + + + Returns the upper bound of the histogram. + + + + + Gets the n'th bucket. + + The index of the bucket to be returned. + A copy of the n'th bucket. + + + + Gets the number of buckets. + + + + + Gets the total number of datapoints in the histogram. + + + + + A hybrid Monte Carlo sampler for multivariate distributions. + + + + + The Hybrid (also called Hamiltonian) Monte Carlo produces samples from distribition P using a set + of Hamiltonian equations to guide the sampling process. It uses the negative of the log density as + a potential energy, and a randomly generated momentum to set up a Hamiltonian system, which is then used + to sample the distribution. This can result in a faster convergence than the random walk Metropolis sampler + (). + + The type of samples this sampler produces. + + + + The interface which every sampler must implement. + + The type of samples this sampler produces. + + + + The random number generator for this class. + + + + + Keeps track of the number of accepted samples. + + + + + Keeps track of the number of calls to the proposal sampler. + + + + + Initializes a new instance of the class. + + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns one sample. + + + + + Returns a number of samples. + + The number of samples we want. + An array of samples. + + + + Gets or sets the random number generator. + + When the random number generator is null. + + + + Gets the acceptance rate of the sampler. + + + + + Evaluates the energy function of the target distribution. + + + + + The current location of the sampler. + + + + + The number of burn iterations between two samples. + + + + + The size of each step in the Hamiltonian equation. + + + + + The number of iterations in the Hamiltonian equation. + + + + + The algorithm used for differentiation. + + + + + Constructs a new Hybrid Monte Carlo sampler. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + Random number generator used for sampling the momentum. + The method used for differentiation. + When the number of burnInterval iteration is negative. + When either x0, pdfLnP or diff is null. + + + + Returns a sample from the distribution P. + + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Method used to update the sample location. Used in the end of the loop. + + The old energy. + The old gradient/derivative of the energy. + The new sample. + The new gradient/derivative of the energy. + The new energy. + The difference between the old Hamiltonian and new Hamiltonian. Use to determine + if an update should take place. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Method for doing dot product. + + First vector/scalar in the product. + Second vector/scalar in the product. + + + + + Method for adding, multiply the second vector/scalar by factor and then + add it to the first vector/scalar. + + First vector/scalar. + Scalar factor multiplying by the second vector/scalar. + Second vector/scalar. + + + + Multiplying the second vector/scalar by factor and then subtract it from + the first vector/scalar. + + First vector/scalar. + Scalar factor to be multiplied to the second vector/scalar. + Second vector/scalar. + + + + Method for sampling a random momentum. + + Momentum to be randomized. + + + + The Hamiltonian equations that is used to produce the new sample. + + + + + Method to compute the Hamiltonian used in the method. + + The momentum. + The energy. + Hamiltonian=E+p.p/2 + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than or equal to zero. + Throws when value is negative. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than to zero. + Throws when value is negative or zero. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than zero. + Throws when value is negative or zero. + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the number of iterations in the Hamiltonian equation. + + When frogleap steps is negative or zero. + + + + Gets or sets the size of each step in the Hamiltonian equation. + + When step size is negative or zero. + + + + The delegate type that defines a derivative evaluated at a certain point. + + Function to be differentiated. + Value where the derivative is computed. + + + + + Number of parameters in the density function. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of different components of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The burn interval will be set to 0. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the a random number generator provided by the user. + A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviations + given by pSdv. This constructor will set the burn interval, the method used for + numerical differentiation and the random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + The method used for numerical differentiation. + When the number of burnInterval iteration is negative. + When the length of pSdv is not the same as x0. + + + + Initialize parameters. + + The current location of the sampler. + + + + Checking that the location and the momentum are of the same dimension and that each component is positive. + + The standard deviations used for sampling the momentum. + When the length of pSdv is not the same as Length or if any + component is negative. + When pSdv is null. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the gradient. Uses a simple three point estimation. + + Function which the gradient is to be evaluated. + The location where the gradient is to be evaluated. + The gradient of the function at the point x. + + + + Gets or sets the standard deviations used in the sampling of different components of the + momentum. + + When the length of pSdv is not the same as Length. + + + + Provides utilities to analysis the convergence of a set of samples from + a . + + + + + Computes the auto correlations of a series evaluated by a function f. + + The series for computing the auto correlation. + The lag in the series + The function used to evaluate the series. + The auto correlation. + Throws if lag is zero or if lag is + greater than or equal to the length of Series. + + + + Computes the effective size of the sample when evaluated by a function f. + + The samples. + The function use for evaluating the series. + The effective size when auto correlation is taken into account. + + + + A method which samples datapoints from a proposal distribution. The implementation of this sampler + is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it doesn't take any parameters; it samples random + variables from the whole domain. + + The type of the datapoints. + A sample from the proposal distribution. + + + + A method which samples datapoints from a proposal distribution given an initial sample. The implementation + of this sampler is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it samples locally around an initial point. In other words, it + makes a small local move rather than producing a global sample from the proposal. + + The type of the datapoints. + The initial sample. + A sample from the proposal distribution. + + + + A function which evaluates a density. + + The type of data the distribution is over. + The sample we want to evaluate the density for. + + + + A function which evaluates a log density. + + The type of data the distribution is over. + The sample we want to evaluate the log density for. + + + + A function which evaluates the log of a transition kernel probability. + + The type for the space over which this transition kernel is defined. + The new state in the transition. + The previous state in the transition. + The log probability of the transition. + + + + Metropolis-Hastings sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis-Hastings sampling doesn't require that the + proposal distribution Q is symmetric in comparison to . It does need to + be able to evaluate the proposal sampler's log density though. All densities are required to be in log space. + + The Metropolis-Hastings sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the target distribution. + + + + + Evaluates the log transition probability for the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis-Hastings sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + + + + Constructs a new Metropolis-Hastings sampler using the default random number generator. This + constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Metropolis sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis sampling requires that the proposal + distribution Q is symmetric. All densities are required to be in log space. + + The Metropolis sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the sampling distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis sampler using the default random + number generator. The burnInterval interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + + + + Constructs a new Metropolis sampler using the default random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Rejection sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P and Q. The density of P and Q don't need to + to be normalized, but we do need that for each x, P(x) < Q(x). + + The type of samples this sampler produces. + + + + Evaluates the density function of the sampling distribution. + + + + + Evaluates the density function of the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + Constructs a new rejection sampler using the default random number generator. + + The density of the distribution we want to sample from. + The density of the proposal distribution. + A method that samples from the proposal distribution. + + + + Returns a sample from the distribution P. + + When the algorithms detects that the proposal + distribution doesn't upper bound the target distribution. + + + + A hybrid Monte Carlo sampler for univariate distributions. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The burn interval will be set to 0. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using a random + number generator provided by the user. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + Random number generator used to sample the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + given by pSdv using a random + number generator provided by the user. This constructor will set both the burn interval and the method used for + numerical differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + The method used for numerical differentiation. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the derivative. Uses a simple three point estimation. + + Function for which the derivative is to be evaluated. + The location where the derivative is to be evaluated. + The derivative of the function at the point x. + + + + Gets or sets the standard deviation used in the sampling of the + momentum. + + When standard deviation is negative. + + + + Methods to calculate the percentiles. + + + + + Using the method recommened my NIST, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Using the nearest rank, http://en.wikipedia.org/wiki/Percentile#Nearest_Rank + + + + + Using the same method as Excel does, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Use linear interpolation between the two nearest ranks, + http://en.wikipedia.org/wiki/Percentile#Linear_Interpolation_Between_Closest_Ranks + + + + + Class to calculate percentiles. + + + + + Holds the data. + + + + + Initializes a new instance of the class. + + The data to calculate the percentiles of. + + + + Computes the percentile. + + The percentile, must be between 0.0 and 1.0 (inclusive). + the requested percentile. + + + + Computes the percentiles for the given list. + + The percentiles, must be between 0.0 and 1.0 (inclusive) + the values that correspond to the given percentiles. + + + + Gets or sets the method used to calculate the percentiles. + + The calculation method. + defaults to . + + + + Extension methods to return basic statistics on set of data. + + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The minimum value in the sample data. + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The minimum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The maximum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The maximum value in the sample data. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + + + + Slice sampling produces samples from distribition P by uniformly sampling from under the pdf of P using + a technique described in "Slice Sampling", R. Neal, 2003. All densities are required to be in log space. + + The slice sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + + + + Evaluates the log density function of the target distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + The scale of the slice sampler. + + + + + Constructs a new Slice sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The density of the distribution we want to sample from. + The scale factor of the slice sampler. + When the scale of the slice sampler is not positive. + + + + Constructs a new slice sampler using the default random number generator. It + will set the number of burnInterval iterations and run a burnInterval phase. + + The initial sample. + The density of the distribution we want to sample from. + The number of iterations in between returning samples. + The scale factor of the slice sampler. + When the number of burnInterval iteration is negative. + When the scale of the slice sampler is not positive. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the scale of the slice sampler. + + + + + Used to simplify parallel code, particularly between the .NET 4.0 and Silverlight Code. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The array to iterate over. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes each of the provided actions inside a discrete, asynchronous task. + + An array of actions to execute. + The actions array contains a null element. + At least one invocation of the actions threw an exception. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Double-precision trigonometry toolkit. + + + + + Constant to convert a degree to grad. + + + + + Trigonometric Cosecant of an angle in radian. + + + The angle in radian. + + + Cosecant of an angle in radian. + + + + + Trigonometric Cosecant of a Complex number. + + + The complex value. + + + The cosecant of a complex number. + + + + + Trigonometric Cosine of an angle in radian. + + + The angle in radian. + + + The cosine of an angle in radian. + + + + + Trigonometric Cosine of a Complex number. + + + The complex value. + + + The cosine of a complex number. + + + + + Trigonometric Cotangent of an angle in radian. + + + The angle in radian. + + + The cotangent of an angle in radian. + + + + + Trigonometric Cotangent of a Complex number. + + + The complex value. + + + The cotangent of the complex number. + + + + + Converts a degree (360-periodic) angle to a grad (400-periodic) angle. + + + The degree to convert. + + + The converted grad angle. + + + + + Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + + + The degree to convert. + + + The converted radian angle. + + + + + Converts a grad (400-periodic) angle to a degree (360-periodic) angle. + + + The grad to convert. + + + The converted degree. + + + + + Converts a grad (400-periodic) angle to a radian (2*Pi-periodic) angle. + + + The grad to convert. + + + The converted radian. + + + + + Trigonometric Hyperbolic Cosecant + + + The angle in radian. + + + The hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Cosecant of a Complex number. + + + The complex value. + + + The hyperbolic cosecant of a complex number. + + + + + Trigonometric Hyperbolic Cosine + + + The angle in radian. + + + The hyperbolic Cosine of the radian angle. + + + + + Trigonometric Hyperbolic Cosine of a Complex number. + + + The complex value. + + + The hyperbolic cosine of a complex number. + + + + + Trigonometric Hyperbolic Cotangent + + + The angle in radian angle. + + + The hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Cotangent of a Complex number. + + + The complex value. + + + The hyperbolic cotangent of a complex number. + + + + + Trigonometric Hyperbolic Secant + + + The angle in radian angle. + + + The hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Secant of a Complex number. + + + The complex value. + + + The hyperbolic secant of a complex number. + + + + + Trigonometric Hyperbolic Sine + + + The angle in radian angle. + + + The hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Sine of a Complex number. + + + The complex value. + + + The hyperbolic sine of a complex number. + + + + + Trigonometric Hyperbolic Tangent in radian + + + The angle in radian angle. + + + The hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Tangent of a Complex number. + + + The complex value. + + + The hyperbolic tangent of a complex number. + + + + + Trigonometric Arc Cosecant in radian + + + The angle in radian angle. + + + The inverse cosecant of the radian angle. + + + if -1 < < 1. + + + + + Trigonometric Arc Cosecant of this Complex number. + + + The complex value. + + + The arc cosecant of a complex number. + + + + + Trigonometric Arc Cosine in radian + + + The angle in radian angle. + + + The inverse cosine of the radian angle. + + + if 1 < or < -1. + + + + + Trigonometric Arc Cosine of this Complex number. + + + The complex value. + + + The arc cosine of a complex number. + + + + + Trigonometric Arc Cotangent in radian + + + The angle in radian angle. + + + The inverse cotangent of the radian angle. + + + + + Trigonometric Arc Cotangent of this Complex number. + + + The complex value. + + + The arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Arc Cosecant + + + The angle in radian angle. + + + The inverse hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosecant of this Complex number. + + + The complex value. + + + The hyperbolic arc cosecant of a complex number. + + + + + Trigonometric Hyperbolic Area Cosine + + + The angle in radian angle. + + + The inverse hyperbolic cosine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosine of this Complex number. + + + The complex value. + + + The hyperbolic arc cosine of a complex number. + + + + + Trigonometric Hyperbolic Arc Cotangent + + + The angle in radian angle. + + + The inverse hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cotangent of this Complex number. + + + The complex value. + + + The hyperbolic arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Area Secant + + + The angle in radian angle. + + + The inverse hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Secant of this Complex number. + + + The complex value. + + + The hyperbolic arc secant of a complex number. + + + + + Trigonometric Hyperbolic Area Sine + + + The angle in radian angle. + + + The inverse hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Sine of this Complex number. + + + The complex value. + + + The hyperbolic arc sine of a complex number. + + + + + Trigonometric Hyperbolic Area Tangent + + + The angle in radian angle. + + + The inverse hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Tangent of this Complex number. + + + The complex value. + + + The hyperbolic arc tangent of a complex number. + + + + + Trigonometric Arc Secant in radian + + + The angle in radian angle. + + + The inverse secant of the radian angle. + + + + + Trigonometric Arc Secant of this Complex number. + + + The complex value. + + + The arc secant of a complex number. + + + + + Trigonometric Arc Sine in radian + + + The angle in radian angle. + + + The inverse sine of the radian angle. + + + + + Trigonometric Arc Sine of this Complex number. + + + The complex value. + + + The arc sine of a complex number. + + + + + Trigonometric Arc Tangent in radian + + + The angle in radian angle. + + + The inverse tangent of the radian angle. + + + + + Trigonometric Arc Tangent of this Complex number. + + + The complex value. + + + The arc tangent of a complex number. + + + + + Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + + + The radian to convert. + + + The converted degree. + + + + + Converts a radian (2*Pi-periodic) angle to a grad (400-periodic) angle. + + + The radian to convert. + + + The converted grad. + + + + + Trigonometric Secant of an angle in radian + + + The angle in radian. + + + The secant of the radian angle. + + + + + Trigonometric Secant of a Complex number. + + + The complex value. + + + The secant of the complex number. + + + + + Trigonometric Sine of an angle in radian + + + The angle in radian. + + + The sine of the radian angle. + + + + + Trigonometric Sine of a Complex number. + + + The complex value. + + + The sine of the complex number. + + + + + Trigonometric Tangent of an angle in radian + + + The angle in radian. + + + The tangent of the radian angle. + + + + + Trigonometric Tangent of a Complex number. + + + The complex value. + + + The tangent of the complex number. + + + + + Implements the univariate Student t-distribution. For details about this + distribution, see + + Wikipedia - Student's t-distribution. + + We use a slightly generalized version (compared to + Wikipedia) of the Student t-distribution. Namely, one which also + parameterizes the location and scale. See the book "Bayesian Data + Analysis" by Gelman et al. for more details. + The density of the Student t-distribution p(x|mu,scale,dof) = + Gamma((dof+1)/2) (1 + (x - mu)^2 / (scale * scale * dof))^(-(dof+1)/2) / + (Gamma(dof/2)*Sqrt(dof*pi*scale)). + The distribution will use the by + default. Users can get/set the random number generator by using the + property. + The statistics classes will check all the incoming parameters + whether they are in the allowed range. This might involve heavy + computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the location of the Student t-distribution. + + + + + Keeps track of the degrees of freedom for the Student t-distribution. + + + + + Keeps track of the scale for the Student t-distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the StudentT class. This is a Student t-distribution with location 0.0 + scale 1.0 and degrees of freedom 1. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the StudentT class with a particular location, scale and degrees of + freedom. The distribution will + be initialized with the default random number generator. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + When the parameters don't pass the function. + + + + Computes the density of the Student t-distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Student t-distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Student t-distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples student-t distributed random variables. + + The algorithm is method 2 in section 5, chapter 9 + in L. Devroye's "Non-Uniform Random Variate Generation" + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the standard student-t distribution. + a random number from the standard student-t distribution. + + + + Generates a sample from the Student t-distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Student t-distribution. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution using the Box-Muller algorithm. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Student t-distribution. + + + + + Gets or sets the scale of the Student t-distribution. + + + + + Gets or sets the degrees of freedom of the Student t-distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Student t-distribution. + + + + + Gets the variance of the Student t-distribution. + + + + + Gets the standard deviation of the Student t-distribution. + + + + + Gets the entropy of the Student t-distribution. + + + + + Gets the skewness of the Student t-distribution. + + + + + Gets the mode of the Student t-distribution. + + + + + Gets the median of the Student t-distribution. + + + + + Gets the minimum of the Student t-distribution. + + + + + Gets the maximum of the Student t-distribution. + + + + + This structure represents the type over which the distribution + is defined. + + + + + The mean value. + + + + + The precision value. + + + + + Initializes a new instance of the struct. + + + The mean of the pair. + + + The precision of the pair. + + + + + Gets or sets the mean of the pair. + + + + + Gets or sets the precision of the pair. + + + + + The distribution is the conjugate prior distribution for the + distribution. It specifies a prior over the mean and precision of the distribution. + It is parameterized by four numbers: the mean location, the mean scale, the precision shape and the + precision inverse scale. + The distribution NG(mu, tau | mloc,mscale,psscale,pinvscale) = Normal(mu | mloc, 1/(mscale*tau)) * Gamma(tau | psscale,pinvscale). + The following degenerate cases are special: when the precision is known, + the precision shape will encode the value of the precision while the precision inverse scale is positive + infinity. When the mean is known, the mean location will encode the value of the mean while the scale + will be positive infinity. A completely degenerate NormalGamma distribution with known mean and precision is possible as well. + Wikipedia - Normal-Gamma distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The location of the mean. + + + + + The scale of the mean. + + + + + The shape of the precision. + + + + + The inverse scale of the precision. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The location of the mean. + + + The scale of the mean. + + + The shape of the precision. + + + The inverse scale of the precision. + + + + + Checks whether the parameters of the distribution are valid. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + When the parameters don't pass the function. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Returns the marginal distribution for the mean of the NormalGamma distribution. + + the marginal distribution for the mean of the NormalGamma distribution. + + + + Returns the marginal distribution for the precision of the distribution. + + The marginal distribution for the precision of the distribution/ + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + Density value + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + Density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + The log of the density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + The log of the density value + + + + Generates a sample from the NormalGamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + a sequence of samples from the distribution. + + + + Generates a sample from the NormalGamma distribution. + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sequence of samples from the distribution. + + + + Gets or sets the location of the mean. + + + + + Gets or sets the scale of the mean. + + + + + Gets or sets the shape of the precision. + + + + + Gets or sets the inverse scale of the precision. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the variance of the distribution. + + The mean of the distribution. + +
+
diff --git a/bin/Debug/Microsoft.Msagl.Drawing.dll b/bin/Debug/Microsoft.Msagl.Drawing.dll new file mode 100644 index 0000000..f0dc2cd Binary files /dev/null and b/bin/Debug/Microsoft.Msagl.Drawing.dll differ diff --git a/bin/Debug/Microsoft.Msagl.GraphViewerGDI.dll b/bin/Debug/Microsoft.Msagl.GraphViewerGDI.dll new file mode 100644 index 0000000..e106a3c Binary files /dev/null and b/bin/Debug/Microsoft.Msagl.GraphViewerGDI.dll differ diff --git a/bin/Debug/Microsoft.Msagl.dll b/bin/Debug/Microsoft.Msagl.dll new file mode 100644 index 0000000..c9bd6bc Binary files /dev/null and b/bin/Debug/Microsoft.Msagl.dll differ diff --git a/bin/Debug/Microsoft.Research.Science.Data.Slicer.dll b/bin/Debug/Microsoft.Research.Science.Data.Slicer.dll new file mode 100644 index 0000000..759851e Binary files /dev/null and b/bin/Debug/Microsoft.Research.Science.Data.Slicer.dll differ diff --git a/bin/Debug/Microsoft.VC90.CRT.manifest b/bin/Debug/Microsoft.VC90.CRT.manifest new file mode 100644 index 0000000..bbd12cc --- /dev/null +++ b/bin/Debug/Microsoft.VC90.CRT.manifest @@ -0,0 +1,6 @@ + + + + + +CXED+6HzJlSphyMNOn27ujadC0= MyKED+9DyS+1XcMeaC0Zlw2vFZ0= EeyDE7og6WoPd2oBhYbMEnpFHhY= + \ No newline at end of file diff --git a/bin/Debug/R.NET.dll b/bin/Debug/R.NET.dll new file mode 100644 index 0000000..74fb85c Binary files /dev/null and b/bin/Debug/R.NET.dll differ diff --git a/bin/Debug/SQLite.Designer.dll b/bin/Debug/SQLite.Designer.dll new file mode 100644 index 0000000..2fae7f4 Binary files /dev/null and b/bin/Debug/SQLite.Designer.dll differ diff --git a/bin/Debug/SQLite.Interop.dll b/bin/Debug/SQLite.Interop.dll new file mode 100644 index 0000000..6a7e29a Binary files /dev/null and b/bin/Debug/SQLite.Interop.dll differ diff --git a/bin/Debug/System.Data.SQLite.Linq.dll b/bin/Debug/System.Data.SQLite.Linq.dll new file mode 100644 index 0000000..ea3dc7d Binary files /dev/null and b/bin/Debug/System.Data.SQLite.Linq.dll differ diff --git a/bin/Debug/System.Data.SQLite.dll b/bin/Debug/System.Data.SQLite.dll new file mode 100644 index 0000000..fbf5a5e Binary files /dev/null and b/bin/Debug/System.Data.SQLite.dll differ diff --git a/bin/Debug/System.Reactive.dll b/bin/Debug/System.Reactive.dll new file mode 100644 index 0000000..64ad590 Binary files /dev/null and b/bin/Debug/System.Reactive.dll differ diff --git a/bin/Debug/VPIC.dll b/bin/Debug/VPIC.dll new file mode 100644 index 0000000..0b63d43 Binary files /dev/null and b/bin/Debug/VPIC.dll differ diff --git a/bin/Debug/msvcm90.dll b/bin/Debug/msvcm90.dll new file mode 100644 index 0000000..6470ad0 Binary files /dev/null and b/bin/Debug/msvcm90.dll differ diff --git a/bin/Debug/msvcp90.dll b/bin/Debug/msvcp90.dll new file mode 100644 index 0000000..354eed3 Binary files /dev/null and b/bin/Debug/msvcp90.dll differ diff --git a/bin/Debug/msvcr90.dll b/bin/Debug/msvcr90.dll new file mode 100644 index 0000000..e2e6601 Binary files /dev/null and b/bin/Debug/msvcr90.dll differ diff --git a/bin/Debug/opencv_core231.dll b/bin/Debug/opencv_core231.dll new file mode 100644 index 0000000..57b1f90 Binary files /dev/null and b/bin/Debug/opencv_core231.dll differ diff --git a/bin/Debug/opencv_imgproc231.dll b/bin/Debug/opencv_imgproc231.dll new file mode 100644 index 0000000..7d91cb1 Binary files /dev/null and b/bin/Debug/opencv_imgproc231.dll differ diff --git a/bin/Debug/vtkCharts.dll b/bin/Debug/vtkCharts.dll new file mode 100644 index 0000000..ae4c8bd Binary files /dev/null and b/bin/Debug/vtkCharts.dll differ diff --git a/bin/Debug/vtkCommon.dll b/bin/Debug/vtkCommon.dll new file mode 100644 index 0000000..ec74886 Binary files /dev/null and b/bin/Debug/vtkCommon.dll differ diff --git a/bin/Debug/vtkDICOMParser.dll b/bin/Debug/vtkDICOMParser.dll new file mode 100644 index 0000000..e267d62 Binary files /dev/null and b/bin/Debug/vtkDICOMParser.dll differ diff --git a/bin/Debug/vtkFiltering.dll b/bin/Debug/vtkFiltering.dll new file mode 100644 index 0000000..8afab9b Binary files /dev/null and b/bin/Debug/vtkFiltering.dll differ diff --git a/bin/Debug/vtkGenericFiltering.dll b/bin/Debug/vtkGenericFiltering.dll new file mode 100644 index 0000000..842f350 Binary files /dev/null and b/bin/Debug/vtkGenericFiltering.dll differ diff --git a/bin/Debug/vtkGeovis.dll b/bin/Debug/vtkGeovis.dll new file mode 100644 index 0000000..6c16879 Binary files /dev/null and b/bin/Debug/vtkGeovis.dll differ diff --git a/bin/Debug/vtkGraphics.dll b/bin/Debug/vtkGraphics.dll new file mode 100644 index 0000000..40591bd Binary files /dev/null and b/bin/Debug/vtkGraphics.dll differ diff --git a/bin/Debug/vtkHybrid.dll b/bin/Debug/vtkHybrid.dll new file mode 100644 index 0000000..ee4c953 Binary files /dev/null and b/bin/Debug/vtkHybrid.dll differ diff --git a/bin/Debug/vtkIO.dll b/bin/Debug/vtkIO.dll new file mode 100644 index 0000000..9eff926 Binary files /dev/null and b/bin/Debug/vtkIO.dll differ diff --git a/bin/Debug/vtkImaging.dll b/bin/Debug/vtkImaging.dll new file mode 100644 index 0000000..ecf9e93 Binary files /dev/null and b/bin/Debug/vtkImaging.dll differ diff --git a/bin/Debug/vtkInfovis.dll b/bin/Debug/vtkInfovis.dll new file mode 100644 index 0000000..ce21419 Binary files /dev/null and b/bin/Debug/vtkInfovis.dll differ diff --git a/bin/Debug/vtkNetCDF.dll b/bin/Debug/vtkNetCDF.dll new file mode 100644 index 0000000..f84d06a Binary files /dev/null and b/bin/Debug/vtkNetCDF.dll differ diff --git a/bin/Debug/vtkNetCDF_cxx.dll b/bin/Debug/vtkNetCDF_cxx.dll new file mode 100644 index 0000000..1c34864 Binary files /dev/null and b/bin/Debug/vtkNetCDF_cxx.dll differ diff --git a/bin/Debug/vtkParallel.dll b/bin/Debug/vtkParallel.dll new file mode 100644 index 0000000..722c31e Binary files /dev/null and b/bin/Debug/vtkParallel.dll differ diff --git a/bin/Debug/vtkRendering.dll b/bin/Debug/vtkRendering.dll new file mode 100644 index 0000000..d71738f Binary files /dev/null and b/bin/Debug/vtkRendering.dll differ diff --git a/bin/Debug/vtkViews.dll b/bin/Debug/vtkViews.dll new file mode 100644 index 0000000..fa1cabf Binary files /dev/null and b/bin/Debug/vtkViews.dll differ diff --git a/bin/Debug/vtkVolumeRendering.dll b/bin/Debug/vtkVolumeRendering.dll new file mode 100644 index 0000000..3430ee3 Binary files /dev/null and b/bin/Debug/vtkVolumeRendering.dll differ diff --git a/bin/Debug/vtkWidgets.dll b/bin/Debug/vtkWidgets.dll new file mode 100644 index 0000000..bc88d4f Binary files /dev/null and b/bin/Debug/vtkWidgets.dll differ diff --git a/bin/Debug/vtkalglib.dll b/bin/Debug/vtkalglib.dll new file mode 100644 index 0000000..f413758 Binary files /dev/null and b/bin/Debug/vtkalglib.dll differ diff --git a/bin/Debug/vtkexoIIc.dll b/bin/Debug/vtkexoIIc.dll new file mode 100644 index 0000000..fb2969e Binary files /dev/null and b/bin/Debug/vtkexoIIc.dll differ diff --git a/bin/Debug/vtkexpat.dll b/bin/Debug/vtkexpat.dll new file mode 100644 index 0000000..92e0b86 Binary files /dev/null and b/bin/Debug/vtkexpat.dll differ diff --git a/bin/Debug/vtkfreetype.dll b/bin/Debug/vtkfreetype.dll new file mode 100644 index 0000000..38a6cdf Binary files /dev/null and b/bin/Debug/vtkfreetype.dll differ diff --git a/bin/Debug/vtkftgl.dll b/bin/Debug/vtkftgl.dll new file mode 100644 index 0000000..cf0ec72 Binary files /dev/null and b/bin/Debug/vtkftgl.dll differ diff --git a/bin/Debug/vtkjpeg.dll b/bin/Debug/vtkjpeg.dll new file mode 100644 index 0000000..a7fd02f Binary files /dev/null and b/bin/Debug/vtkjpeg.dll differ diff --git a/bin/Debug/vtklibxml2.dll b/bin/Debug/vtklibxml2.dll new file mode 100644 index 0000000..4dd0732 Binary files /dev/null and b/bin/Debug/vtklibxml2.dll differ diff --git a/bin/Debug/vtkmetaio.dll b/bin/Debug/vtkmetaio.dll new file mode 100644 index 0000000..033e9b1 Binary files /dev/null and b/bin/Debug/vtkmetaio.dll differ diff --git a/bin/Debug/vtkpng.dll b/bin/Debug/vtkpng.dll new file mode 100644 index 0000000..a50b3fb Binary files /dev/null and b/bin/Debug/vtkpng.dll differ diff --git a/bin/Debug/vtkproj4.dll b/bin/Debug/vtkproj4.dll new file mode 100644 index 0000000..f4b6794 Binary files /dev/null and b/bin/Debug/vtkproj4.dll differ diff --git a/bin/Debug/vtksys.dll b/bin/Debug/vtksys.dll new file mode 100644 index 0000000..b152685 Binary files /dev/null and b/bin/Debug/vtksys.dll differ diff --git a/bin/Debug/vtktiff.dll b/bin/Debug/vtktiff.dll new file mode 100644 index 0000000..254d6b1 Binary files /dev/null and b/bin/Debug/vtktiff.dll differ diff --git a/bin/Debug/vtkverdict.dll b/bin/Debug/vtkverdict.dll new file mode 100644 index 0000000..6a43c91 Binary files /dev/null and b/bin/Debug/vtkverdict.dll differ diff --git a/bin/Debug/vtkzlib.dll b/bin/Debug/vtkzlib.dll new file mode 100644 index 0000000..64ed985 Binary files /dev/null and b/bin/Debug/vtkzlib.dll differ diff --git a/bin/Debug/weka.dll b/bin/Debug/weka.dll new file mode 100644 index 0000000..116519f Binary files /dev/null and b/bin/Debug/weka.dll differ diff --git a/bin/x86/Debug/AForge.Math.dll b/bin/x86/Debug/AForge.Math.dll new file mode 100644 index 0000000..c15ebb2 Binary files /dev/null and b/bin/x86/Debug/AForge.Math.dll differ diff --git a/bin/x86/Debug/AForge.dll b/bin/x86/Debug/AForge.dll new file mode 100644 index 0000000..2f851a0 Binary files /dev/null and b/bin/x86/Debug/AForge.dll differ diff --git a/bin/x86/Debug/Accord.Math.dll b/bin/x86/Debug/Accord.Math.dll new file mode 100644 index 0000000..84d60b9 Binary files /dev/null and b/bin/x86/Debug/Accord.Math.dll differ diff --git a/bin/x86/Debug/Accord.Statistics.dll b/bin/x86/Debug/Accord.Statistics.dll new file mode 100644 index 0000000..4f31d5c Binary files /dev/null and b/bin/x86/Debug/Accord.Statistics.dll differ diff --git a/bin/x86/Debug/Accord.dll b/bin/x86/Debug/Accord.dll new file mode 100644 index 0000000..9041e25 Binary files /dev/null and b/bin/x86/Debug/Accord.dll differ diff --git a/bin/x86/Debug/AlgLib.dll b/bin/x86/Debug/AlgLib.dll new file mode 100644 index 0000000..eb22230 Binary files /dev/null and b/bin/x86/Debug/AlgLib.dll differ diff --git a/bin/x86/Debug/AviRecorder.dll b/bin/x86/Debug/AviRecorder.dll new file mode 100644 index 0000000..7d0c756 Binary files /dev/null and b/bin/x86/Debug/AviRecorder.dll differ diff --git a/bin/x86/Debug/BioCSharp.dll b/bin/x86/Debug/BioCSharp.dll new file mode 100644 index 0000000..42736e9 Binary files /dev/null and b/bin/x86/Debug/BioCSharp.dll differ diff --git a/bin/x86/Debug/BioCSharp.pdb b/bin/x86/Debug/BioCSharp.pdb new file mode 100644 index 0000000..5b30b0f Binary files /dev/null and b/bin/x86/Debug/BioCSharp.pdb differ diff --git a/bin/x86/Debug/Cosmo.dll b/bin/x86/Debug/Cosmo.dll new file mode 100644 index 0000000..e3603ce Binary files /dev/null and b/bin/x86/Debug/Cosmo.dll differ diff --git a/bin/x86/Debug/DataSetViewerControls.dll b/bin/x86/Debug/DataSetViewerControls.dll new file mode 100644 index 0000000..bed762a Binary files /dev/null and b/bin/x86/Debug/DataSetViewerControls.dll differ diff --git a/bin/x86/Debug/DataSetViewerCore.dll b/bin/x86/Debug/DataSetViewerCore.dll new file mode 100644 index 0000000..a61a692 Binary files /dev/null and b/bin/x86/Debug/DataSetViewerCore.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplay.Controls.dll b/bin/x86/Debug/DynamicDataDisplay.Controls.dll new file mode 100644 index 0000000..fa641b6 Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplay.Controls.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplay.Maps.Extra.dll b/bin/x86/Debug/DynamicDataDisplay.Maps.Extra.dll new file mode 100644 index 0000000..437bc0a Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplay.Maps.Extra.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplay.Maps.dll b/bin/x86/Debug/DynamicDataDisplay.Maps.dll new file mode 100644 index 0000000..f0b9a95 Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplay.Maps.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplay.Markers.dll b/bin/x86/Debug/DynamicDataDisplay.Markers.dll new file mode 100644 index 0000000..de583bc Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplay.Markers.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplay.dll b/bin/x86/Debug/DynamicDataDisplay.dll new file mode 100644 index 0000000..98b6d59 Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplay.dll differ diff --git a/bin/x86/Debug/DynamicDataDisplayViews.dll b/bin/x86/Debug/DynamicDataDisplayViews.dll new file mode 100644 index 0000000..0c79f4b Binary files /dev/null and b/bin/x86/Debug/DynamicDataDisplayViews.dll differ diff --git a/bin/x86/Debug/Emgu.CV.dll b/bin/x86/Debug/Emgu.CV.dll new file mode 100644 index 0000000..468f4fa Binary files /dev/null and b/bin/x86/Debug/Emgu.CV.dll differ diff --git a/bin/x86/Debug/Emgu.Util.dll b/bin/x86/Debug/Emgu.Util.dll new file mode 100644 index 0000000..cb89e98 Binary files /dev/null and b/bin/x86/Debug/Emgu.Util.dll differ diff --git a/bin/x86/Debug/FreeImage.NET.dll b/bin/x86/Debug/FreeImage.NET.dll new file mode 100644 index 0000000..3761ad7 Binary files /dev/null and b/bin/x86/Debug/FreeImage.NET.dll differ diff --git a/bin/x86/Debug/FreeImage.dll b/bin/x86/Debug/FreeImage.dll new file mode 100644 index 0000000..b148316 Binary files /dev/null and b/bin/x86/Debug/FreeImage.dll differ diff --git a/bin/x86/Debug/HCSAnalyzer.application b/bin/x86/Debug/HCSAnalyzer.application new file mode 100644 index 0000000..0a62c5b --- /dev/null +++ b/bin/x86/Debug/HCSAnalyzer.application @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + NP8t69KGowzFk4a4xnxhN2QFmdNgigDamOrZMeJvsiE= + + + + \ No newline at end of file diff --git a/bin/x86/Debug/HCSAnalyzer.exe b/bin/x86/Debug/HCSAnalyzer.exe new file mode 100644 index 0000000..c6bf973 Binary files /dev/null and b/bin/x86/Debug/HCSAnalyzer.exe differ diff --git a/bin/x86/Debug/HCSAnalyzer.exe.config b/bin/x86/Debug/HCSAnalyzer.exe.config new file mode 100644 index 0000000..a3de27b --- /dev/null +++ b/bin/x86/Debug/HCSAnalyzer.exe.config @@ -0,0 +1,23 @@ + + + + +
+ + + + + + http://soap.genome.jp/keggapi/request_v6.2.cgi + + + + + + + + + + + + diff --git a/bin/x86/Debug/HCSAnalyzer.exe.manifest b/bin/x86/Debug/HCSAnalyzer.exe.manifest new file mode 100644 index 0000000..af3edb0 --- /dev/null +++ b/bin/x86/Debug/HCSAnalyzer.exe.manifest @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8KOJnwib7U9JdLKRIi8YWOytNjiIiFViXVihhk80KsQ= + + + + + + + + + + + + MlvgoKHc8ZqLhru+z7L0NoTAC2Y4Sduw9zgSDMc7kKE= + + + + + + + + + + + + ROOsglSFnp4oKJRY9JZjOWgjZmJgOE2Fino8ko+ytHE= + + + + + + + + + + + + dOoGGvE9uB490Mj/QuL2GmwVX7p6Br73U0Rp0LaC6/Y= + + + + + + + + + + + + I26n5ALaj6ms4PfrFDOyKedcCJpFa2uqlmg4lMk+Pm4= + + + + + + + + + + + + orvTJce9vfsTnJVs0l3cLIVKW8J6DTMKcpEY0hX8x48= + + + + + + + + + + + + 8IzhgSOiUFUlqVUP2NiftA0mAvSp4MrWkVmYN05Ptlw= + + + + + + + + + + + + OwqhyweXx8w/t4mZJ9C8Me1eC/cpbL4t4AfwcONjWV4= + + + + + + + + + + + + UWH2aMLlI2dKoaGcuykhfwcs04J9zZsvN+UydZ6uG1w= + + + + + + + + + + + + T3pPGb3I8Y+lJPPes8AQvBnbnQoIaBnnR0Ixi44NVkA= + + + + + + + + + + + + /DVtur+HnWSULpUk52hXP5IjU+ELxV3Bx2YKD4MO/sI= + + + + + + + + + + + + xtKew1bu0hB/+/5L0wxQeRKE7n2eAH0aidhoGvodomw= + + + + + + + + + + + + pFFLzgsAfA+RrG/fyd1JX9SlTxI00KOoaZsxfVlNCPQ= + + + + + + + + + + + + JSRGnOx5Min0J6AkXr85eNEGWZJkRDcgLCdm7a455bI= + + + + + + + + + + + + LqcswZtROX7GtsKoPtYSDTmtFLd/+y1z7LGdeBUP9lM= + + + + + + + + + + + + bVaxaz2utuQjFWdvJ6JBPozuW94yUTUqyJeWvebUQD0= + + + + + + + + + + + + /advakMUFUP2zdPia1tFyiKZqtdBqlNZI1JsCC/tuDE= + + + + + + + + + + + + DE7mrDPZUhtxcBzZte/N7UAOVH7gMf0Y1nqH7nlzH8o= + + + + + + + + + + + + Zqi7bUZMKc71Ra4IxR3PjwpOYxDVoGRFWRPHqC7yfgQ= + + + + + + + + + + + + CFL7ewBHxybH0YEtPkyZ/1NUOw+0aslxcOchND7yz7M= + + + + + + + + + + + + wqQq374TSWtQHUfp70nTyDosjGFjcgZu7ohTONFB7X4= + + + + + + + + + + + + nLtFEWQq9LqfjTJ+P1CHx4s1qGauRrVETQE3yQJksD4= + + + + + + + + + + + + 1I0AW0SA/p/4cpayVGv3dXirugfWWL1uhLTnH44k/FU= + + + + + + + + + + + + 6zRtqzcEh4l0cvbl7FMiglD1zzUuG3+pj3PuejX3pa8= + + + + + + + + + + + + 7jk97KPFeCvbq1URUEGsWRVRfUXuh845xUyGfzL2P4M= + + + + + + + + + + + + kEsXbShajCmjdP9nIzREmPshLL+rZhFoSWt8S0xWTdw= + + + + + + + + + + + + w5hGrac1Gh+HSD070qT06C7MnWlNbeRDTQNl/qkhezo= + + + + + + + + + + + + OTAgwa9LTpjDE5bnj+FuUjlw9YgxipvW6Hy4VtSoi+s= + + + + + + + + + + + + 4FX9WU1Z0t2PdwDgx1xc1JeomZO3g5lQiHQF9vPaY64= + + + + + + + + + + + + nKECbYpu5JPf2QnU3zowrZAHe1iTIxQtUKEOZpsAyP0= + + + + + + + + + + + + Ktyzx0HR0//WOgP79hoN7obafRXXTLupTXa1u+FNurc= + + + + + + + + + + + + MHQayEZMIh3ooEzA8blC2q1bUeM94vxAcPd7RO34Y8A= + + + + + + + + + + + + uR39PCjv4qsMJrEAr3UY6Uto9j+w6oVFqIPYedSNP4s= + + + + + + + + + + + + quoc17XtvxXSG2uFE89cxqN6LWluIvkDJLZnFPhCSqo= + + + + + + + + + + + + dNNdP+gyRfeTv6aaeL4sy81FGMUkGj3n2eh6T/uMdT4= + + + + + + + + + + + + 4Y+jwhiQq+bqLOBQ4Q419Ga8oinjwmCFMbL0yZbOluE= + + + + + + + + + + + + VRNrGOI7Eqao15Zn+x1PROjnBe4P2hMDdhpCN906ctM= + + + + + + + + + + + + 9RtFrT2hHc0w7AySwKv5kj7t+WEeKhrg+V8SoKIOV7Q= + + + + + + + + + + + + JcqvRftiwBMXfTA1EuXhx9cPCIg9LNFd5OYnZC9pgMI= + + + + + + + + + + + + iP+0aOV+cIZBnhjVk7junLLxUKNNbYIZDyM9saNq66c= + + + + + + + + + + + + c2qaEVhfHpmvhvKqYrygbkEADogK0LdDnzpF7o6WY+A= + + + + + + + + + + + + b7qYEK4B2DGn+TLiBrZeVt2+ZI9daTDf5FLZqFdXBZQ= + + + + + + + + + + + + WcE8QTAUFF6HIkduMcHvTSaUH1PYP9fqieCijfbdk3k= + + + + + + + + + + + + IYSvp7pIOjt8unEI2xjNF0sf0NP4GkQWvokJdkp6V10= + + + + + + + + + + + + eGtZ2tznuTcJjjTN53Yp6KP5dI0iwD4Fy8fsz5Vqln0= + + + + + + + + + + + + BxjDLyGE/isXep8d+t/P/MLBdV3oT2WXMLojfhMzmvc= + + + + + + + + + + + + kmyGDNFNJGjHKLDiZyJbH3PnTRi7pcP2WsPocH9t83Q= + + + + + + + + + + + + 8hJyZUBkWNAb0geD9cMRzzdbLTnVwdA+aHYlK3b9g0Q= + + + + + + + + + + + + vVh/J0ypxp8GFxJbqQMaMbi5k3Fzcr3mQMJtD9v7j5g= + + + + + + + + + + + + 2wcQrKrt9SKkjJFpsft73X0RPZ1YAeGI8NzTMBWNMdI= + + + + + + + + + + + + veeJGlCkso/RwoTvFj9fiwmMSHQ5IEC37H3EG7OYjVo= + + + + + + + + + + + + uVuOW0FP3fnEzr02cSSq7HmRiLRBNzhrkmcmOucBOjI= + + + + + + + + + + + + hxV3+qsTJzt5/C9DdgAQUzJRvxeM8Qc5AD3y/yzw1OY= + + + + + + + + + + + + isqBFx7tOXKA0l5AeMof0r84VRi2y38xTYHBvDDWlS8= + + + + + + + + + + + + 4wKXB0Iu8uVcw2aMz+ADbWNfb1oVZTcnNfCIjdB3eJw= + + + + + + + + + + + + BP7EVxT4R2/XjSb5mXt2mxtecSp4Y+VHvpWeXhT/cvs= + + + + + + + + + + + + T7rkgGwP7my5YKuIEih91dnN+TAYEZYo2umJXTuDJ8U= + + + + + + + + + + + + wmA1PXzoVfv0P5Bxiu0VhtE7I5H5/i2q77nkRQxIpWM= + + + + + + + + + + + + jUUkMAZHEYAKpZNtYTYMJmiSQ4YIYHyvOUfdQum7a+U= + + + + + + + + + + + + AOJp8j/x7phKomo9bDR7cLpJM2svuB+dvd0seBlE+CQ= + + + + + + + + + + + + t9SfQ6zPy1Jv/GXjp6GxVsqM2tJfSAuPrF/RLaUZVqA= + + + + + + + + + + + + zrKGNYT1OyC+fCGh9IC8oEWgquZGI4V4vXUMNHAR1QQ= + + + + + + + + + + + + iGZyAXhWLUr7a0hOA4buoz7bbfGIfipQiTDxPU/AJf0= + + + + + + + + + + + + g49msnmXij1Vzkyjmm/lDNI/Q5LTibKAQuLFe1E76+g= + + + + + + + + + + YW7vPho7Zr+OmPJfQ+rtVJQ32cLG5zi/ybqfuPJzopA= + + + + + + + + + AOJzOomFU1O8eDvCEjjyNk/jG63GeS+46p+1Uw2WUcA= + + + + + + + + + riqnp/GV0TU9TOVK42QRSjnbJafehBgHAcFQnWsAIbg= + + + + + + + + + AJ2ThaNzw0s60ZlnY74ZNZrAQAbfREc4MmXi6CrukRQ= + + + + + + + + + P7l7JKeQFRtCUNerUEyoryN/X52C76maVCjEAbe3gW0= + + + + + + + + + QOX0W9BhofXgA3Jqwt3e/C5FCvIGCaNFomDQUNCHYho= + + + \ No newline at end of file diff --git a/bin/x86/Debug/HCSAnalyzer.pdb b/bin/x86/Debug/HCSAnalyzer.pdb new file mode 100644 index 0000000..d858456 Binary files /dev/null and b/bin/x86/Debug/HCSAnalyzer.pdb differ diff --git a/bin/x86/Debug/HCSPlugin.dll b/bin/x86/Debug/HCSPlugin.dll new file mode 100644 index 0000000..0d57cc1 Binary files /dev/null and b/bin/x86/Debug/HCSPlugin.dll differ diff --git a/bin/x86/Debug/ICSharpCode.SharpZipLib.dll b/bin/x86/Debug/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000..77bafe8 Binary files /dev/null and b/bin/x86/Debug/ICSharpCode.SharpZipLib.dll differ diff --git a/bin/x86/Debug/IKVM.AWT.WinForms.dll b/bin/x86/Debug/IKVM.AWT.WinForms.dll new file mode 100644 index 0000000..154bc2e Binary files /dev/null and b/bin/x86/Debug/IKVM.AWT.WinForms.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Beans.dll b/bin/x86/Debug/IKVM.OpenJDK.Beans.dll new file mode 100644 index 0000000..c2402c4 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Beans.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Charsets.dll b/bin/x86/Debug/IKVM.OpenJDK.Charsets.dll new file mode 100644 index 0000000..1bcff82 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Charsets.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Corba.dll b/bin/x86/Debug/IKVM.OpenJDK.Corba.dll new file mode 100644 index 0000000..22c6f5a Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Corba.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Core.dll b/bin/x86/Debug/IKVM.OpenJDK.Core.dll new file mode 100644 index 0000000..dce0118 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Core.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Jdbc.dll b/bin/x86/Debug/IKVM.OpenJDK.Jdbc.dll new file mode 100644 index 0000000..49c54d2 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Jdbc.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Management.dll b/bin/x86/Debug/IKVM.OpenJDK.Management.dll new file mode 100644 index 0000000..8d566ab Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Management.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Media.dll b/bin/x86/Debug/IKVM.OpenJDK.Media.dll new file mode 100644 index 0000000..1ed612e Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Media.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Misc.dll b/bin/x86/Debug/IKVM.OpenJDK.Misc.dll new file mode 100644 index 0000000..a4a51e4 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Misc.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Naming.dll b/bin/x86/Debug/IKVM.OpenJDK.Naming.dll new file mode 100644 index 0000000..a148b04 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Naming.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Remoting.dll b/bin/x86/Debug/IKVM.OpenJDK.Remoting.dll new file mode 100644 index 0000000..a897d5c Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Remoting.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Security.dll b/bin/x86/Debug/IKVM.OpenJDK.Security.dll new file mode 100644 index 0000000..659682f Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Security.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.SwingAWT.dll b/bin/x86/Debug/IKVM.OpenJDK.SwingAWT.dll new file mode 100644 index 0000000..53dce66 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.SwingAWT.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Text.dll b/bin/x86/Debug/IKVM.OpenJDK.Text.dll new file mode 100644 index 0000000..6fc4f19 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Text.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Tools.dll b/bin/x86/Debug/IKVM.OpenJDK.Tools.dll new file mode 100644 index 0000000..baec57c Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Tools.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.Util.dll b/bin/x86/Debug/IKVM.OpenJDK.Util.dll new file mode 100644 index 0000000..2244658 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.Util.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.API.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.API.dll new file mode 100644 index 0000000..d183463 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.API.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.Bind.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.Bind.dll new file mode 100644 index 0000000..9a646eb Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.Bind.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.Crypto.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.Crypto.dll new file mode 100644 index 0000000..6952e6f Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.Crypto.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.Parse.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.Parse.dll new file mode 100644 index 0000000..8c565b1 Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.Parse.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.Transform.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.Transform.dll new file mode 100644 index 0000000..6ca0f6e Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.Transform.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.WebServices.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.WebServices.dll new file mode 100644 index 0000000..20f2bfa Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.WebServices.dll differ diff --git a/bin/x86/Debug/IKVM.OpenJDK.XML.XPath.dll b/bin/x86/Debug/IKVM.OpenJDK.XML.XPath.dll new file mode 100644 index 0000000..b382b2f Binary files /dev/null and b/bin/x86/Debug/IKVM.OpenJDK.XML.XPath.dll differ diff --git a/bin/x86/Debug/IKVM.Reflection.dll b/bin/x86/Debug/IKVM.Reflection.dll new file mode 100644 index 0000000..c2b777c Binary files /dev/null and b/bin/x86/Debug/IKVM.Reflection.dll differ diff --git a/bin/x86/Debug/IKVM.Runtime.JNI.dll b/bin/x86/Debug/IKVM.Runtime.JNI.dll new file mode 100644 index 0000000..14e7224 Binary files /dev/null and b/bin/x86/Debug/IKVM.Runtime.JNI.dll differ diff --git a/bin/x86/Debug/IKVM.Runtime.dll b/bin/x86/Debug/IKVM.Runtime.dll new file mode 100644 index 0000000..aa9799e Binary files /dev/null and b/bin/x86/Debug/IKVM.Runtime.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.dll b/bin/x86/Debug/Kitware.VTK.dll new file mode 100644 index 0000000..a73fa63 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll new file mode 100644 index 0000000..0ddf04b Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkCharts.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll new file mode 100644 index 0000000..ed6d15d Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkCommon.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll new file mode 100644 index 0000000..a547767 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkFiltering.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll new file mode 100644 index 0000000..1d86e3f Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkGenericFiltering.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll new file mode 100644 index 0000000..13c74bf Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkGeovis.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll new file mode 100644 index 0000000..0137866 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkGraphics.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll new file mode 100644 index 0000000..e4cb7d6 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkHybrid.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkIO.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkIO.Unmanaged.dll new file mode 100644 index 0000000..17c5654 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkIO.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll new file mode 100644 index 0000000..43d24f2 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkImaging.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll new file mode 100644 index 0000000..c2065ad Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkInfovis.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll new file mode 100644 index 0000000..a77bf71 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkParallel.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll new file mode 100644 index 0000000..979d2fc Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkRendering.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkViews.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkViews.Unmanaged.dll new file mode 100644 index 0000000..75ef047 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkViews.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll new file mode 100644 index 0000000..8afddf4 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkVolumeRendering.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll b/bin/x86/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll new file mode 100644 index 0000000..4728ce7 Binary files /dev/null and b/bin/x86/Debug/Kitware.VTK.vtkWidgets.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.mummy.Runtime.Unmanaged.dll b/bin/x86/Debug/Kitware.mummy.Runtime.Unmanaged.dll new file mode 100644 index 0000000..3cf2f2c Binary files /dev/null and b/bin/x86/Debug/Kitware.mummy.Runtime.Unmanaged.dll differ diff --git a/bin/x86/Debug/Kitware.mummy.Runtime.dll b/bin/x86/Debug/Kitware.mummy.Runtime.dll new file mode 100644 index 0000000..fb2b32b Binary files /dev/null and b/bin/x86/Debug/Kitware.mummy.Runtime.dll differ diff --git a/bin/x86/Debug/MIConvexHullPlugin.dll b/bin/x86/Debug/MIConvexHullPlugin.dll new file mode 100644 index 0000000..f04ae0b Binary files /dev/null and b/bin/x86/Debug/MIConvexHullPlugin.dll differ diff --git a/bin/x86/Debug/MINE.dll b/bin/x86/Debug/MINE.dll new file mode 100644 index 0000000..81ce60d Binary files /dev/null and b/bin/x86/Debug/MINE.dll differ diff --git a/bin/x86/Debug/MathNet.Numerics.IO.dll b/bin/x86/Debug/MathNet.Numerics.IO.dll new file mode 100644 index 0000000..09c3a22 Binary files /dev/null and b/bin/x86/Debug/MathNet.Numerics.IO.dll differ diff --git a/bin/x86/Debug/MathNet.Numerics.IO.pdb b/bin/x86/Debug/MathNet.Numerics.IO.pdb new file mode 100644 index 0000000..d1854fb Binary files /dev/null and b/bin/x86/Debug/MathNet.Numerics.IO.pdb differ diff --git a/bin/x86/Debug/MathNet.Numerics.IO.xml b/bin/x86/Debug/MathNet.Numerics.IO.xml new file mode 100644 index 0000000..c390792 --- /dev/null +++ b/bin/x86/Debug/MathNet.Numerics.IO.xml @@ -0,0 +1,1145 @@ + + + + MathNet.Numerics.IO + + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Base class to read a single from a file or stream. + + The type of Matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Reads a from a file. + + The file to read the matrix from. + A containing the data from the file. is returned if the file is empty. + If is . + If the file doesn't exist. + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Reads a from a . + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + If is . + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Subclasses override this method to do the actual reading. + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + + + + The function that will do the conversion for a given type. + + + + + Initializes static members of the class. + + + + + Converts the string into a Complex32. + + The number to convert. + The converted number. + + + + Converts the string into a Complex. + + The number to convert. + The converted number. + + + + Converts the string into a double. + + The number to convert. + The converted number. + + + + Converts the string into a float. + + The number to convert. + The converted number. + + + + Constructor to create matrix instance. + + + + + The base regular expression. + + + + + The regular expression to use. + + + + + The to use. + + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Performs the actual reading. + + The to read the matrix from. + + A matrix containing the data from the . is returned if the is empty. + + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + + + + Gets or sets a value indicating whether the files has a header row. + + + true if this instance has a header row; otherwise, false. + + Defaults to . + + + + Converts a string into the given data type. + + + The number as a string to convert. + + The converted number. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Creates matrices from Matlab files. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + The name of the file to read from. + + + + + The stream to read from if we are not reading from a file directly. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Reads the first matrix from the file or stream. + + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + + + + + Reads the named matrix from the file or stream. + + The name of the matrix to read. + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + is returned if a matrix with the requests name doesn't exist. + + + + + Reads all matrices from the file or stream. + + All matrices from the file or stream. The key to the + is the matrix's name. + + + + Reads the named matrices from the file or stream. + + The names of the matrices to retrieve. + + The named matrices from the file or stream. The key to the + is the matrix's name. + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Writes an to delimited text file. If the user does not + specify a delimiter, a tab separator is used. + + + + + Base class to write a single to a file or stream. + + + + + The to use. + + + + + Writes the given to the given file. If the file already exists, + the file will be overwritten. + + The matrix to write. + The file to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given stream. + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given . + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Subclasses must implement this method to do the actually writing. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to serialize. + The to write the matrix to. + The number format to use. + The culture to use. + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + This property is only used for matrix writers that write out text files. + + + + Gets or sets he number format to use. + + The number format to use when writing out each element. + This property is only used for matrix writers that write out text files. + + + + The delimiter to use. + + + + + Initializes a new instance of the class. + a comma as the delimiter. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Writes the given to the given . + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to write. + The to write the matrix to. + The number format to use on each element. + The culture to use. + If either or is null. + + + + Gets or sets the column header values. + + The column header values. + Will write the column headers if the list is not empty or null. + + + + Writes matrices to a Matlab file. + + + + + The file header value + + + + + The length of the header text. + + + + + Have we written the header yet. + + + + + The binary writer to write to. + + + + + Initializes a new instance of the class. + + The name of the Matlab file to save the matrices to. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Writes the given to the file. + + The matrix to write. + The name of the matrix to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the file. + + The matrices to write. + The names of the matrices to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Closes the stream the being written to. + + Calls . + + + + Writes the matrix tag and name. + + The writer we are using. + The array class we are writing. + if set to true if this a complex matrix. + The name name of the matrix. + The number of rows. + The columns of columns. + The maximum number of non-zero elements. + + + + Compresses the data array. + + The data to compress. + The compressed data. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Writes the compressed data. + + The data to write. + + + + Writes the file header. + + + + + Pads the data with the given byte. + + Where to write the pad values. + The number of bytes to pad. + What value to pad with. + + + + Computes the Adler-32 checksum of the given data. + + The data to create the checksum. + The checksum + + + + Enumeration for the Matlab array types + + + + + mxUNKNOWN CLASS + + + + + mxCELL CLASS + + + + + mxSTRUCT CLASS + + + + + mxOBJECT CLASS + + + + + mxCHAR CLASS + + + + + mxSPARSE CLASS + + + + + mxDOUBLE CLASS + + + + + mxSINGLE CLASS + + + + + mxINT8 CLASS + + + + + mxUINT8 CLASS + + + + + mxINT16 CLASS + + + + + mxUINT16 CLASS + + + + + mxINT32 CLASS + + + + + mxUINT32 CLASS + + + + + mxINT64 CLASS + + + + + mxUINT64 CLASS + + + + + mxFUNCTION CLASS + + + + + Matlab Array Flags + + + + + Complex flag + + + + + Global flag + + + + + Logical flag + + + + + Matlab data types + + + + + Unkown type + + + + + miINT8 type + + + + + miUINT8 type + + + + + miINT16 type + + + + + miUINT16 type + + + + + miINT32 type + + + + + miUINT32 type + + + + + miSINGLE type + + + + + miDOUBLE type + + + + + miINT64 type + + + + + miUINT6 4type + + + + + miMATRIX type + + + + + miCOMPRESSED type + + + + + miUTF8 type + + + + + miUTF16 type + + + + + miUTF32 type + + + + + Represents a Matlab file + + The data type of the matrix to return. + + + + Matrices in a matlab file stored as 1-D arrays + + + + + Gets or sets the header text. + + The header text. + + + + Gets or sets the first name of the matrix. + + The first name of the matrix. + + + + Gets the first matrix. + + The first matrix. + + + + Gets the matrices. + + The matrices. + + + + Parse a Matlab file + + The data type of the matrix. + + + + Large Block Size + + + + + Little Endian Indicator + + + + + Small Block Size + + + + + Holds the names of the matrices in the file. + + + + + The stream to read the matlab file from. + + + + + Initializes a new instance of the class. + + Name of the file. + + + + Initializes a new instance of the class. + + The stream to read from. + + + + Initializes a new instance of the class. + + The stream to read from. + The name of the objects to retrieve. + + + + Initializes a new instance of the class. + + Name of the file. + The name of the objects to retrieve. + + + + Copies the names of the objects to retrieve to a local field. + + The name of the objects to retrieve. + + + + Parses the file. + + The parsed Matlab file as a object. + + + + Aligns the data. + + The stream. + The size of the array. + if set to true if reading from a small block. + + + + Decompresses the block. + + The compressed data. + The type data type contained in the block. + The decompressed block. + + + + Adds a matrix from the actual file into our presentation of a matlab file. + + The data of the matrix. + The instance. + + + + Populates a sparse matrix. + + The reader. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The size of the block. + A populated sparse matrix. + + + + Populates the double sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the float sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the complex sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates the complex32 sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates a dense matrix. + + The Matlab data type. + The reader to read from. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The length of the stored data. + Returns a populated dense matrix. + + + + Populates the double dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Populates the complex dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the complex32 dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the float dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Creates a matrix. + + if set to true, creates a sparse matrix. + The number of rows. + The number of columns. + A matrix with the specified storage. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + diff --git a/bin/x86/Debug/MathNet.Numerics.dll b/bin/x86/Debug/MathNet.Numerics.dll new file mode 100644 index 0000000..89f9e7d Binary files /dev/null and b/bin/x86/Debug/MathNet.Numerics.dll differ diff --git a/bin/x86/Debug/MathNet.Numerics.pdb b/bin/x86/Debug/MathNet.Numerics.pdb new file mode 100644 index 0000000..90349fa Binary files /dev/null and b/bin/x86/Debug/MathNet.Numerics.pdb differ diff --git a/bin/x86/Debug/MathNet.Numerics.xml b/bin/x86/Debug/MathNet.Numerics.xml new file mode 100644 index 0000000..6c9973f --- /dev/null +++ b/bin/x86/Debug/MathNet.Numerics.xml @@ -0,0 +1,45847 @@ + + + + MathNet.Numerics + + + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + Supported data types are double, single, , and . + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiply elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. On exit, work[0] contains the optimal work size value. + + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix + The number of columns of B. + On exit, the solution matrix. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + The B matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Not used in the managed provider. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + How to transpose a matrix. + + + + + Don't transpose a matrix. + + + + + Transpose a matrix. + + + + + Conjugate transpose a complex matrix. + + If a conjugate transpose is used with a real matrix, then the matrix is just transposed. + + + + Types of matrix norms. + + + + + The 1-norm. + + + + + The Frobenius norm. + + + + + The infinity norm. + + + + + The largest absolute value norm. + + + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex.One and beta set to Complex.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex32.One and beta set to Complex32.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex32.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0f and beta set to 0.0f, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0f + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + P/Invoke methods to the native math libraries. + + + + + Name of the native DLL. + + + + + Useful extension methods for Arrays. + + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Enumerative Combinatorics and Counting. + + + + + Counts the number of possible variations without repetition. + The order matters and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of distinct variations. + + + + Counts the number of possible variations with repetition. + The order matters and each object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of distinct variations with repetition. + + + + Counts the number of possible combinations without repetition. + The order does not matter and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of combinations. + + + + Counts the number of possible combinations with repetition. + The order does not matter and an object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of combinations with repetition. + + + + Counts the number of possible permutations (without repetition). + + Number of (distinguishable) elements in the set. + Maximum number of permutations without repetition. + + + + Extension methods for the Complex type provided by System.Numerics + + + + + Gets the squared magnitude of the Complex number. + + The number to perfom this operation on. + The squared magnitude of the Complex number. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex. + + + + Gets the conjugate of the Complex number. + + The number to perfom this operation on. + + The semantic of setting the conjugate is such that + + // a, b of type Complex32 + a.Conjugate = b; + + is equivalent to + + // a, b of type Complex32 + a = b.Conjugate + + + The conjugate of the number. + + + + Returns the multiplicative inverse of a complex number. + + + + + Exponential of this Complex (exp(x), E^x). + + The number to perfom this operation on. + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex (Base E). + + The number to perfom this operation on. + + The natural logarithm of this complex number. + + + + + Common Logarithm of this Complex (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex with custom base. + + The logarithm of this complex number. + + + + Raise this Complex to the given value. + + The number to perfom this operation on. + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex to the inverse of the given value. + + The number to perfom this operation on. + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex + + The number to perfom this operation on. + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex + + The number to perfom this operation on. + + The square root of this complex number. + + + + + Gets a value indicating whether the Complex32 is zero. + + The number to perfom this operation on. + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + The number to perfom this operation on. + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + The number to perfom this operation on. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + The number to perfom this operation on. + + true if this instance is NaN; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + The number to perfom this operation on. + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + The number to perfom this operation on. + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + The number to perfom this operation on. + + true if this instance is real nonnegative number; otherwise, false. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + The number to perfom this operation on. + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The number to perfom this operation on. + The value to compare with. + A norm of the difference between this and the other value. + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as double. + + + + + Converts the string representation of a complex number to a double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + A collection of frequently used mathematical constants. + + + + The number e + + + The number log[2](e) + + + The number log[10](e) + + + The number log[e](2) + + + The number log[e](10) + + + The number log[e](pi) + + + The number log[e](2*pi)/2 + + + The number 1/e + + + The number sqrt(e) + + + The number sqrt(2) + + + The number sqrt(1/2) = 1/sqrt(2) = sqrt(2)/2 + + + The number sqrt(3)/2 + + + The number pi + + + The number 2*pi + + + The number 1/pi + + + The number pi/2 + + + The number pi/4 + + + The number sqrt(pi) + + + The number sqrt(2pi) + + + The number sqrt(2*pi*e) + + + The number log(sqrt(2*pi)) + + + The number log(sqrt(2*pi*e)) + + + The number log(2 * sqrt(e / pi)) + + + The number 1/pi + + + The number 2/pi + + + The number 1/sqrt(pi) + + + The number 1/sqrt(2pi) + + + The number 2/sqrt(pi) + + + The number 2 * sqrt(e / pi) + + + The number (pi)/180 - factor to convert from Degree (deg) to Radians (rad). + + + + + The number (pi)/200 - factor to convert from NewGrad (grad) to Radians (rad). + + + + + The number ln(10)/20 - factor to convert from Power Decibel (dB) to Neper (Np). Use this version when the Decibel represent a power gain but the compared values are not powers (e.g. amplitude, current, voltage). + + + The number ln(10)/10 - factor to convert from Neutral Decibel (dB) to Neper (Np). Use this version when either both or neither of the Decibel and the compared values represent powers. + + + The Catalan constant + Sum(k=0 -> inf){ (-1)^k/(2*k + 1)2 } + + + The Euler-Mascheroni constant + lim(n -> inf){ Sum(k=1 -> n) { 1/k - log(n) } } + + + The number (1+sqrt(5))/2, also known as the golden ratio + + + The Glaisher constant + e^(1/12 - Zeta(-1)) + + + The Khinchin constant + prod(k=1 -> inf){1+1/(k*(k+2))^log(k,2)} + + + + The size of a double in bytes. + + + + + The size of an int in bytes. + + + + + The size of a float in bytes. + + + + + The size of a Complex in bytes. + + + + + The size of a Complex in bytes. + + + + Speed of Light in Vacuum: c_0 = 2.99792458e8 [m s^-1] (defined, exact; 2007 CODATA) + + + Magnetic Permeability in Vacuum: mu_0 = 4*Pi * 10^-7 [N A^-2 = kg m A^-2 s^-2] (defined, exact; 2007 CODATA) + + + Electric Permittivity in Vacuum: epsilon_0 = 1/(mu_0*c_0^2) [F m^-1 = A^2 s^4 kg^-1 m^-3] (defined, exact; 2007 CODATA) + + + Characteristic Impedance of Vacuum: Z_0 = mu_0*c_0 [Ohm = m^2 kg s^-3 A^-2] (defined, exact; 2007 CODATA) + + + Newtonian Constant of Gravitation: G = 6.67429e-11 [m^3 kg^-1 s^-2] (2007 CODATA) + + + Planck's constant: h = 6.62606896e-34 [J s = m^2 kg s^-1] (2007 CODATA) + + + Reduced Planck's constant: h_bar = h / (2*Pi) [J s = m^2 kg s^-1] (2007 CODATA) + + + Planck mass: m_p = (h_bar*c_0/G)^(1/2) [kg] (2007 CODATA) + + + Planck temperature: T_p = (h_bar*c_0^5/G)^(1/2)/k [K] (2007 CODATA) + + + Planck length: l_p = h_bar/(m_p*c_0) [m] (2007 CODATA) + + + Planck time: t_p = l_p/c_0 [s] (2007 CODATA) + + + Elementary Electron Charge: e = 1.602176487e-19 [C = A s] (2007 CODATA) + + + Magnetic Flux Quantum: theta_0 = h/(2*e) [Wb = m^2 kg s^-2 A^-1] (2007 CODATA) + + + Conductance Quantum: G_0 = 2*e^2/h [S = m^-2 kg^-1 s^3 A^2] (2007 CODATA) + + + Josephson Constant: K_J = 2*e/h [Hz V^-1] (2007 CODATA) + + + Von Klitzing Constant: R_K = h/e^2 [Ohm = m^2 kg s^-3 A^-2] (2007 CODATA) + + + Bohr Magneton: mu_B = e*h_bar/2*m_e [J T^-1] (2007 CODATA) + + + Nuclear Magneton: mu_N = e*h_bar/2*m_p [J T^-1] (2007 CODATA) + + + Fine Structure Constant: alpha = e^2/4*Pi*e_0*h_bar*c_0 [1] (2007 CODATA) + + + Rydberg Constant: R_infty = alpha^2*m_e*c_0/2*h [m^-1] (2007 CODATA) + + + Bor Radius: a_0 = alpha/4*Pi*R_infty [m] (2007 CODATA) + + + Hartree Energy: E_h = 2*R_infty*h*c_0 [J] (2007 CODATA) + + + Quantum of Circulation: h/2*m_e [m^2 s^-1] (2007 CODATA) + + + Fermi Coupling Constant: G_F/(h_bar*c_0)^3 [GeV^-2] (2007 CODATA) + + + Weak Mixin Angle: sin^2(theta_W) [1] (2007 CODATA) + + + Electron Mass: [kg] (2007 CODATA) + + + Electron Mass Energy Equivalent: [J] (2007 CODATA) + + + Electron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Electron Compton Wavelength: [m] (2007 CODATA) + + + Classical Electron Radius: [m] (2007 CODATA) + + + Tomson Cross Section: [m^2] (2002 CODATA) + + + Electron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Electon G-Factor: [1] (2007 CODATA) + + + Muon Mass: [kg] (2007 CODATA) + + + Muon Mass Energy Equivalent: [J] (2007 CODATA) + + + Muon Molar Mass: [kg mol^-1] (2007 CODATA) + + + Muon Compton Wavelength: [m] (2007 CODATA) + + + Muon Magnetic Moment: [J T^-1] (2007 CODATA) + + + Muon G-Factor: [1] (2007 CODATA) + + + Tau Mass: [kg] (2007 CODATA) + + + Tau Mass Energy Equivalent: [J] (2007 CODATA) + + + Tau Molar Mass: [kg mol^-1] (2007 CODATA) + + + Tau Compton Wavelength: [m] (2007 CODATA) + + + Proton Mass: [kg] (2007 CODATA) + + + Proton Mass Energy Equivalent: [J] (2007 CODATA) + + + Proton Molar Mass: [kg mol^-1] (2007 CODATA) + + + Proton Compton Wavelength: [m] (2007 CODATA) + + + Proton Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton G-Factor: [1] (2007 CODATA) + + + Proton Shielded Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Proton Shielded Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Neutron Mass: [kg] (2007 CODATA) + + + Neutron Mass Energy Equivalent: [J] (2007 CODATA) + + + Neutron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Neuron Compton Wavelength: [m] (2007 CODATA) + + + Neutron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Neutron G-Factor: [1] (2007 CODATA) + + + Neutron Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Deuteron Mass: [kg] (2007 CODATA) + + + Deuteron Mass Energy Equivalent: [J] (2007 CODATA) + + + Deuteron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Deuteron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Helion Mass: [kg] (2007 CODATA) + + + Helion Mass Energy Equivalent: [J] (2007 CODATA) + + + Helion Molar Mass: [kg mol^-1] (2007 CODATA) + + + Avogadro constant: [mol^-1] (2010 CODATA) + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 + + + The SI prefix factor corresponding to 1 000 + + + The SI prefix factor corresponding to 100 + + + The SI prefix factor corresponding to 10 + + + The SI prefix factor corresponding to 0.1 + + + The SI prefix factor corresponding to 0.01 + + + The SI prefix factor corresponding to 0.001 + + + The SI prefix factor corresponding to 0.000 001 + + + The SI prefix factor corresponding to 0.000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 000 001 + + + + Sets parameters for the library. + + + + + Given the number elements, should the operation be parallelized. + + The number elements to check. + true if the operation should be parallelized; false otherwise. + + + + Gets or sets a value indicating whether the distribution classes check validate each parameter. + For the multivariate distributions this could involve an expensive matrix factorization. + The default setting of this property is true. + + + + + Gets or sets a value indicating whether to use thread safe random number generators (RNG). + Thread safe RNG about two and half time slower than non-thread safe RNG. + + + true to use thread safe random number generators ; otherwise, false. + + + + + Gets or sets a value indicating whether parallelization shall be disabled globally. + + + + + Gets or sets the linear algebra provider. + + The linear algebra provider. + + + + Gets or sets a value indicating how many parallel worker threads shall be used + when parallelization is applicable. + + Default to the number of processor cores, must be between 1 and 1024 (inclusive). + + + + Gets or sets the the block size to use for + the native linear algebra provider. + + The block size. Default 512, must be at least 32. + + + + Gets or sets the order of the matrix when linear algebra provider + must calculate multiply in parallel threads. + + The order. Default 64, must be at least 3. + + + + Gets or sets the number of elements a vector or matrix + must contain before we multiply threads. + + Number of elements. Default 300, must be at least 3. + + + + Maximum number of columns to print in ToString methods by default. + + + + + Maximum number of rows to print in ToString methods by default. + + + + + 32-bit single precision complex numbers class. + + + + The class Complex32 provides all elementary operations + on complex numbers. All the operators +, -, + *, /, ==, != are defined in the + canonical way. Additional complex trigonometric functions + are also provided. Note that the Complex32 structures + has two special constant values and + . + + + + Complex32 x = new Complex32(1f,2f); + Complex32 y = Complex32.FromPolarCoordinates(1f, Math.Pi); + Complex32 z = (x + y) / (x - y); + + + + For mathematical details about complex numbers, please + have a look at the + Wikipedia + + + + + + Support Interface for Precision Operations (like AlmostEquals). + + Type of the implementing class. + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The value to compare with. + A norm of the difference between this and the other value. + + + + The real component of the complex number. + + + + + The imaginary component of the complex number. + + + + + Initializes a new instance of the Complex32 structure with the given real + and imaginary parts. + + The value for the real component. + The value for the imaginary component. + + + + Creates a complex number from a point's polar coordinates. + + A complex number. + The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number. + The phase, which is the angle from the line to the horizontal axis, measured in radians. + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to one and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to one. + + + + + Returns a new instance + with real and imaginary numbers positive infinite. + + + + + Returns a new instance + with real and imaginary numbers not a number. + + + + + Gets a value indicating whether the Complex32 is zero. + + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + + true if this instance is ; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + + true if this instance is real nonnegative number; otherwise, false. + + + + + Exponential of this Complex32 (exp(x), E^x). + + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex32 (Base E). + + The natural logarithm of this complex number. + + + + Common Logarithm of this Complex32 (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex32 with custom base. + + The logarithm of this complex number. + + + + Raise this Complex32 to the given value. + + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex32 to the inverse of the given value. + + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex32 + + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex32 + + + The square root of this complex number. + + + + + Equality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real and imaginary components of the two complex numbers are equal; false otherwise. + + + + Inequality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real or imaginary components of the two complex numbers are not equal; false otherwise. + + + + Unary addition. + + The complex number to operate on. + Returns the same complex number. + + + + Unary minus. + + The complex number to operate on. + The negated value of the . + + + Addition operator. Adds two complex numbers together. + The result of the addition. + One of the complex numbers to add. + The other complex numbers to add. + + + Subtraction operator. Subtracts two complex numbers. + The result of the subtraction. + The complex number to subtract from. + The complex number to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The complex numbers to add. + The float value to add. + + + Subtraction operator. Subtracts float value from a complex value. + The result of the subtraction. + The complex number to subtract from. + The float value to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The float value to add. + The complex numbers to add. + + + Subtraction operator. Subtracts complex value from a float value. + The result of the subtraction. + The float vale to subtract from. + The complex value to subtract. + + + Multiplication operator. Multiplies two complex numbers. + The result of the multiplication. + One of the complex numbers to multiply. + The other complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The float value to multiply. + The complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The complex number to multiply. + The float value to multiply. + + + Division operator. Divides a complex number by another. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a float value by a complex number. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a complex number by a float value. + The result of the division. + The dividend. + The divisor. + + + + Computes the conjugate of a complex number and returns the result. + + + + + Returns the multiplicative inverse of a complex number. + + + + + Converts the value of the current complex number to its equivalent string representation in Cartesian form. + + The string representation of the current instance in Cartesian form. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format for its real and imaginary parts. + + The string representation of the current instance in Cartesian form. + A standard or custom numeric format string. + + is not a valid format string. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified culture-specific formatting information. + + The string representation of the current instance in Cartesian form, as specified by . + An object that supplies culture-specific formatting information. + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format and culture-specific format information for its real and imaginary parts. + The string representation of the current instance in Cartesian form, as specified by and . + A standard or custom numeric format string. + An object that supplies culture-specific formatting information. + + is not a valid format string. + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + The hash code for the complex number. + + + The hash code of the complex number. + + + The hash code is calculated as + System.Math.Exp(ComplexMath.Absolute(complexNumber)). + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + + A norm of this value. + + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + + The value to compare with. + + + A norm of the difference between this and the other value. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as float. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Explicit conversion of a real decimal to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Explicit conversion of a Complex to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Implicit conversion of a real byte to a Complex32. + + The byte value to convert. + The result of the conversion. + + + + Implicit conversion of a real short to a Complex32. + + The short value to convert. + The result of the conversion. + + + + Implicit conversion of a signed byte to a Complex32. + + The signed byte value to convert. + The result of the conversion. + + + + Implicit conversion of a unsgined real short to a Complex32. + + The unsgined short value to convert. + The result of the conversion. + + + + Implicit conversion of a real int to a Complex32. + + The int value to convert. + The result of the conversion. + + + + Implicit conversion of a BigInteger int to a Complex32. + + The BigInteger value to convert. + The result of the conversion. + + + + Implicit conversion of a real long to a Complex32. + + The long value to convert. + The result of the conversion. + + + + Implicit conversion of a real uint to a Complex32. + + The uint value to convert. + The result of the conversion. + + + + Implicit conversion of a real ulong to a Complex32. + + The ulong value to convert. + The result of the conversion. + + + + Implicit conversion of a real float to a Complex32. + + The float value to convert. + The result of the conversion. + + + + Implicit conversion of a real double to a Complex32. + + The double value to convert. + The result of the conversion. + + + + Converts this Complex32 to a . + + A with the same values as this Complex32. + + + + Returns the additive inverse of a specified complex number. + + The result of the and components of the parameter multiplied by -1. + A complex number. + + + + Computes the conjugate of a complex number and returns the result. + + The conjugate of . + A complex number. + + + + Adds two complex numbers and returns the result. + + The sum of and . + The first complex number to add. + The second complex number to add. + + + + Subtracts one complex number from another and returns the result. + + The result of subtracting from . + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + + + Returns the product of two complex numbers. + + The product of the and parameters. + The first complex number to multiply. + The second complex number to multiply. + + + + Divides one complex number by another and returns the result. + + The quotient of the division. + The complex number to be divided. + The complex number to divide by. + + + + Returns the multiplicative inverse of a complex number. + + The reciprocal of . + A complex number. + + + + Returns the square root of a specified complex number. + + The square root of . + A complex number. + + + + Gets the absolute value (or magnitude) of a complex number. + + The absolute value of . + A complex number. + + + + Returns e raised to the power specified by a complex number. + + The number e raised to the power . + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a complex number. + + The complex number raised to the power . + A complex number to be raised to a power. + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a single-precision floating-point number. + + The complex number raised to the power . + A complex number to be raised to a power. + A single-precision floating-point number that specifies a power. + + + + Returns the natural (base e) logarithm of a specified complex number. + + The natural (base e) logarithm of . + A complex number. + + + + Returns the logarithm of a specified complex number in a specified base. + + The logarithm of in base . + A complex number. + The base of the logarithm. + + + + Returns the base-10 logarithm of a specified complex number. + + The base-10 logarithm of . + A complex number. + + + + Returns the sine of the specified complex number. + + The sine of . + A complex number. + + + + Returns the cosine of the specified complex number. + + The cosine of . + A complex number. + + + + Returns the tangent of the specified complex number. + + The tangent of . + A complex number. + + + + Returns the angle that is the arc sine of the specified complex number. + + The angle which is the arc sine of . + A complex number. + + + + Returns the angle that is the arc cosine of the specified complex number. + + The angle, measured in radians, which is the arc cosine of . + A complex number that represents a cosine. + + + + Returns the angle that is the arc tangent of the specified complex number. + + The angle that is the arc tangent of . + A complex number. + + + + Returns the hyperbolic sine of the specified complex number. + + The hyperbolic sine of . + A complex number. + + + + Returns the hyperbolic cosine of the specified complex number. + + The hyperbolic cosine of . + A complex number. + + + + Returns the hyperbolic tangent of the specified complex number. + + The hyperbolic tangent of . + A complex number. + + + + Gets the real component of the complex number. + + The real component of the complex number. + + + + Gets the real imaginary component of the complex number. + + The real imaginary component of the complex number. + + + + Gets the phase or argument of this Complex32. + + + Phase always returns a value bigger than negative Pi and + smaller or equal to Pi. If this Complex32 is zero, the Complex32 + is assumed to be positive real with an argument of zero. + + The phase or argument of this Complex32 + + + + Gets the magnitude (or absolute value) of a complex number. + + The magnitude of the current instance. + + + + Gets the squared magnitude (or squared absolute value) of a complex number. + + The squared magnitude of the current instance. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex32. + + + + Compound Monthly Return or Geometric Return or Annualized Return + + + + + + + Average Gain or Gain Mean + This is a simple average (arithmetic mean) of the periods with a gain. It is calculated by summing the returns for gain periods (return 0) + and then dividing the total by the number of gain periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Average Loss or LossMean + This is a simple average (arithmetic mean) of the periods with a loss. It is calculated by summing the returns for loss periods (return < 0) + and then dividing the total by the number of loss periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Calculation is similar to Standard Deviation , except it calculates an average (mean) return only for periods with a gain + and measures the variation of only the gain periods around the gain mean. Measures the volatility of upside performance. + © Copyright 1996, 1999 Gary L.Gastineau. First Edition. © 1992 Swiss Bank Corporation. + + + + + + + Similar to standard deviation, except this statistic calculates an average (mean) return for only the periods with a loss and then + measures the variation of only the losing periods around this loss mean. This statistic measures the volatility of downside performance. + + + + http://www.offshore-library.com/kb/statistics.php + + + + This measure is similar to the loss standard deviation except the downside deviation + considers only returns that fall below a defined minimum acceptable return (MAR) rather than the arithmetic mean. + For example, if the MAR is 7%, the downside deviation would measure the variation of each period that falls below + 7%. (The loss standard deviation, on the other hand, would take only losing periods, calculate an average return for + the losing periods, and then measure the variation between each losing return and the losing return average). + + + + + + + + A measure of volatility in returns below the mean. It's similar to standard deviation, but it only + looks at periods where the investment return was less than average return. + + + + + + + Measures a fund’s average gain in a gain period divided by the fund’s average loss in a losing + period. Periods can be monthly or quarterly depending on the data frequency. + + + + + + + Defines the base class for Matrix classes. + + + Defines the base class for Matrix classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns a that describes the type, dimensions and shape of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that summarizes this matrix. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + The value of 1.0. + + + + + The value of 0.0. + + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of this matrix with a scalar. + + The scalar to multiply with. + The result of the multiplication. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Divides each element of this matrix with a scalar. + + The scalar to divide with. + The result of the division. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.ColumnCount != rightSide.Count. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ). + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.ColumnCount. + If the result matrix's dimensions are not the this.RowCount x other.RowCount. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.ColumnCount. + If the other matrix is . + The result of the multiplication. + + + + Multiplies the transpose of this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != rightSide.Count. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Rows != other.RowCount. + If the result matrix's dimensions are not the this.ColumnCount x other.ColumnCount. + + + + Multiplies the transpose of this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Rows != other.RowCount. + If the other matrix is . + The result of the multiplication. + + + + Negate each element of this matrix. + + A matrix containing the negated values. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Complex conjugate each element of this matrix. + + A matrix containing the conjugated values. + + + + Complex conjugate each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Pointwise multiplies this matrix with another matrix. + + The matrix to pointwise multiply with this one. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise multiplication of this matrix and . + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Pointwise divide this matrix by another matrix. + + The matrix to pointwise subtract this one by. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise division of this matrix and . + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + A matrix containing the results. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Calculates the rank of the matrix + + effective numerical rank, obtained from SVD + + + Calculates the condition number of this matrix. + The condition number of the matrix. + The condition number is calculated using singular value decomposition. + + + Computes the determinant of this matrix. + The determinant of this matrix. + + + Computes the inverse of this matrix. + The inverse of this matrix. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + If other is . + The kronecker product of the two matrices. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + The kronecker product of the two matrices. + If other is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows * lower.rows) x (this.Columns * lower.Columns). + + + + Normalizes the columns of a matrix. + + The norm under which to normalize the columns under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Normalizes the rows of a matrix. + + The norm under which to normalize the rows under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Initializes a new instance of the Matrix class. + + + + + Constructs matrix from a list of column vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of column vectors. + Creates a matrix of size Max([i].Count) x .Count + + + + Constructs matrix from a list of row vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of row vectors. + Creates a matrix of size Max(.Count) x [i].Count + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + + + + Sets the value of the given element without range checking. + + + The row of the element. + + + The column of the element. + + + The value to set the element to. + + + + + Sets all values to zero. + + + + + Sets all values of a column to zero. + + + + + Sets all values of a row to zero. + + + + + Sets all values of a submatrix to zero. + + + + + Creates a clone of this instance. + + + A clone of the instance. + + + + + Copies the elements of this matrix to the given matrix. + + + The matrix to copy values into. + + + If target is . + + + If this and the target matrix do not have the same dimensions.. + + + + + Creates a Matrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A Matrix with the given dimensions. + + + Creates a matrix of the same matrix type as the current matrix. + + + + + Creates a Vector with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A Vector with the given dimension. + + + Creates a vector of the same type as the current matrix. + + + + + Copies a row into an Vector. + + The row to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of rows. + + + + Copies a row into to the given Vector. + + The row to copy. + The Vector to copy the row into. + If the result vector is . + If is negative, + or greater than or equal to the number of rows. + If this.Columns != result.Count. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of rows. + is negative, + or greater than or equal to the number of columns. + (columnIndex + length) >= Columns. + If is not positive. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Copies a column into a new Vector>. + + The column to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of columns. + + + + Copies a column into to the given Vector. + + The column to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If this.Rows != result.Count. + + + + Copies the requested column elements into a new Vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of columns. + is negative, + or greater than or equal to the number of rows. + (rowIndex + length) >= Rows. + + If is not positive. + + + + Copies the requested column elements into the given vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Returns the elements of the diagonal in a Vector. + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a new matrix and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Copies the values of the given Vector to the specified column. + + The column to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + + + + Copies the values of the given array to the specified column. + + The column to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + If the size of does not + equal the number of rows of this Matrix. + + + + Creates a new matrix and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Copies the values of the given Vector to the specified row. + + The row to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of the given array to the specified row. + + The row to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of a given matrix into a region in this matrix. + + The row to start copying to. + The number of rows to copy. Must be positive. + The column to start copying to. + The number of columns to copy. Must be positive. + The sub-matrix to copy from. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If is + the size of is not at least x . + If or + is not positive. + + + + Copies the values of the given Vector to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + + + + Concatenates this matrix with the given matrix. + + The matrix to concatenate. + The combined matrix. + + + + Concatenates this matrix with the given matrix and places the result into the result matrix. + + The matrix to concatenate. + The combined matrix. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Diagonally stacks his matrix on top of the given matrix. The new matrix is a M-by-N matrix, + where M = this.Rows + lower.Rows and N = this.Columns + lower.Columns. + The values of off the off diagonal matrices/blocks are set to zero. + + The lower, right matrix. + If lower is . + the combined matrix + + + + Diagonally stacks his matrix on top of the given matrix and places the combined matrix into the result matrix. + + The lower, right matrix. + The combined matrix + If lower is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows + lower.rows) x (this.Columns + lower.Columns). + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + For sparse matrices, the L2 norm is computed using a dense implementation of singular value decomposition. + In a later release, it will be replaced with a sparse implementation. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Returns an that enumerates over the matrix columns. + + An that enumerates over the matrix columns + + + + + Returns an that enumerates the requested matrix columns. + + The column to start enumerating over. + The number of columns to enumerating over. + An that enumerates over requested matrix columns. + + If: + is negative, + or greater than or equal to the number of columns. + (index + length) >= Columns. + + If is not positive. + + + + Returns an that enumerates the requested matrix rows. + + The row to start enumerating over. + The number of rows to enumerating over. + An that enumerates over requested matrix rows. + + If: + is negative, + or greater than or equal to the number of rows. + (index + length) >= Rows. + If is not positive. + + + + Returns an that enumerates over the matrix rows. + + An that enumerates over the matrix rows + + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Returns this matrix as a multidimensional array. + + A multidimensional containing the values of this matrix. + + + + Returns the matrix's elements as an array with the data laid out column-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 4, 7, 2, 5, 8, 3, 6, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Returns the matrix's elements as an array with the data laid row-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 2, 3, 4, 5, 6, 7, 8, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Applies a function to each value of this matrix and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Applies a function to each value of this matrix and replaces the value with its result. + The row and column indices of each value (zero-based) are passed as first arguments to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Gets the raw matrix data storage. + + + + + Gets the number of columns. + + The number of columns. + + + + Gets the number of rows. + + The number of rows. + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Defines the generic class for Vector classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a that describes the type, dimensions and shape of this vector. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that summarizes this vector. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + Returns a that summarizes this vector. + + + + + The zero value for type T. + + + + + The value of 1.0 for type T. + + + + + Initializes a new instance of the Vector class. + + + + Gets the value at the given without range checking.. + The index of the value to get or set. + The value of the vector at the given . + + + Sets the at the given without range checking.. + The index of the value to get or set. + The value to set. + + + + Resets all values to zero. + + + + + Sets all values of a subvector to zero. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + The number of rows. + The number of columns. + A matrix with the given dimensions. + + + + Creates a Vector of the given size using the same storage type + as this vector. + + The size of the Vector to create. + The new Vector. + + + + Negates vector and save result to + + Target vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The result of the division. + + + + Adds a scalar to each element of the vector. + + The scalar to add. + A copy of the vector with the scalar added. + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + If the result vector is . + If this vector and are not the same size. + + + + Returns a copy of this vector. + + This vector. + + Added as an alternative to the unary addition operator. + + + + + Adds another vector to this vector. + + The vector to add to this one. + A new vector containing the sum of both vectors. + If the other vector is . + If this vector and are not the same size. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Subtracts a scalar from each element of the vector. + + The scalar to subtract. + A new vector containing the subtraction of this vector and the scalar. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + If the result vector is . + If this vector and are not the same size. + + + + Returns a negated vector. + + The negated vector. + Added as an alternative to the unary negation operator. + + + + Negates vector and save result to + + Target vector + + + + Subtracts another vector from this vector. + + The vector to subtract from this one. + A new vector containing the subtraction of the the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Return vector with complex conjugate values of the source vector + + Conjugated vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Multiplies a scalar to each element of the vector. + + The scalar to multiply. + A new vector that is the multiplication of the vector and the scalar. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + If the result vector is . + If this vector and are not the same size. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + If is not of the same size. + If is . + + + + Divides each element of the vector by a scalar. + + The scalar to divide with. + A new vector that is the division of the vector and the scalar. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + If the result vector is . + If this vector and are not the same size. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector containing the result. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector. + + The vector to pointwise multiply with this one. + A new vector which is the pointwise multiplication of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector. + + The vector to pointwise divide this one by. + A new vector which is the pointwise division of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Returns a Vector containing the same values of . + + This method is included for completeness. + The vector to get the values from. + A vector containing the same values as . + If is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Adds a scalar to each element of a vector. + + The vector to add to. + The scalar value to add. + The result of the addition. + If is . + + + + Adds a scalar to each element of a vector. + + The scalar value to add. + The vector to add to. + The result of the addition. + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of a vector. + + The vector to subtract from. + The scalar value to subtract. + The result of the subtraction. + If is . + + + + Substracts each element of a vector from a scalar. + + The scalar value to subtract from. + The vector to subtract. + The result of the subtraction. + If is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of maximum element. + + The value of maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of the minimum element. + + The value of the minimum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Returns a deep-copy clone of the vector. + + A deep-copy clone of the vector. + + + + Set the values of this vector to the given values. + + The array containing the values to use. + If is . + If is not the same size as this vector. + + + + Copies the values of this vector into the target vector. + + The vector to copy elements into. + If is . + If is not the same size as this vector. + + + + Creates a vector containing specified elements. + + The first element to begin copying from. + The number of elements to copy. + A vector containing a copy of the specified elements. + If is not positive or + greater than or equal to the size of the vector. + If + is greater than or equal to the size of the vector. + + If is not positive. + + + + Copies the values of a given vector into a region in this vector. + + The field to start copying to + The number of fields to cpy. Must be positive. + The sub-vector to copy from. + If is + + + + Copies the requested elements from this vector to another. + + The vector to copy the elements to. + The element to start copying from. + The element to start copying to. + The number of elements to copy. + + + + Returns the data contained in the vector as an array. + + + The vector's data as an array. + + + + + Create a matrix based on this vector in column form (one single column). + + + This vector as a column matrix. + + + + + Create a matrix based on this vector in row form (one single row). + + + This vector as a row matrix. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an that contains the position and value of the element, for all non-zero elements. + + + An over this vector that contains the position and value of each element. + + + The enumerator returns a + with the first value being the element index and the second value + being the value of the element at that index. + The enumerator will exclude all elements with a zero value. + + + + + Applies a function to each value of this vector and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Applies a function to each value of this vector and replaces the value with its result. + The index of each value (zero-based) is passed as first argument to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Gets the raw vector data storage. + + + + + Gets the number of items. + + + + Gets or sets the value at the given . + The index of the value to get or set. + The value of the vector at the given . + If is negative or + greater than the size of the vector. + + + + Evaluation functions, useful for function approximation. + + + + + Evaluate polynomials. + + The coefficients of the polynomial. + The location where to evaluate the polynomial at. + the evaluation of the polynomial. + + + + Numerically stable series summation + + provides the summands sequentially + Sum + + + Evaluates the series of Chebyshev polynomials Ti at argument x/2. + The series is given by +
+                  N-1
+                   - '
+            y  =   >   coef[i] T (x/2)
+                   -            i
+                  i=0
+            
+ Coefficients are stored in reverse order, i.e. the zero + order term is last in the array. Note N is the number of + coefficients, not the order. +

+ If coefficients are for the interval a to b, x must + have been transformed to x -> 2(2x - b - a)/(b-a) before + entering the routine. This maps x from (a, b) to (-1, 1), + over which the Chebyshev polynomials are defined. +

+ If the coefficients are for the inverted interval, in + which (a, b) is mapped to (1/b, 1/a), the transformation + required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity, + this becomes x -> 4a/x - 1. +

+ SPEED: +

+ Taking advantage of the recurrence properties of the + Chebyshev polynomials, the routine requires one more + addition per loop than evaluating a nested polynomial of + the same degree. +

+ The coefficients of the polynomial. + Argument to the polynomial. + + Reference: https://bpm2.svn.codeplex.com/svn/Common.Numeric/Arithmetic.cs +

+ Marked as Deprecated in + http://people.apache.org/~isabel/mahout_site/mahout-matrix/apidocs/org/apache/mahout/jet/math/Arithmetic.html + + + +

+ Summation of Chebyshev polynomials, using the Clenshaw method with Reinsch modification. + + The no. of terms in the sequence. + The coefficients of the Chebyshev series, length n+1. + The value at which the series is to be evaluated. + + ORIGINAL AUTHOR: + Dr. Allan J. MacLeod; Dept. of Mathematics and Statistics, University of Paisley; High St., PAISLEY, SCOTLAND + REFERENCES: + "An error analysis of the modified Clenshaw method for evaluating Chebyshev and Fourier series" + J. Oliver, J.I.M.A., vol. 20, 1977, pp379-391 + +
+ + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the logistic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the harmonic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the error function. + + + + + The order of the approximation. + + + + + Auxiliary variable when evaluating the function. + + + + + Returns the modified Struve function of order 0. + + The value to compute the function of. + + + + + Returns the modified Struve function of order 1. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I0 and Struve L0 functions. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I1 and Struve L1 functions. + + The value to compute the function of. + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi0 * + ************************************** + + Chebyshev coefficients for exp(-x) I0(x) + in the interval [0, 8]. + + lim(x->0){ exp(-x) I0(x) } = 1. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I0(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi1 * + ************************************** + + Chebyshev coefficients for exp(-x) I1(x) / x + in the interval [0, 8]. + + lim(x->0){ exp(-x) I1(x) / x } = 1/2. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I1(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk0, bessk0e * + ************************************** + + Chebyshev coefficients for K0(x) + log(x/2) I0(x) + in the interval [0, 2]. The odd order coefficients are all + zero; only the even order coefficients are listed. + + lim(x->0){ K0(x) + log(x/2) I0(x) } = -EUL. + + + + Chebyshev coefficients for exp(x) sqrt(x) K0(x) + in the inverted interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K0(x) } = sqrt(pi/2). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk1, bessk1e * + ************************************** + + Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) + in the interval [0, 2]. + + lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. + + + + Chebyshev coefficients for exp(x) sqrt(x) K1(x) + in the interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). + + + + Returns the modified Bessel function of first kind, order 0 of the argument. +

+ The function is defined as i0(x) = j0( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of first kind, + order 1 of the argument. +

+ The function is defined as i1(x) = -i j1( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of the second kind + of order 0 of the argument. +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 0 of the argument. + + The value to compute the bessel function of. + + + + Returns the modified Bessel function of the second kind + of order 1 of the argument. +

+ The range is partitioned into the two intervals [0, 2] and + (2, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 1 of the argument. +

+ k1e(x) = exp(x) * k1(x). +

+ The value to compute the bessel function of. + +
+ + + Computes the logistic function. see: http://en.wikipedia.org/wiki/Logistic + + The parameter for which to compute the logistic function. + The logistic function of . + + + + Computes the logit function, the inverse of the sigmoid logistic function. see: http://en.wikipedia.org/wiki/Logit + + The parameter for which to compute the logit function. This number should be + between 0 and 1. + The logarithm of divided by 1.0 - . + + + + Computes the 'th Harmonic number. + + The Harmonic number which needs to be computed. + The t'th Harmonic number. + + + + Compute the generalized harmonic number of order n of m. (1 + 1/2^m + 1/3^m + ... + 1/n^m) + + The order parameter. + The power parameter. + General Harmonic number. + + + + Computes the logarithm of the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The logarithm of the Euler Beta function evaluated at z,w. + If or are not positive. + + + + Computes the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The Euler Beta function evaluated at z,w. + If or are not positive. + + + + Returns the lower incomplete (unregularized) beta function + I_x(a,b) = int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The lower incomplete (unregularized) beta function. + + + + Returns the regularized lower incomplete beta function + I_x(a,b) = 1/Beta(a,b) * int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The regularized lower incomplete beta function. + + + Calculates the error function. + The value to evaluate. + the error function evaluated at given value. + + + returns 1 if x == Double.PositiveInfinity. + returns -1 if x == Double.NegativeInfinity. + + + + + Calculates the complementary error function. + The value to evaluate. + the complementary error function evaluated at given value. + + + returns 0 if x == Double.PositiveInfinity. + returns 2 if x == Double.NegativeInfinity. + + + + + Calculates the inverse error function evaluated at z. + The inverse error function evaluated at given value. + + + returns Double.PositiveInfinity if z >= 1.0. + returns Double.NegativeInfinity if z <= -1.0. + + + Calculates the inverse error function evaluated at z. + value to evaluate. + the inverse error function evaluated at Z. + + + + Implementation of the error function. + + Where to evaluate the error function. + Whether to compute 1 - the error function. + the error function. + + + Calculates the complementary inverse error function evaluated at z. + The complementary inverse error function evaluated at given value. + We have tested this implementation against the arbitrary precision mpmath library + and found cases where we can only guarantee 9 significant figures correct. + + returns Double.PositiveInfinity if z <= 0.0. + returns Double.NegativeInfinity if z >= 2.0. + + + calculates the complementary inverse error function evaluated at z. + value to evaluate. + the complementary inverse error function evaluated at Z. + + + + The implementation of the inverse error function. + + First intermediate parameter. + Second intermediate parameter. + Third intermediate parameter. + the inverse error function. + + + + Initializes static members of the SpecialFunctions class. + + + + + Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up + to 22! exactly, all numbers up to 170! using a double representation. All larger values will overflow. + + A value value! for value > 0 + + If you need to multiply or divide various such factorials, consider using the logarithmic version + instead so you can add instead of multiply and subtract instead of divide, and + then exponentiate the result using . This will also circumvent the problem that + factorials become very large even for small parameters. + + + + + + Computes the logarithmic factorial function x -> ln(x!) of an integer number > 0. + + A value value! for value > 0 + + + + Computes the binomial coefficient: n choose k. + + A nonnegative value n. + A nonnegative value h. + The binomial coefficient: n choose k. + + + + Computes the natural logarithm of the binomial coefficient: ln(n choose k). + + A nonnegative value n. + A nonnegative value h. + The logarithmic binomial coefficient: ln(n choose k). + + + + Computes the multinomial coefficient: n choose n1, n2, n3, ... + + A nonnegative value n. + An array of nonnegative values that sum to . + The multinomial coefficient. + if is . + If or any of the are negative. + If the sum of all is not equal to . + + + + Polynomial coefficients for the approximation. + + + + + Computes the logarithm of the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which achieves an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + Our unit tests suggest that the accuracy of the Gamma function is correct up to 14 floating point digits. + + + + + Computes the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which should achieve an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + + Our unit tests suggest that the accuracy of the Gamma function is correct up to 13 floating point digits. + + + + + Returns the upper incomplete regularized gamma function + Q(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete regularized gamma function. + + + + Returns the upper incomplete gamma function + Gamma(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete gamma function. + + + + Returns the lower incomplete gamma function + gamma(a,x) = int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Returns the lower incomplete regularized gamma function + P(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Computes the Digamma function which is mathematically defined as the derivative of the logarithm of the gamma function. + This implementation is based on + Jose Bernardo + Algorithm AS 103: + Psi ( Digamma ) Function, + Applied Statistics, + Volume 25, Number 3, 1976, pages 315-317. + Using the modifications as in Tom Minka's lightspeed toolbox. + + The argument of the digamma function. + The value of the DiGamma function at . + + + + Computes the inverse Digamma function: this is the inverse of the logarithm of the gamma function. This function will + only return solutions that are positive. + This implementation is based on the bisection method. + + The argument of the inverse digamma function. + The positive solution to the inverse DiGamma function at . + + + + Numerically stable exponential minus one, i.e. x -> exp(x)-1 + + A number specifying a power. + Returns exp(power)-1. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Statistics operating on arrays assumed to be unsorted. + WARNING: Methods with the Inplace-suffix may modify the data array by reordering its entries. + + + + + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the order statistic (order 1..N) from the unsorted data array. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the p-Percentile value from the unsorted data array. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the third quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the inter-quartile range from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + Quantile definition, to choose what product/definition it should be consistent with + + + + Statistics operating on an IEnumerable in a single pass, without keeping the full data in memory. + Can be used in a streaming way, e.g. on large datasets not fitting into memory. + + + + + + + + Returns the smallest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Returns the largest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Statistics operating on an array already sorted ascendingly. + + + + + + + + Returns the smallest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the largest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the order statistic (order 1..N) from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the p-Percentile value from the sorted data array (ascending). + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the third quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the inter-quartile range from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + The Cauchy distribution is a symmetric continuous probability distribution. For details about this distribution, see + Wikipedia - Cauchy distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for continuous univariate distributions. + + + + + The interface for univariate distributions. + + + + + Computes the cumulative distribution function (cdf) for this probability distribution. + + The location at which to compute the cumulative distribution function. + the cumulative distribution at location . + + + + Gets or sets the random number generator which is used to generate random samples from the distribution. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + The probability density of the distribution. + + The location at which to compute the density. + the density at . + + + + The log probability density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by a double. + + + + + Gets the largest element in the domain of the distributions which can be represented by a double. + + + + + The scale of the Cauchy distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class with the location parameter set to 0 and the scale parameter set to 1 + + + + + Initializes a new instance of the class. + + + The location parameter for the distribution. + + + The scale parameter for the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + Location parameter. + Scale parameter. Must be greater than 0. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Location parameter. + Scale parameter. Must be greater than 0. + True when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Chi distribution. This distribution is + a continuous probability distribution. The distribution usually arises when a k-dimensional vector's orthogonal + components are independent and each follow a standard normal distribution. The length of the vector will + then have a chi distribution. + Wikipedia - Chi distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the degrees of freedom for the Chi distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Chi distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Chi distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Chi distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + Degrees of Freedom + a random number from the distribution. + + + + Generates a sample from the Chi distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Chi distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + Degrees of Freedom + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + Degrees of Freedom + a sequence of samples from the distribution. + + + + Gets or sets the degrees of freedom of the Chi distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the ChiSquare distribution. This distribution is + a sum of the squares of k independent standard normal random variables. + Wikipedia - ChiSquare distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the ChiSquare distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the ChiSquare distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the ChiSquare distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The degrees of freedom. + a random number from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ChiSquare distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Gets or sets the degrees of freedom of the ChiSquare distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Erlang distribution. This distribution is + is a continuous probability distribution with wide applicability primarily due to its + relation to the exponential and Gamma distributions. + Wikipedia - Erlang distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Erlang shape parameter. + + + + + Erlang inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape of the Erlang distribution. + + + The inverse scale of the Erlang distribution. + + + + + Constructs a Erlang distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The scale of the Erlang distribution. + a normal distribution. + + + + Constructs a Erlang distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + a normal distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the Erlang distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the density. + the density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Erlang Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Erlang distributed random variable. + + + + Generates a sample from the Erlang distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Erlang distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Erlang distribution. + + + + + Gets or sets the scale of the Erlang distribution. + + + + + Gets or sets the inverse scale of the Erlang distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum value. + + + + + Gets the Maximum value. + + + + + The exponential distribution is a distribution over the real numbers parameterized by one non-negative parameter. + Wikipedia - exponential distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The lambda parameter of the Exponential distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter of the Exponential distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + Lambda parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Lambda parameter. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + a sequence of samples from the distribution. + + + + Draws a random sample from the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a sequence of samples from the distribution. + + + + Gets or sets the lambda parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the FisherSnedecor distribution. For details about this distribution, see + Wikipedia - FisherSnedecor distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The first parameter - degree of freedom. + + + + + The second parameter - degree of freedom. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The first parameter - degree of freedom. + + + The second parameter - degree of freedom. + + + + + Sets the parameters of the distribution after checking their validity. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + + + + Checks whether the parameters of the distribution are valid. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates one sample from the FisherSnedecor distribution without parameter checking. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a FisherSnedecor distributed random number. + + + + Generates a sample from the FisherSnedecor distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the FisherSnedecor distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sequence of samples from the distribution. + + + + Gets or sets the first parameter - degree of freedom. + + + + + Gets or sets the second parameter - degree of freedom. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The inverse Gamma distribution is a distribution over the positive real numbers parameterized by + two positive parameters. + Wikipedia - InverseGamma distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Inverse Gamma shape parameter. + + + + + Inverse Gamma scale parameter scale. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape (alpha) parameter. + + + + + Gets or sets The scale (beta) parameter. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Throws . + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Laplace distribution is a distribution over the real numbers parameterized by a mean and + scale parameter. The PDF is: + p(x) = \frac{1}{2 * scale} \exp{- |x - mean| / scale}. + Wikipedia - Laplace distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale of the Laplace distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class (location = 0, scale = 1). + + + + + Initializes a new instance of the class. + + + The location for the Laplace distribution. + + + The scale for the Laplace distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Samples a Laplace distributed random variable. + + a sample from the distribution. + + + + Generates a sample from the Laplace distribution. + + a sample from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Laplace distribution. + + + + + Gets or sets the scale of the Laplace distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Pareto distribution is a power law probability distribution that coincides with social, + scientific, geophysical, actuarial, and many other types of observable phenomena. + For details about this distribution, see + Wikipedia - Pareto distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The shape parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + The shape parameter of the distribution. + + + If or are negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + The shape parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + The shape parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Pareto distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + The shape parameter. + a random number from the Pareto distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Pareto distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the shape parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Rayleigh distribution (pronounced /ˈreɪli/) is a continuous probability distribution. As an + example of how it arises, the wind speed will have a Rayleigh distribution if the components of + the two-dimensional wind velocity vector are uncorrelated and normally distributed with equal variance. + For details about this distribution, see + Wikipedia - Rayleigh distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Rayleigh distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + a random number from the Rayleigh distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Rayleigh distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + A random variable is said to be stable (or to have a stable distribution) if it has + the property that a linear combination of two independent copies of the variable has + the same distribution, up to location and scale parameters. + For details about this distribution, see + Wikipedia - Stable distribution. + + The distribution will use the by default.` + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The stability parameter of the distribution. + + + + + The skewness parameter of the distribution. + + + + + The scale parameter of the distribution. + + + + + The location parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The stability parameter of the distribution. + + + The skewness parameter of the distribution. + + + The scale parameter of the distribution. + + + The location parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + Throws a not supported exception if Alpha != 2, (Alpha != 1 and Beta !=0), or (Alpha != 0.5 and Beta != 1) + + + + Computes the cumulative distribution function of the Levy distribution. + + The scale parameter. + The location parameter. + The location at which to compute the cumulative density. + + the cumulative density at . + + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the density of the Levy distribution. + + The scale parameter of the distribution. + The location parameter of the distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Stable distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the stability parameter of the distribution. + + + + + Gets or sets The skewness parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets he entropy of the distribution. + + Always throws a not supported exception. + + + + Gets the skewness of the distribution. + + Throws a not supported exception of Alpha != 2. + + + + Gets the mode of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the median of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Conway-Maxwell-Poisson distribution is a generalization of the Poisson, Geometric and Bernoulli + distributions. It is parameterized by two real numbers "lambda" and "nu". For + + nu = 0 the distribution reverts to a Geometric distribution + nu = 1 the distribution reverts to the Poisson distribution + nu -> infinity the distribution converges to a Bernoulli distribution + + This implementation will cache the value of the normalization constant. + Wikipedia - ConwayMaxwellPoisson distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for discrete univariate distributions. + + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Since many properties of the distribution can only be computed approximately, the tolerance + level specifies how much error we accept. + + + + + The mean of the distribution. + + + + + The variance of the distribution. + + + + + Caches the value of the normalization constant. + + + + + The lambda parameter. + + + + + The nu parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter. + + + The nu parameter. + + + + + Sets the parameters of the distribution after checking their validity. + + The lambda parameter. + The nu parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The lambda parameter. + The nu parameter. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the ConwayMaxwellPoisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the log probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Computes an approximate normalization constant for the CMP distribution. + + The lambda parameter for the CMP distribution. + The nu parameter for the CMP distribution. + + an approximate normalization constant for the CMP distribution. + + + + + Returns one trials from the distribution. + + The random number generator to use. + The lambda parameter + The nu parameter. + The z parameter. + + One sample from the distribution implied by , , and . + + + + + Samples a Conway-Maxwell-Poisson distributed random variable. + + a sample from the distribution. + + + + Samples a sequence of a Conway-Maxwell-Poisson distributed random variables. + + + a sequence of samples from a Conway-Maxwell-Poisson distribution. + + + + + Samples a random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Gets or sets the lambda parameter. + + The value of the lambda parameter. + + + + Gets or sets the Nu parameter. + + The value of the Nu parameter. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the normalization constant of the Conway-Maxwell-Poisson distribution. + + + + + The Geometric distribution is a distribution over positive integers parameterized by one positive real number. + This implementation of the Geometric distribution will never generate 0's. + Wikipedia - geometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The geometric distribution parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Geometric class. + + The probability of generating one. + If the Geometric parameter is not in the range [0,1]. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Returns one sample from the distribution. + + The random number generator to use. + The p parameter + + One sample from the distribution implied by . + + + + + Samples a Geometric distributed random variable. + + A sample from the Geometric distribution. + + + + Samples an array of Geometric distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The p parameter + + + + Samples a sequence of this random variable. + + The random number generator to use. + The p parameter + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a not supported exception. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the Hypergeometric distribution. This distribution is + a discrete probability distribution that describes the number of successes in a sequence + of n draws from a finite population without replacement, just as the binomial distribution + describes the number of successes for draws with replacement + Wikipedia - Hypergeometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The size of the population. + + + + + The m parameter of the distribution. + + + + + The n parameter (number to draw) of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Hypergeometric class. + + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Hypergeometric distribution without doing parameter checking. + + The random number generator to use. + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + a random number from the Hypergeometric distribution. + + + + Samples a Hypergeometric distributed random variable. + + The number of successes in n trials. + + + + Samples an array of Hypergeometric distributed random variables. + + a sequence of successes in n trials. + + + + Samples a random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the population size. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the m parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The negative binomial is a distribution over the natural numbers with two parameters r,p. For the special + case that r is an integer one can interpret the distribution as the number of tails before the r'th head + when the probability of head is p. + Wikipedia - NegativeBinomial distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The r parameter of the distribution. + + + + + The p parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The number of trials. + The probability of a trial resulting in success. + + + + Sets the parameters of the distribution after checking their validity. + + The number of trials. + The probability of a trial resulting in success. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The number of trials. + The probability of a trial resulting in success. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the NegativeBinomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Samples a negative binomial distributed random variable. + + The random number generator to use. + The r parameter. + The p parameter. + a sample from the distribution. + + + + Samples a NegativeBinomial distributed random variable. + + a sample from the distribution. + + + + Samples an array of NegativeBinomial distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Gets or sets the number of trials. + + + + + Gets or sets the probability of success. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Pseudo-random generation of poisson distributed deviates. + + + Distribution is described at Wikipedia - Poisson distribution. + Knuth's method is used to generate Poisson distributed random variables. + f(x) = exp(-λ)*λ^x/x!; + + + + + The Poisson distribution parameter λ. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The Poisson distribution parameter λ. + If is equal or less then 0.0. + + + + Sets the parameters of the distribution after checking their validity. + + The mean (λ) of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean (λ) of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Poisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Poisson distribution. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by Knuth's method. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by "Rejection method PA". + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + "Rejection method PA" from "The Computer Generation of Poisson Random Variables" by A. C. Atkinson, + Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28, No. 1. (1979) + The article is on pages 29-35. The algorithm given here is on page 32. + + + + Samples a Poisson distributed random variable. + + A sample from the Poisson distribution. + + + + Samples an array of Poisson distributed random variables. + + a sequence of successes in N trials. + + + + Samples a Poisson distributed random variable. + + The random number generator to use. + The Poisson distribution parameter λ. + A sample from the Poisson distribution. + + + + Samples a sequence of Poisson distributed random variables. + + The random number generator to use. + The Poisson distribution parameter λ. + a sequence of samples from the distribution. + + + + Gets or sets the Poisson distribution parameter λ. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Zipf's law, an empirical law formulated using mathematical statistics, refers to the fact + that many types of data studied in the physical and social sciences can be approximated with + a Zipfian distribution, one of a family of related discrete power law probability distributions. + For details about this distribution, see + Wikipedia - Zipf distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The s parameter of the distribution. + + + + + The n parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The s parameter of the distribution. + + + The n parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The s parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The s parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The integer location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Zipf distribution without doing parameter checking. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + a random number from the Zipf distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of zipf distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the s parameter of the distribution. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the inverse Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The inverse Wishart distribution + is the conjugate prior for the covariance matrix of a multivariate normal distribution. + Wikipedia - Inverse-Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the inverse Wishart distribution. + + + + + The scale matrix for the inverse Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the inverse Wishart distribution. + + + The scale matrix for the inverse Wishart distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the inverse Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + a sample from the distribution. + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sample from the distribution. + + + + Gets or sets the degrees of freedom for the inverse Wishart distribution. + + + + + Gets or sets the scale matrix for the inverse Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + A. O'Hagan, and J. J. Forster (2004). Kendall's Advanced Theory of Statistics: Bayesian Inference. 2B (2 ed.). Arnold. ISBN 0-340-80752-0. + + + + Gets the variance of the distribution. + + The variance of the distribution. + Kanti V. Mardia, J. T. Kent and J. M. Bibby (1979). Multivariate Analysis. + + + + This class implements functionality for matrix valued normal distributions. The distribution + is parameterized by a mean matrix (M), a covariance matrix for the rows (V) and a covariance matrix + for the columns (K). If the dimension of M is d-by-m then V is d-by-d and K is m-by-m. + Wikipedia - MatrixNormal distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The mean of the matrix normal distribution. + + + + + The covariance matrix for the rows. + + + + + The covariance matrix for the columns. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The mean of the matrix normal. + + + The covariance matrix for the rows. + + + The covariance matrix for the columns. + + + If the dimensions of the mean and two covariance matrices don't match. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the matrix normal distribution. + + The matrix at which to evaluate the density at. + the density at + If the argument does not have the correct dimensions. + + + + Samples a matrix normal distributed random variable. + + A random number from this distribution. + + + + Samples a matrix normal distributed random variable. + + The random number generator to use. + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + If the dimensions of the mean and two covariance matrices don't match. + a sequence of samples from the distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The covariance matrix of the vector normal distribution. + a sequence of samples from defined distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The Cholesky factorization of the covariance matrix. + a sequence of samples from defined distribution. + + + + Gets or sets the mean. (M) + + The mean of the distribution. + + + + Gets or sets the row covariance. (V) + + The row covariance. + + + + Gets or sets the column covariance. (K) + + The column covariance. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + This class implements functionality for the Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The Wishart distribution + is the conjugate prior for the precision (inverse covariance) matrix of the multivariate + normal distribution. + Wikipedia - Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the Wishart distribution. + + + + + The scale matrix for the Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Wishart distribution. + + + The scale matrix for the Wishart distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Evaluates the probability density function for the Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + A random number from this distribution. + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sequence of samples from the distribution. + + + + Samples the distribution. + + The random number generator to use. + The nu parameter to use. + The S parameter to use. + The cholesky decomposition to use. + a random number from the distribution. + + + + Gets or sets the degrees of freedom for the Wishart distribution. + + + + + Gets or sets the scale matrix for the Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + + + + Gets the variance of the distribution. + + The variance of the distribution. + + + + Retrieves the requested element without range checking. + + The index of the element. + The requested element. + Not range-checked. + + + + Sets the element without range checking. + + The index of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given index, with range checking. + + + The index of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this vector can be set to any value. + False if some fields are fixed. + + + + + Array that contains the indices of the non-zero values. + + + + + Array that contains the non-zero elements of the vector. + + + + + Gets the number of non-zero elements in the vector. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed, like an off-diagonal field on a diagonal matrix. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this matrix can be set to any value. + False if some fields are fixed, like on a diagonal matrix. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + Supported data types are double, single, , and . + + + + Classes that solves a system of linear equations, AX = B. + + Supported data types are double, single, , and . + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, Ax = b + + The right hand side vector, b. + The left hand side Vector, x. + + + + Solves a system of linear equations, Ax = b. + + The right hand side vector, b. + The left hand side Matrix>, x. + + + + Internal method which routes the call to perform the Cholesky factorization to the appropriate class. + + The matrix to factor. + A cholesky factorization object. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets the lower triangular form of the Cholesky matrix + + + + + Gets the lower triangular form of the Cholesky matrix. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + An EVD object. + + + Returns the eigen values as a . + The eigen values. + + + Returns the right eigen vectors as a . + The eigen vectors. + + + Returns the block diagonal eigenvalue matrix . + The block diagonal eigenvalue matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether matrix is symmetric or not + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Gets or sets the eigen values (λ) of matrix in ascending value. + + + + + Gets or sets eigenvectors. + + + + + Gets or sets the block diagonal eigenvalue matrix. + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + Supported data types are double, single, , and . + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + The type of QR factorization to perform. + A QR factorization object. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets orthogonal Q matrix + + + + + Gets or sets upper triangular factor R + + + + + The QR factorization method. + + + + + Gets orthogonal Q matrix + + + + + Gets the upper triangular factor R. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + A QR factorization object. + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + Supported data types are double, single, , and . + + + + Value of one for T. + + + + + Internal method which routes the call to perform the LU factorization to the appropriate class. + + The matrix to factor. + An LU factorization object. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + Gets or sets both the L and U factors in the same matrix. + + + + + Gets or sets the pivot indices of the LU factorization. + + + + + Gets the lower triangular factor. + + + + + Gets the upper triangular factor. + + + + + Gets the permutation applied to LU factorization. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + Compute the singular U and VT vectors or not. + An SVD object. + + + Returns the left singular vectors as a . + The left singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + + + Returns the right singular vectors as a . + The right singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + This is the transpose of the V matrix. + + + Returns the singular values as a diagonal . + The singular values as a diagonal . + + + Returns the singular values as a . + the singular values as a . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether to compute U and VT matrices during SVD factorization or not + + + + + Gets or sets the singular values (Σ) of matrix in ascending value. + + + + + Gets or sets left singular vectors (U - m-by-m unitary matrix) + + + + + Gets or sets transpose right singular vectors (transpose of V, an n-by-n unitary matrix + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + Complex version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A Complex dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + double version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + double version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A setup functions to help simplify the generic code. + + + + + Sets the value of 1.0 for type T. + + The type to return the value of 1.0 of. + The value of 1.0 for type T. + + + + Sets the value of 0.0 for type T. + + The type to return the value of 0.0 of. + The value of 0.0 for type T. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex32 value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex32 value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex32 value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A Complex32 dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex32 dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex32 value z1 + Complex32 value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex value z1 + Complex value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + float version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + float version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + The type of QR factorization go perform. + + + + + Compute the full QR factorization of a matrix. + + + + + Compute the thin QR factorixation of a matrix. + + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + It may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was canceled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Indicates that a calculation was cancelled by the user. + + + + + Defines the base interface for calculation status objects. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has converged to the desired convergence levels. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation diverged. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has failed for some reason. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the state of the calculation is indetermined, not started or stopped. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation is running and no results are yet known. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation has been stopped due to reaching the stopping + limits, but that convergence was not achieved. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Iteration stop criteria. + + + + + Monitor calculation failures in the iterative calculation. + + + + + Monitor the calculation for signs of divergence. + + + + + Guard the calculation against unlimited continuation + by monitoring user specified limits, e.g. the maximum number of iterations. + + + + + Monitor the calculation for convergence, usually + based on the residuals of the calculation. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + The array containing the row indices of the existing rows. Element "j" of the array gives the index of the + element in the array that is first non-zero element in a row "j" + + + + + An array containing the column indices of the non-zero values. Element "I" of the array + is the number of the column in matrix that contains the I-th value in the array. + + + + + Array that contains the non-zero elements of matrix. Values of the non-zero elements of matrix are mapped into the values + array using the row-major storage mapping described in a compressed sparse row (CSR) format. + + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + Delete value from internal storage + + Index of value in nonZeroValues array + Row number of matrix + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Find item Index in nonZeroValues array + + Matrix row index + Matrix column index + Item index + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Class to represent a permutation for a subset of the natural numbers. + + + + + Entry _indices[i] represents the location to which i is permuted to. + + + + + Initializes a new instance of the Permutation class. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + + + + Computes the inverse of the permutation. + + The inverse of the permutation. + + + + Construct an array from a sequence of inversions. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + The set of inversions to construct the permutation from. + A permutation generated from a sequence of inversions. + + + + Construct a sequence of inversions from the permutation. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + A sequence of inversions. + + + + Checks whether the array represents a proper permutation. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + True if represents a proper permutation, false otherwise. + + + + Gets the number of elements this permutation is over. + + + + + Computes where permutes too. + + The index to permute from. + The index which is permuted to. + + + + Implements the Beta distribution. For details about this distribution, see + Wikipedia - Beta distribution. + + + There are a few special cases for the parameterization of the Beta distribution. When both + shape parameters are positive infinity, the Beta distribution degenerates to a point distribution + at 0.5. When one of the shape parameters is positive infinity, the distribution degenerates to a point + distribution at the positive infinity. When both shape parameters are 0.0, the Beta distribution + degenerates to a Bernoulli distribution with parameter 0.5. When one shape parameter is 0.0, the + distribution degenerates to a point distribution at the non-zero shape parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Beta shape parameter a. + + + + + Beta shape parameter b. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Beta class. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + If any of the Beta parameters are negative. + + + + A string representation of the distribution. + + A string representation of the Beta distribution. + + + + Checks whether the parameters of the distribution are valid. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + When the parameters don't pass the function. + + + + Computes the density of the Beta distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Beta distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Beta distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples Beta distributed random variables by sampling two Gamma variables and normalizing. + + The random number generator to use. + The A shape parameter. + The B shape parameter. + a random number from the Beta distribution. + + + + Generates a sample from the Beta distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Beta distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sequence of samples from the distribution. + + + + Gets or sets the A shape parameter of the Beta distribution. + + + + + Gets or sets the B shape parameter of the Beta distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Beta distribution. + + + + + Gets the variance of the Beta distribution. + + + + + Gets the standard deviation of the Beta distribution. + + + + + Gets the entropy of the Beta distribution. + + + + + Gets the skewness of the Beta distribution. + + + + + Gets the mode of the Beta distribution; when there are multiple answers, this routine will return 0.5. + + + + + Gets the median of the Beta distribution. + + + + + Gets the minimum of the Beta distribution. + + + + + Gets the maximum of the Beta distribution. + + + + + The continuous uniform distribution is a distribution over real numbers. For details about this distribution, see + Wikipedia - Continuous uniform distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the ContinuousUniform class with lower bound 0 and upper bound 1. + + + + + Initializes a new instance of the ContinuousUniform class with given lower and upper bounds. + + Lower bound. + Upper bound; must be at least as large as . + If the upper bound is smaller than the lower bound. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the ContinuousUniform distribution without parameter checking. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed random number. + + + + Generates a sample from the ContinuousUniform distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed sample. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of uniformly distributed samples. + + + + Gets or sets the lower bound of the distribution. + + + + + Gets or sets the upper bound of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + + Gets the median of the distribution. + + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Log-Normal distribution. For details about this distribution, see + Wikipedia - Log-Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mu of the logarithm of the log-log-normal distribution. + + + + + Keeps track of the standard deviation of the logarithm of the log-log-normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + The distribution will be initialized with the default + random number generator. + + + The mu of the logarithm of the distribution. + + + The standard deviation of the logarithm of the distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + When the parameters don't pass the function. + + + + Computes the density of the log-normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the log-normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the log-normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the mean of the logarithm of the log-normal. + + + + + Gets or sets the standard deviation of the logarithm of the log-normal. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mu of the log-normal distribution. + + + + + Gets the variance of the log-normal distribution. + + + + + Gets the standard deviation of the log-normal distribution. + + + + + Gets the entropy of the log-normal distribution. + + + + + Gets the skewness of the log-normal distribution. + + + + + Gets the mode of the log-normal distribution. + + + + + Gets the median of the log-normal distribution. + + + + + Gets the minimum of the log-normal distribution. + + + + + Gets the maximum of the log-normal distribution. + + + + + Implements the Weibull distribution. For details about this distribution, see + Wikipedia - Weibull distribution. + + + The Weibull distribution is parametrized by a shape and scale parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Weibull shape parameter. + + + + + Weibull inverse scale parameter. + + + + + Reusable intermediate result 1 / ( ^ ) + + + By caching this parameter we can get slightly better numerics precision + in certain constellations without any additional computations. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Weibull class. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Weibull distribution. + The scale of the Weibull distribution. + true when the parameters positive valid floating point numbers, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + When the parameters don't pass the function. + + + + Computes the density of the Weibull distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Weibull distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Weibull distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the Weibull distribution. This method doesn't perform + any parameter checks. + + The random number generator to use. + The shape of the Weibull distribution. + The scale of the Weibull distribution. + A sample from a Weibull distributed random variable. + + + + Generates a sample from the Weibull distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Weibull distribution. + + + + + Gets or sets the scale of the Weibull distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Weibull distribution. + + + + + Gets the variance of the Weibull distribution. + + + + + Gets the standard deviation of the Weibull distribution. + + + + + Gets the entropy of the Weibull distribution. + + + + + Gets the skewness of the Weibull distribution. + + + + + Gets the mode of the Weibull distribution. + + + + + Gets the median of the Weibull distribution. + + + + + Gets the minimum of the Weibull distribution. + + + + + Gets the maximum of the Weibull distribution. + + + + + Implements the univariate Gamma distribution. For details about this distribution, see + Wikipedia - Gamma distribution. + + + The Gamma distribution is parametrized by a shape and inverse scale parameter. When we want + to specify a Gamma distribution which is a point distribution we set the shape parameter to be the + location of the point distribution and the inverse scale as positive infinity. The distribution + with shape and inverse scale both zero is undefined. + Random number generation for the Gamma distribution is based on the algorithm in: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Gamma shape parameter. + + + + + Gamma inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Gamma class. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + + + + Constructs a Gamma distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The scale of the Gamma distribution. + a normal distribution. + + + + Constructs a Gamma distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + When the parameters don't pass the function. + + + + Computes the density of the Gamma distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Gamma distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Gamma distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Gamma distributed random variable. + + + + Generates a sample from the Gamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Gamma distribution. + + + + + Gets or sets the scale of the Gamma distribution. + + + + + Gets or sets the inverse scale of the Gamma distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Gamma distribution. + + + + + Gets the variance of the Gamma distribution. + + + + + Gets the standard deviation of the Gamma distribution. + + + + + Gets the entropy of the Gamma distribution. + + + + + Gets the skewness of the Gamma distribution. + + + + + Gets the mode of the Gamma distribution. + + + + + Gets the median of the Gamma distribution. + + + + + Gets the minimum of the Gamma distribution. + + + + + Gets the maximum of the Gamma distribution. + + + + + Implements the univariate Normal (or Gaussian) distribution. For details about this distribution, see + Wikipedia - Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mean of the normal distribution. + + + + + Keeps track of the standard deviation of the normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Normal class. This is a normal distribution with mean 0.0 + and standard deviation 1.0. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the Normal class with a particular mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + + + + Constructs a normal distribution from a mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and variance. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The variance of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and precision. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The precision of the normal distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + When the parameters don't pass the function. + + + + Computes the density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the log density at . + + + + Computes the density of the normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the inverse cumulative distribution function of the normal distribution. + + The location at which to compute the inverse cumulative density. + the inverse cumulative density at . + + + + Samples a pair of standard normal distributed random variables using the Box-Muller algorithm. + + The random number generator to use. + a pair of random numbers from the standard normal distribution. + + + + Samples the distribution. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a random number from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the precision of the normal distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets or sets the mean of the normal distribution. + + + + + Gets or sets the variance of the normal distribution. + + + + + Gets or sets the standard deviation of the normal distribution. + + + + + Gets the entropy of the normal distribution. + + + + + Gets the skewness of the normal distribution. + + + + + Gets the mode of the normal distribution. + + + + + Gets the median of the normal distribution. + + + + + Gets the minimum of the normal distribution. + + + + + Gets the maximum of the normal distribution. + + + + + The Bernoulli distribution is a distribution over bits. The parameter + p specifies the probability that a 1 is generated. + Wikipedia - Bernoulli distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The probability of generating a one. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Bernoulli class. + + The probability of generating one. + If the Bernoulli parameter is not in the range [0,1]. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Bernoulli distribution. + + The random source to use. + The probability of generating a one. + A random sample from the Bernoulli distribution. + + + + Samples a Bernoulli distributed random variable. + + A sample from the Bernoulli distribution. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a Bernoulli distributed random variable. + + The random number generator to use. + The probability of generating a 1. + A sample from the Bernoulli distribution. + + + + Samples a sequence of Bernoulli distributed random variables. + + The random number generator to use. + The probability of generating a 1. + a sequence of samples from the distribution. + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the binomial distribution. For details about this distribution, see + Wikipedia - Binomial distribution. + + The distribution is parameterized by a probability (between 0.0 and 1.0). + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized binomial probability. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Binomial class. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The success probability of a trial. + The number of trials. + false is not in the interval [0.0,1.0] or is negative, true otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates a sample from the Binomial distribution without doing parameter checking. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successful trials. + + + + Samples a Binomially distributed random variable. + + The number of successes in N trials. + + + + Samples an array of Binomially distributed random variables. + + a sequence of successes in N trials. + + + + Samples a binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successes in trials. + + + + Samples a sequence of binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + a sequence of successes in trials. + + + + Gets or sets the success probability. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the categorical distribution. For details about this distribution, see + Wikipedia - Categorical distribution. This + distribution is sometimes called the Discrete distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the unnormalized categorical probabilities. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Categorical class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative or do not sum to one. + + + + Initializes a new instance of the Categorical class from a . The distribution + will not be automatically updated when the histogram changes. The categorical distribution will have + one value for each bucket and a probability for that value proportional to the bucket count. + + The histogram from which to create the categorical variable. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative returns false, or if the sum of parameters is 0.0; otherwise true + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Computes the unnormalized cumulative distribution function. This method performs no + parameter checking. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + An array representing the unnormalized cumulative distribution function. + + + + Returns one trials from the categorical distribution. + + The random number generator to use. + The cumulative distribution of the probability distribution. + One sample from the categorical distribution implied by . + + + + Samples a Binomially distributed random variable. + + The number of successful trials. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of successful trial counts. + + + + Samples one categorical distributed random variable; also known as the Discrete distribution. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + One random integer between 0 and the size of the categorical (exclusive). + + + + Samples a categorically distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + random integers between 0 and the size of the categorical (exclusive). + + + + Gets or sets the normalized probability vector of the multinomial. + + Sometimes the normalized probability vector cannot be represented + exactly in a floating point representation. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a . + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets he mode of the distribution. + + Throws a . + + + + Gets the median of the distribution. + + + + + The discrete uniform distribution is a distribution over integers. The distribution + is parameterized by a lower and upper bound (both inclusive). + Wikipedia - Discrete uniform distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the DiscreteUniform class. + + Lower bound. + Upper bound; must be at least as large as . + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates one sample from the discrete uniform distribution. This method does not do any parameter checking. + + The random source to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A random sample from the discrete uniform distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of uniformly distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a uniformly distributed random variable. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A sample from the discrete uniform distribution. + + + + Samples a sequence of uniformly distributed random variables. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of samples from the discrete uniform distribution. + + + + Gets or sets the lower bound of the probability distribution. + + + + + Gets or sets the upper bound of the probability distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution; since every element in the domain has the same probability this method returns the middle one. + + + + + Gets the median of the distribution. + + + + + Implements the multivariate Dirichlet distribution. For details about this distribution, see + Wikipedia - Dirichlet distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The Dirichlet distribution parameters. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Dirichlet class. The distribution will + be initialized with the default random number generator. + + An array with the Dirichlet parameters. + + + + Initializes a new instance of the class. + + random number generator. + + + The value of each parameter of the Dirichlet distribution. + + + The dimension of the Dirichlet distribution. + + + + + Checks whether the parameters of the distribution are valid: no + parameter can be less than zero and at least one parameter should be + larger than zero. + + The parameters of the Dirichlet distribution. + + true when the parameters are valid, false + otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The parameters of the Dirichlet distribution. + When the parameters don't pass the function. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the density of the distribution. + + The locations at which to compute the density. + the density at . + The Dirichlet distribution requires that the sum of the components of x equals 1. + You can also leave out the last component, and it will be computed from the others. + + + + Computes the log density of the distribution. + + The locations at which to compute the density. + the density at . + + + + Samples a Dirichlet distributed random vector. + + A sample from this distribution. + + + + Samples a Dirichlet distributed random vector. + + The random number generator to use. + The Dirichlet distribution parameter. + a sample from the distribution. + + + + Gets the dimension of the Dirichlet distribution. + + + + + Gets or sets the parameters of the Dirichlet distribution. + + + + + Gets the sum of the Dirichlet parameters. + + + + + Gets the mean of the Dirichlet distribution. + + + + + Gets the variance of the Dirichlet distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Implements the multinomial distribution. For details about this distribution, see + Wikipedia - Multinomial distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized multinomial probabilities. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Multinomial class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + Initializes a new instance of the Multinomial class from histogram . The distribution will + not be automatically updated when the histogram changes. + + Histogram instance + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative returns false, + if the sum of parameters is 0.0, or if the number of trials is negative; otherwise true. + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + When the parameters don't pass the function. + + + + Computes values of the probability mass function. + + Non-negative integers x1, ..., xk + The probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Computes values of the log probability mass function. + + Non-negative integers x1, ..., xk + The log probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Samples one multinomial distributed random variable. + + the counts for each of the different possible values. + + + + Samples a sequence multinomially distributed random variables. + + a sequence of counts for each of the different possible values. + + + + Samples one multinomial distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + the counts for each of the different possible values. + + + + Samples a multinomially distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of variables needed. + a sequence of counts for each of the different possible values. + + + + Gets or sets the proportion of ratios. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + + + Naive generic DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Corresponding frequency-space vector. + + + + Naive forward DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Hartley Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DHT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Hartley Transform Convention Options. + Corresponding time-space vector. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Hartley Transform Convention + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling. + + + + + Globalized String Handling Helpers + + + + + Tries to get a from the format provider, + returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format + provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Globalized Parsing: Tokenize a node by splitting it into several nodes. + + Node that contains the trimmed string to be tokenized. + List of keywords to tokenize by. + keywords to skip looking for (because they've already been handled). + + + + Globalized Parsing: Parse a double number + + First token of the number. + Culture Info. + The parsed double number using the given culture information. + + + + + Globalized Parsing: Parse a float number + + First token of the number. + Culture Info. + The parsed float number using the given culture information. + + + + + Barycentric Polynomial Interpolation where the given sample points are equidistant. + + + This algorithm neither supports differentiation nor integration. + + + + + Interpolation within the range of a discrete set of known data points. + + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t is equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sampls in the interval [leftBound,rightBound]. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Count of Sample Values x(t). + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + + + Extract the exponent sign to be used in forward transforms according to the + provided convention options. + + Fourier Transform Convention Options. + Fourier series exponent sign. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Generate the bluestein sequence for the provided problem size. + + Number of samples. + Bluestein sequence exp(I*Pi*k^2/N) + + + + Convolution with the bluestein sequence (Parallel Version). + + Sample Vector. + + + + Swap the real and imaginary parts of each sample. + + Sample Vector. + + + + Bluestein generic FFT for arbitrary sized sample vectors. + + Time-space sample vector. + Fourier series exponent sign. + + + + Bluestein forward FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Bluestein inverse FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Naive generic DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier series exponent sign. + Corresponding frequency-space vector. + + + + Naive forward DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DFT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Fourier Transform Convention Options. + Corresponding time-space vector. + + + + Radix-2 Reorder Helper Method + + Sample type + Sample vector + + + + Radix-2 Step Helper Method + + Sample vector. + Fourier series exponent sign. + Level Group Size. + Index inside of the level. + + + + Radix-2 generic FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 generic FFT for power-of-two sample vectors (Parallel Version). + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 forward FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Radix-2 inverse FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Integral Transforms (including FFT). + + + + + Shared internal DET algorithm. + + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Fourier Transform Convention + + + + + Inverse integrand exponent (forward: positive sign; inverse: negative sign). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling and common exponent (used in Maple). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction (used in Matlab). [= AsymmetricScaling] + + + + + Inverse integrand exponent; No scaling at all (used in all Numerical Recipes based implementations). [= InverseExponent | NoScaling] + + + + + Analytic integration algorithm for smooth functions with no discontinuities + or derivative discontinuities and no poles inside the interval. + + + + + Maximum number of iterations, until the asked + maximum error is (likely to be) satisfied. + + + + + Precomputed abscissa vector per level. + + + + + Precomputed weight vector per level. + + + + + Abscissa vector per level provider. + + + + + Weight vector per level provider. + + + + + Approximate the integral by the double exponential transformation + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Abscissa vector per level provider. + + Level Enumerator. + + + + Weight vector per level provider. + + Level Enumerator. + + + + Compute the abscissa vector for a single level. + + The level to evaluate the abscissa vector for. + Abscissa Vector. + + + + Compute the weight vector for a single level. + + The level to evaluate the weight vector for. + Weight Vector. + + + + Approximation algorithm for definite integrals by Simpson's rule. + + + + + Direct 3-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Even number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Approximation algorithm for definite integrals by the Trapezium rule of the Newton-Cotes family. + + + Wikipedia - Trapezium Rule + + + + + Direct 2-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Abscissa vector per level provider. + Weight vector per level provider. + First Level Step + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Numeric Integration (Quadrature). + + + + + Shared internal DET algorithm. + + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Akima Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Three-Point Differentiation Helper. + + Sample Points t. + Sample Values x(t). + Index of the point of the differentiation. + Index of the first sample. + Index of the second sample. + Index of the third sample. + The derivative approximation. + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Interpolation Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Sample Points t. + + + + + Sample Values x(t). + + + + + Barycentric Weights w(t). + + + + + Initializes a new instance of the BarycentricInterpolation class. + + + + + Initializes a new instance of the BarycentricInterpolation class. + + Sample Points t (no sorting assumed) + Sample Values x(t) + Barycentric weights w(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + Barycentric weights w(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Rational Interpolation (with poles) using Roland Bulirsch and Josef Stoer's Algorithm. + + + + This algorithm supports neither differentiation nor integration. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Spline Interpolation Algorithm with continuous first and second derivatives. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Coefficient Vector + + + + Tridiagonal Solve Helper. + + The a-vector[n]. + The b-vector[n], will be modified by this function. + The c-vector[n]. + The d-vector[n], will be modified by this function. + The x-vector[n] + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Hermite Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Rational Interpolation without poles, using Mike Floater and Kai Hormann's Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Initialize the interpolation method with the given sample set. + + + The interpolation scheme order will be set to 3. + + Sample Points t (no sorting assumed) + Sample Values x(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Linear Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Lagrange Polynomial Interpolation using Neville's Algorithm. + + + + This algorithm supports differentiation, but doesn't support integration. + + + When working with equidistant or Chebyshev sample points it is + recommended to use the barycentric algorithms specialized for + these cases instead of this arbitrary Neville algorithm. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Third-Degree Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Sample Points t. + + + + + Spline Coefficients c(t). + + + + + Number of samples. + + + + + Initializes a new instance of the SplineInterpolation class. + + + + + Initializes a new instance of the SplineInterpolation class. + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Find the index of the greatest sample point smaller than t. + + The value to look for. + The sample point index. + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Interpolation Factory. + + + + + Creates an interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a linear spline interpolation based on arbitrary points (sorted ascending). + + The sample points t, sorted ascending. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a floater hormann rational pole-free interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a burlish stoer rational interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Left and right boundary conditions. + + + + + Natural Boundary (Zero second derivative). + + + + + Parabolically Terminated boundary. + + + + + Fixed first derivative at the boundary. + + + + + Fixed second derivative at the boundary. + + + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + + + Returns the greatest common divisor (gcd) of two big integers. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two big integers. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Find out whether the provided 32 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 64 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 32 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 64 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 32 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find out whether the provided 64 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find the closest perfect power of two that is larger or equal to the provided + 32 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Find the closest perfect power of two that is larger or equal to the provided + 64 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 31). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 63). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Find out whether the provided 32 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Find out whether the provided 64 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Returns the greatest common divisor (gcd) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's + algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Utilities for working with floating point numbers. + + + + Useful links: + + + http://docs.sun.com/source/806-3568/ncg_goldberg.html#689 - What every computer scientist should know about floating-point arithmetic + + + http://en.wikipedia.org/wiki/Machine_epsilon - Gives the definition of machine epsilon + + + + + + + + The base number for binary values + + + + + The number of binary digits used to represent the binary number for a double precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The number of binary digits used to represent the binary number for a single precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The maximum relative precision of a double + + + + + The maximum relative precision of a single + + + + + The number of significant figures that a double-precision floating point has. + + + + + The number of significant figures that a single-precision floating point has. + + + + Value representing 10 * 2^(-52) + + + Value representing 10 * 2^(-52) + + + + Initializes static members of the Precision class. + + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the number divided by it's magnitude, effectively returning a number between -10 and 10. + + The value. + The value of the number. + + + + Gets the equivalent long value for the given double value. + + The double value which should be turned into a long value. + + The resulting long value. + + + + + Returns a 'directional' long value. This is a long value which acts the same as a double, + e.g. a negative double value will return a negative double value starting at 0 and going + more negative as the double value gets more negative. + + The input double value. + A long value which is roughly the equivalent of the double value. + + + + Returns a 'directional' int value. This is a int value which acts the same as a float, + e.g. a negative float value will return a negative int value starting at 0 and going + more negative as the float value gets more negative. + + The input float value. + An int value which is roughly the equivalent of the double value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + How many times the number should be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + How many times the number should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The absolute threshold for to consider it as zero. + Zero if || is smaller than , otherwise. + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero. + + The real number to coerce to zero, if it is almost zero. + Zero if || is smaller than 2^(-53) = 1.11e-16, otherwise. + + + + Determines the range of floating point numbers that will match the specified value with the given tolerance. + + The value. + The ulps difference. + The bottom range end. + The top range end. + + Thrown if is smaller than zero. + + + + + Returns the floating point number that will match the value with the tolerance on the maximum size (i.e. the result is + always bigger than the value) + + The value. + The ulps difference. + The maximum floating point number which is larger than the given . + + + + Returns the floating point number that will match the value with the tolerance on the minimum size (i.e. the result is + always smaller than the value) + + The value. + The ulps difference. + The minimum floating point number which is smaller than the given . + + + + Determines the range of ulps that will match the specified value with the given tolerance. + + The value. + The relative difference. + The number of ULPS between the value and the value - relativeDifference. + The number of ULPS between the value and the value + relativeDifference. + + Thrown if is smaller than zero. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Evaluates the count of numbers between two double numbers + + The first parameter. + The second parameter. + The second number is included in the number, thus two equal numbers evaluate to zero and two neighbor numbers evaluate to one. Therefore, what is returned is actually the count of numbers between plus 1. + The number of floating point values between and . + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two structures with precision support are almost equal. + + The type of the structures. Must implement . + The first structure + The second structure + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both doubles are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two structure with precision support and determines if they are equal + within the specified maximum relative error. + + + The type of the structures. Must implement . + + The first structure. + The second structure. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two lists of structures with precision support and determines if they + are equal within the specified maximum error. + + + The type of the structures. Must implement . + + The first structure list. + The second structure list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum absolute error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The absolute accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum absolute error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum relative error. + + The first value. + The second value. + The difference of the two values (according to some norm). + + The relative accuracy required for being + almost equal. + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + + + Determines the 'number' of floating point numbers between two values (i.e. the number of discrete steps + between the two numbers) and then checks if that is within the specified tolerance. So if a tolerance + of 1 is passed then the result will be true only if the two numbers have the same binary representation + OR if they are two adjacent numbers that only differ by one step. + + + The comparison method used is explained in http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm . The article + at http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx explains how to transform the C code to + .NET enabled code without using pointers and unsafe code. + + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both doubles are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two floats and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both floats are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two doubles and determines if the first value is larger than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is larger than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The maximum error in terms of Units in Last Place (ulps), i.e. the maximum number of decimals that may be different. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than the tolerance. + + + 0 + is equal to within the tolerance. + + + 1 + is bigger than by more than the tolerance. + + + + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The number of decimal places on which the values must be compared. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than a magnitude equal to . + + + 0 + is equal to within a magnitude equal to . + + + 1 + is bigger than by more than a magnitude equal to . + + + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + + Relative Epsilon (positive double or NaN). + + Evaluates the negative epsilon. The more common positive epsilon is equal to two times this negative epsilon. + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + Relative Epsilon (positive double or NaN) + Evaluates the positive epsilon. See also + + + + + Converts a float valut to a bit array stored in an int. + + The value to convert. + The bit array. + + + + Gets the maximum relative precision of a double. + + The maximum relative precision of a double. + + + + Gets the maximum relative precision of a single. + + The maximum relative precision of a single. + + + + Gets the number of decimal places for floats. + + The number of decimal places for floats. + + + + Gets the number of decimal places for doubles. + + The number of decimal places for doubles. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The array arguments must have the same length.. + + + + + Looks up a localized string similar to The given array is the wrong length. Should be {0}.. + + + + + Looks up a localized string similar to The argument must be between 0 and 1.. + + + + + Looks up a localized string similar to Value cannot be in the range -1 < x < 1.. + + + + + Looks up a localized string similar to Value must be even.. + + + + + Looks up a localized string similar to The histogram does not contains the value.. + + + + + Looks up a localized string similar to Value is expected to be between {0} and {1} (including {0} and {1}).. + + + + + Looks up a localized string similar to At least one item of {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be greater than or equal to one.. + + + + + Looks up a localized string similar to han the given upper bound.. + + + + + Looks up a localized string similar to Matrix dimensions must agree.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: {0}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}, op3 is {2}.. + + + + + Looks up a localized string similar to The requested matrix does not exist.. + + + + + Looks up a localized string similar to The matrix indices must not be out of range of the given matrix.. + + + + + Looks up a localized string similar to Matrix must not be rank deficient.. + + + + + Looks up a localized string similar to Matrix must not be singular.. + + + + + Looks up a localized string similar to Matrix must be positive definite.. + + + + + Looks up a localized string similar to Matrix column dimensions must agree.. + + + + + Looks up a localized string similar to Matrix row dimensions must agree.. + + + + + Looks up a localized string similar to Matrix must have exactly one column.. + + + + + Looks up a localized string similar to Matrix must have exactly one column and row, thus have only one cell.. + + + + + Looks up a localized string similar to Matrix must have exactly one row.. + + + + + Looks up a localized string similar to Matrix must be square.. + + + + + Looks up a localized string similar to Matrix must be symmetric.. + + + + + Looks up a localized string similar to Matrix must be symmetric positive definite.. + + + + + Looks up a localized string similar to In the specified range, the minimum is greater than maximum.. + + + + + Looks up a localized string similar to Value must be positive.. + + + + + Looks up a localized string similar to Value must neither be infinite nor NaN.. + + + + + Looks up a localized string similar to Value must not be negative (zero is ok).. + + + + + Looks up a localized string similar to {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be odd.. + + + + + Looks up a localized string similar to {0} must be greater than {1}.. + + + + + Looks up a localized string similar to {0} must be greater than or equal to {1}.. + + + + + Looks up a localized string similar to The chosen parameter set is invalid (probably some value is out of range).. + + + + + Looks up a localized string similar to The given expression does not represent a complex number.. + + + + + Looks up a localized string similar to Value must be positive (and not zero).. + + + + + Looks up a localized string similar to Size must be a Power of Two.. + + + + + Looks up a localized string similar to Size must be a Power of Two in every dimension.. + + + + + Looks up a localized string similar to The range between {0} and {1} must be less than or equal to {2}.. + + + + + Looks up a localized string similar to Arguments must be different objects.. + + + + + Looks up a localized string similar to Array must have exactly one dimension (and not be null).. + + + + + Looks up a localized string similar to Value is too large.. + + + + + Looks up a localized string similar to Value is too large for the current iteration limit.. + + + + + Looks up a localized string similar to Type mismatch.. + + + + + Looks up a localized string similar to Array length must be a multiple of {0}.. + + + + + Looks up a localized string similar to All vectors must have the same dimensionality.. + + + + + Looks up a localized string similar to The vector must have 3 dimensions.. + + + + + Looks up a localized string similar to The given array is too small. It must be at least {0} long.. + + + + + Looks up a localized string similar to Big endian files are not supported.. + + + + + Looks up a localized string similar to The supplied collection is empty.. + + + + + Looks up a localized string similar to Complex matrices are not supported.. + + + + + Looks up a localized string similar to An algorithm failed to converge.. + + + + + Looks up a localized string similar to This feature is not implemented yet (but is planned).. + + + + + Looks up a localized string similar to The given file doesn't exist.. + + + + + Looks up a localized string similar to Sample points should be sorted in strictly ascending order. + + + + + Looks up a localized string similar to All sample points should be unique.. + + + + + Looks up a localized string similar to Invalid parameterization for the distribution.. + + + + + Looks up a localized string similar to Invalid Left Boundary Condition.. + + + + + Looks up a localized string similar to The operation could not be performed because the accumulator is empty.. + + + + + Looks up a localized string similar to The operation could not be performed because the histogram is empty.. + + + + + Looks up a localized string similar to Not enough points in the distribution.. + + + + + Looks up a localized string similar to No Samples Provided. Preparation Required.. + + + + + Looks up a localized string similar to Invalid Right Boundary Condition.. + + + + + Looks up a localized string similar to ddd MMM dd HH:mm:ss yyyy. + + + + + Looks up a localized string similar to The number of columns of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows or columns of a matrix must be positive.. + + + + + Looks up a localized string similar to Only 1 and 2 dimensional arrays are supported.. + + + + + Looks up a localized string similar to Data must contain at least {0} values.. + + + + + Looks up a localized string similar to Name cannot contain a space. name: {0}. + + + + + Looks up a localized string similar to {0} is not a supported type.. + + + + + Looks up a localized string similar to The two arguments can't be compared (maybe they are part of a partial ordering?). + + + + + Looks up a localized string similar to The integer array does not represent a valid permutation.. + + + + + Looks up a localized string similar to The sampler's proposal distribution is not upper bounding the target density.. + + + + + Looks up a localized string similar to The number of rows must greater than or equal to the number of columns.. + + + + + Looks up a localized string similar to The singular vectors were not computed.. + + + + + Looks up a localized string similar to This special case is not supported yet (but is planned).. + + + + + Looks up a localized string similar to The given stop criterium already exist in the collection.. + + + + + Looks up a localized string similar to There is no stop criterium in the collection.. + + + + + Looks up a localized string similar to String parameter cannot be empty or null.. + + + + + Looks up a localized string similar to We only support sparse matrix with less than int.MaxValue elements.. + + + + + Looks up a localized string similar to The moment of the distribution is undefined.. + + + + + Looks up a localized string similar to A user defined provider has not been specified.. + + + + + Looks up a localized string similar to The given work array is too small. Check work[0] for the corret size.. + + + + + Abstract class for random number generators. This class introduces a layer between + and the Math.Net Numerics random number generators to provide thread safety. + + + + + The method that actually generates samples. + + + + + The object that will be locked for thread safety. + + + + + Initializes a new instance of the class using + the value of to set whether + the instance is thread safe or not. + + + + + Initializes a new instance of the class. + + if set to true , the class is thread safe. + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns an array of uniformly distributed random doubles in the interval [0.0,1.0]. + + The size of the array. + + An array of uniformly distributed random doubles in the interval [0.0,1.0]. + + if n is not greater than 0. + + + + Returns a nonnegative random number. + + + A 32-bit signed integer greater than or equal to zero and less than . + + + + + Returns a random number less then a specified maximum. + + The exclusive upper bound of the random number returned. + A 32-bit signed integer less than . + is negative. + + + + Returns a random number within a specified range. + + The inclusive lower bound of the random number returned. + The exclusive upper bound of the random number returned. must be greater than or equal to . + + A 32-bit signed integer greater than or equal to and less than ; that is, the range of return values includes but not . If equals , is returned. + + is greater than . + + + + Fills the elements of a specified array of bytes with random numbers. + + An array of bytes to contain random numbers. + is null. + + + + Returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + Thread safe version of which returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0 + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + A delegate type that represents a method that generates random numbers. + + Randomly distributed numbers. + + + + Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Random number generator using Mersenne Twister 19937 algorithm. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + Uses the value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + A 32-bit combined multiple recursive generator with 2 components of order 3. + + Based off of P. L'Ecuyer, "Combined Multiple Recursive Random Number Generators," Operations Research, 44, 5 (1996), 816--822. + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Represents a Parallel Additive Lagged Fibonacci pseudo-random number generator. + + + The type bases upon the implementation in the + Boost Random Number Library. + It uses the modulus 232 and by default the "lags" 418 and 1279. Some popular pairs are presented on + Wikipedia - Lagged Fibonacci generator. + + + + + Default value for the ShortLag + + + + + Default value for the LongLag + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The ShortLag value + TheLongLag value + + + + Stores an array of random numbers + + + + + Stores an index for the random number array element that will be accessed next. + + + + + Fills the array with new unsigned random numbers. + + + Generated random numbers are 32-bit unsigned integers greater than or equal to 0 + and less than or equal to . + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Gets the short lag of the Lagged Fibonacci pseudo-random number generator. + + + + + Gets the long lag of the Lagged Fibonacci pseudo-random number generator. + + + + + A random number generator based on the class in the .NET library. + + + + + Construct a new random number generator with a random seed. + + Uses and uses the value of + to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + Uses the value of to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + Uses + if set to true , the class is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + This class implements extension methods for the System.Random class. The extension methods generate + pseudo-random distributed numbers for types other than double and int32. + + + + + Returns a nonnegative random number less than . + + + The random object to extend. + + + A 64-bit signed integer greater than or equal to 0, and less than ; that is, + the range of return values includes 0 but not . + + + + + + Returns a random number of the full Int32 range. + + + The random object to extend. + + + A 32-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a random number of the full Int64 range. + + + The random object to extend. + + + A 64-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a nonnegative decimal floating point random number less than 1.0. + + + The random object to extend. + + + A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, + the range of return values includes 0.0 but not 1.0. + + + + + Wichmann-Hill’s 1982 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (1982), "Algorithm AS 183: + An efficient and portable pseudo-random number generator". Applied Statistics 31 (1982) 188-190 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Wichmann-Hill’s 2006 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (2006), "Generating good pseudo-random numbers". + Computational Statistics & Data Analysis 51:3 (2006) 1614-1622 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Implements a multiply-with-carry Xorshift pseudo random number generator (RNG) specified in Marsaglia, George. (2003). Xorshift RNGs. + Xn = a * Xn−3 + c mod 2^32 + http://www.jstatsoft.org/v08/i14/paper + + + + + The default value for X1. + + + + + The default value for X2. + + + + + The default value for the multiplier. + + + + + The default value for the carry over. + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Note: must be less than . + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Seed or last but three unsigned random number. + + + + + Last but two unsigned random number. + + + + + Last but one unsigned random number. + + + + + The value of the carry over. + + + + + The multiplier. + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a two-domain function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function at the roots of the Chebyshev polynomial of the first kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*(2i-1)/(2n)) + + + + + + Samples a function at the roots of the Chebyshev polynomial of the second kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*i/(n-1)) + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant continuously starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated sample enumerator. + + + + + Samples a function equidistant with the provided start and step length to an integer-domain function + + The real-domain function to sample. + The real domain location where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated samples integer-domain function. + + + + + Sorting algorithms for single, tuple and triple lists. + + + + + Sort a list of keys, in place using the quick sort algorithm. + + The type of elements stored in the list. + List to sort. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the item list. + List to sort. + List to permute the same way as the key list. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the first item list. + The type of elements stored in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + + + + Sort a list of keys, in place using the quick sort algorithm using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + Comparison, defining the sort order. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the item list. + List to sort. + List to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the first item list. + The type of elements in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of element in the list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + Comparison, defining the sort order. + + + + Recursive implementation for an in place quick sort on a list. + + The type of the list on which the quick sort is performed. + The list which is sorted using quick sort. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on a list while reordering one other list accordingly. + + The type of the list on which the quick sort is performed. + The type of the list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on one list while reordering two other lists accordingly. + + The type of the list on which the quick sort is performed. + The type of the first list which is automatically reordered accordingly. + The type of the second list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The first list which is automatically reordered accordingly. + The second list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Performs an in place swap of two elements in a list. + + The type of elements stored in the list. + The list in which the elements are stored. + The index of the first element of the swap. + The index of the second element of the swap. + + + + A class with correlation measures between two datasets. + + + + + Computes the Pearson product-moment correlation coefficient. + + Sample data A. + Sample data B. + The Pearson product-moment correlation coefficient. + + + + Computes the basic statistics of data set. The class meets the + NIST standard of accuracy for mean, variance, and standard deviation + (the only statistics they provide exact values for) and exceeds them + in increased accuracy mode. + + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Computes descriptive statistics from a stream of data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of data values using high accuracy. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values using high accuracy. + + A sequence of datapoints. + + + + Internal use. Method use for setting the statistics. + + For setting Mean. + For setting Variance. + For setting Skewness. + For setting Kurtosis. + For setting Minimum. + For setting Maximum. + For setting Count. + + + + Gets the size of the sample. + + The size of the sample. + + + + Gets the sample mean. + + The sample mean. + + + + Gets the unbiased population variance estimator (on a dataset of size N will use an N-1 normalizer). + + The sample variance. + + + + Gets the unbiased population standard deviation (on a dataset of size N will use an N-1 normalizer). + + The sample standard deviation. + + + + Gets the sample skewness. + + The sample skewness. + Returns zero if is less than three. + + + + Gets the sample median. + + The sample median. + + + + Gets the sample kurtosis. + + The sample kurtosis. + Returns zero if is less than four. + + + + Gets the maximum sample value. + + The maximum sample value. + + + + Gets the minimum sample value. + + The minimum sample value. + + + + A consists of a series of s, + each representing a region limited by a lower bound (exclusive) and an upper bound (inclusive). + + + + + Initializes a new instance of the Bucket class. + + + + + Initializes a new instance of the Bucket class. + + + + + Creates a copy of the Bucket with the lowerbound, upperbound and counts exactly equal. + + A cloned Bucket object. + + + + This method check whether a point is contained within this bucket. + + The point to check. + 0 if the point falls within the bucket boundaries; -1 if the point is + smaller than the bucket, +1 if the point is larger than the bucket. + + + + Comparison of two disjoint buckets. The buckets cannot be overlapping. + + + + + Checks whether two Buckets are equal; this method tolerates a difference in lowerbound, upperbound + and count given by . + + + + + Provides a hash code for this bucket. + + + + + Formats a human-readable string for this bucket. + + + + + + Lower Bound of the Bucket. + + + + + Upper Bound of the Bucket. + + + + + The number of datapoints in the bucket. + + + + + Width of the Bucket. + + + + + Default comparer. + + + + + This IComparer performs comparisons between a point and a bucket. + + + + + Compares a point and a bucket. The point will be encapsulated in a bucket with width 0. + + The first bucket to compare. + The second bucket to compare. + -1 when the point is less than this bucket, 0 when it is in this bucket and 1 otherwise. + + + + A class which computes histograms of data. + + + + + Contains all the Buckets of the Histogram. + + + + + Indicates whether the elements of buckets are currently sorted. + + + + + Initializes a new instance of the Histogram class. + + + + + Constructs a Histogram with a specific number of equally sized buckets. The upper and lower bound of the histogram + will be set to the smallest and largest datapoint. + + The datasequence to build a histogram on. + The number of buckets to use. + + + + Constructs a Histogram with a specific number of equally sized buckets. + + The datasequence to build a histogram on. + The number of buckets to use. + The histogram lower bound. + The histogram upper bound. + + + + Add one data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The datapoint which we want to add. + + + + Add a sequence of data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The sequence of datapoints which we want to add. + + + + Adds a Bucket to the Histogram. + + + + + Sort the buckets if needed. + + + + + Returns the Bucket that contains the value v. + + The point to search the bucket for. + A copy of the bucket containing point . + + + + Returns the index in the Histogram of the Bucket + that contains the value v. + + The point to search the bucket index for. + The index of the bucket containing the point. + + + + Prints the buckets contained in the . + + + + + Returns the lower bound of the histogram. + + + + + Returns the upper bound of the histogram. + + + + + Gets the n'th bucket. + + The index of the bucket to be returned. + A copy of the n'th bucket. + + + + Gets the number of buckets. + + + + + Gets the total number of datapoints in the histogram. + + + + + A hybrid Monte Carlo sampler for multivariate distributions. + + + + + The Hybrid (also called Hamiltonian) Monte Carlo produces samples from distribition P using a set + of Hamiltonian equations to guide the sampling process. It uses the negative of the log density as + a potential energy, and a randomly generated momentum to set up a Hamiltonian system, which is then used + to sample the distribution. This can result in a faster convergence than the random walk Metropolis sampler + (). + + The type of samples this sampler produces. + + + + The interface which every sampler must implement. + + The type of samples this sampler produces. + + + + The random number generator for this class. + + + + + Keeps track of the number of accepted samples. + + + + + Keeps track of the number of calls to the proposal sampler. + + + + + Initializes a new instance of the class. + + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns one sample. + + + + + Returns a number of samples. + + The number of samples we want. + An array of samples. + + + + Gets or sets the random number generator. + + When the random number generator is null. + + + + Gets the acceptance rate of the sampler. + + + + + Evaluates the energy function of the target distribution. + + + + + The current location of the sampler. + + + + + The number of burn iterations between two samples. + + + + + The size of each step in the Hamiltonian equation. + + + + + The number of iterations in the Hamiltonian equation. + + + + + The algorithm used for differentiation. + + + + + Constructs a new Hybrid Monte Carlo sampler. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + Random number generator used for sampling the momentum. + The method used for differentiation. + When the number of burnInterval iteration is negative. + When either x0, pdfLnP or diff is null. + + + + Returns a sample from the distribution P. + + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Method used to update the sample location. Used in the end of the loop. + + The old energy. + The old gradient/derivative of the energy. + The new sample. + The new gradient/derivative of the energy. + The new energy. + The difference between the old Hamiltonian and new Hamiltonian. Use to determine + if an update should take place. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Method for doing dot product. + + First vector/scalar in the product. + Second vector/scalar in the product. + + + + + Method for adding, multiply the second vector/scalar by factor and then + add it to the first vector/scalar. + + First vector/scalar. + Scalar factor multiplying by the second vector/scalar. + Second vector/scalar. + + + + Multiplying the second vector/scalar by factor and then subtract it from + the first vector/scalar. + + First vector/scalar. + Scalar factor to be multiplied to the second vector/scalar. + Second vector/scalar. + + + + Method for sampling a random momentum. + + Momentum to be randomized. + + + + The Hamiltonian equations that is used to produce the new sample. + + + + + Method to compute the Hamiltonian used in the method. + + The momentum. + The energy. + Hamiltonian=E+p.p/2 + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than or equal to zero. + Throws when value is negative. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than to zero. + Throws when value is negative or zero. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than zero. + Throws when value is negative or zero. + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the number of iterations in the Hamiltonian equation. + + When frogleap steps is negative or zero. + + + + Gets or sets the size of each step in the Hamiltonian equation. + + When step size is negative or zero. + + + + The delegate type that defines a derivative evaluated at a certain point. + + Function to be differentiated. + Value where the derivative is computed. + + + + + Number of parameters in the density function. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of different components of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The burn interval will be set to 0. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the a random number generator provided by the user. + A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviations + given by pSdv. This constructor will set the burn interval, the method used for + numerical differentiation and the random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + The method used for numerical differentiation. + When the number of burnInterval iteration is negative. + When the length of pSdv is not the same as x0. + + + + Initialize parameters. + + The current location of the sampler. + + + + Checking that the location and the momentum are of the same dimension and that each component is positive. + + The standard deviations used for sampling the momentum. + When the length of pSdv is not the same as Length or if any + component is negative. + When pSdv is null. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the gradient. Uses a simple three point estimation. + + Function which the gradient is to be evaluated. + The location where the gradient is to be evaluated. + The gradient of the function at the point x. + + + + Gets or sets the standard deviations used in the sampling of different components of the + momentum. + + When the length of pSdv is not the same as Length. + + + + Provides utilities to analysis the convergence of a set of samples from + a . + + + + + Computes the auto correlations of a series evaluated by a function f. + + The series for computing the auto correlation. + The lag in the series + The function used to evaluate the series. + The auto correlation. + Throws if lag is zero or if lag is + greater than or equal to the length of Series. + + + + Computes the effective size of the sample when evaluated by a function f. + + The samples. + The function use for evaluating the series. + The effective size when auto correlation is taken into account. + + + + A method which samples datapoints from a proposal distribution. The implementation of this sampler + is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it doesn't take any parameters; it samples random + variables from the whole domain. + + The type of the datapoints. + A sample from the proposal distribution. + + + + A method which samples datapoints from a proposal distribution given an initial sample. The implementation + of this sampler is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it samples locally around an initial point. In other words, it + makes a small local move rather than producing a global sample from the proposal. + + The type of the datapoints. + The initial sample. + A sample from the proposal distribution. + + + + A function which evaluates a density. + + The type of data the distribution is over. + The sample we want to evaluate the density for. + + + + A function which evaluates a log density. + + The type of data the distribution is over. + The sample we want to evaluate the log density for. + + + + A function which evaluates the log of a transition kernel probability. + + The type for the space over which this transition kernel is defined. + The new state in the transition. + The previous state in the transition. + The log probability of the transition. + + + + Metropolis-Hastings sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis-Hastings sampling doesn't require that the + proposal distribution Q is symmetric in comparison to . It does need to + be able to evaluate the proposal sampler's log density though. All densities are required to be in log space. + + The Metropolis-Hastings sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the target distribution. + + + + + Evaluates the log transition probability for the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis-Hastings sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + + + + Constructs a new Metropolis-Hastings sampler using the default random number generator. This + constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Metropolis sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis sampling requires that the proposal + distribution Q is symmetric. All densities are required to be in log space. + + The Metropolis sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the sampling distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis sampler using the default random + number generator. The burnInterval interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + + + + Constructs a new Metropolis sampler using the default random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Rejection sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P and Q. The density of P and Q don't need to + to be normalized, but we do need that for each x, P(x) < Q(x). + + The type of samples this sampler produces. + + + + Evaluates the density function of the sampling distribution. + + + + + Evaluates the density function of the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + Constructs a new rejection sampler using the default random number generator. + + The density of the distribution we want to sample from. + The density of the proposal distribution. + A method that samples from the proposal distribution. + + + + Returns a sample from the distribution P. + + When the algorithms detects that the proposal + distribution doesn't upper bound the target distribution. + + + + A hybrid Monte Carlo sampler for univariate distributions. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The burn interval will be set to 0. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using a random + number generator provided by the user. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + Random number generator used to sample the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + given by pSdv using a random + number generator provided by the user. This constructor will set both the burn interval and the method used for + numerical differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + The method used for numerical differentiation. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the derivative. Uses a simple three point estimation. + + Function for which the derivative is to be evaluated. + The location where the derivative is to be evaluated. + The derivative of the function at the point x. + + + + Gets or sets the standard deviation used in the sampling of the + momentum. + + When standard deviation is negative. + + + + Methods to calculate the percentiles. + + + + + Using the method recommened my NIST, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Using the nearest rank, http://en.wikipedia.org/wiki/Percentile#Nearest_Rank + + + + + Using the same method as Excel does, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Use linear interpolation between the two nearest ranks, + http://en.wikipedia.org/wiki/Percentile#Linear_Interpolation_Between_Closest_Ranks + + + + + Class to calculate percentiles. + + + + + Holds the data. + + + + + Initializes a new instance of the class. + + The data to calculate the percentiles of. + + + + Computes the percentile. + + The percentile, must be between 0.0 and 1.0 (inclusive). + the requested percentile. + + + + Computes the percentiles for the given list. + + The percentiles, must be between 0.0 and 1.0 (inclusive) + the values that correspond to the given percentiles. + + + + Gets or sets the method used to calculate the percentiles. + + The calculation method. + defaults to . + + + + Extension methods to return basic statistics on set of data. + + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The minimum value in the sample data. + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The minimum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The maximum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The maximum value in the sample data. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + + + + Slice sampling produces samples from distribition P by uniformly sampling from under the pdf of P using + a technique described in "Slice Sampling", R. Neal, 2003. All densities are required to be in log space. + + The slice sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + + + + Evaluates the log density function of the target distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + The scale of the slice sampler. + + + + + Constructs a new Slice sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The density of the distribution we want to sample from. + The scale factor of the slice sampler. + When the scale of the slice sampler is not positive. + + + + Constructs a new slice sampler using the default random number generator. It + will set the number of burnInterval iterations and run a burnInterval phase. + + The initial sample. + The density of the distribution we want to sample from. + The number of iterations in between returning samples. + The scale factor of the slice sampler. + When the number of burnInterval iteration is negative. + When the scale of the slice sampler is not positive. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the scale of the slice sampler. + + + + + Used to simplify parallel code, particularly between the .NET 4.0 and Silverlight Code. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The array to iterate over. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes each of the provided actions inside a discrete, asynchronous task. + + An array of actions to execute. + The actions array contains a null element. + At least one invocation of the actions threw an exception. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Double-precision trigonometry toolkit. + + + + + Constant to convert a degree to grad. + + + + + Trigonometric Cosecant of an angle in radian. + + + The angle in radian. + + + Cosecant of an angle in radian. + + + + + Trigonometric Cosecant of a Complex number. + + + The complex value. + + + The cosecant of a complex number. + + + + + Trigonometric Cosine of an angle in radian. + + + The angle in radian. + + + The cosine of an angle in radian. + + + + + Trigonometric Cosine of a Complex number. + + + The complex value. + + + The cosine of a complex number. + + + + + Trigonometric Cotangent of an angle in radian. + + + The angle in radian. + + + The cotangent of an angle in radian. + + + + + Trigonometric Cotangent of a Complex number. + + + The complex value. + + + The cotangent of the complex number. + + + + + Converts a degree (360-periodic) angle to a grad (400-periodic) angle. + + + The degree to convert. + + + The converted grad angle. + + + + + Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + + + The degree to convert. + + + The converted radian angle. + + + + + Converts a grad (400-periodic) angle to a degree (360-periodic) angle. + + + The grad to convert. + + + The converted degree. + + + + + Converts a grad (400-periodic) angle to a radian (2*Pi-periodic) angle. + + + The grad to convert. + + + The converted radian. + + + + + Trigonometric Hyperbolic Cosecant + + + The angle in radian. + + + The hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Cosecant of a Complex number. + + + The complex value. + + + The hyperbolic cosecant of a complex number. + + + + + Trigonometric Hyperbolic Cosine + + + The angle in radian. + + + The hyperbolic Cosine of the radian angle. + + + + + Trigonometric Hyperbolic Cosine of a Complex number. + + + The complex value. + + + The hyperbolic cosine of a complex number. + + + + + Trigonometric Hyperbolic Cotangent + + + The angle in radian angle. + + + The hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Cotangent of a Complex number. + + + The complex value. + + + The hyperbolic cotangent of a complex number. + + + + + Trigonometric Hyperbolic Secant + + + The angle in radian angle. + + + The hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Secant of a Complex number. + + + The complex value. + + + The hyperbolic secant of a complex number. + + + + + Trigonometric Hyperbolic Sine + + + The angle in radian angle. + + + The hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Sine of a Complex number. + + + The complex value. + + + The hyperbolic sine of a complex number. + + + + + Trigonometric Hyperbolic Tangent in radian + + + The angle in radian angle. + + + The hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Tangent of a Complex number. + + + The complex value. + + + The hyperbolic tangent of a complex number. + + + + + Trigonometric Arc Cosecant in radian + + + The angle in radian angle. + + + The inverse cosecant of the radian angle. + + + if -1 < < 1. + + + + + Trigonometric Arc Cosecant of this Complex number. + + + The complex value. + + + The arc cosecant of a complex number. + + + + + Trigonometric Arc Cosine in radian + + + The angle in radian angle. + + + The inverse cosine of the radian angle. + + + if 1 < or < -1. + + + + + Trigonometric Arc Cosine of this Complex number. + + + The complex value. + + + The arc cosine of a complex number. + + + + + Trigonometric Arc Cotangent in radian + + + The angle in radian angle. + + + The inverse cotangent of the radian angle. + + + + + Trigonometric Arc Cotangent of this Complex number. + + + The complex value. + + + The arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Arc Cosecant + + + The angle in radian angle. + + + The inverse hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosecant of this Complex number. + + + The complex value. + + + The hyperbolic arc cosecant of a complex number. + + + + + Trigonometric Hyperbolic Area Cosine + + + The angle in radian angle. + + + The inverse hyperbolic cosine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosine of this Complex number. + + + The complex value. + + + The hyperbolic arc cosine of a complex number. + + + + + Trigonometric Hyperbolic Arc Cotangent + + + The angle in radian angle. + + + The inverse hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cotangent of this Complex number. + + + The complex value. + + + The hyperbolic arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Area Secant + + + The angle in radian angle. + + + The inverse hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Secant of this Complex number. + + + The complex value. + + + The hyperbolic arc secant of a complex number. + + + + + Trigonometric Hyperbolic Area Sine + + + The angle in radian angle. + + + The inverse hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Sine of this Complex number. + + + The complex value. + + + The hyperbolic arc sine of a complex number. + + + + + Trigonometric Hyperbolic Area Tangent + + + The angle in radian angle. + + + The inverse hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Tangent of this Complex number. + + + The complex value. + + + The hyperbolic arc tangent of a complex number. + + + + + Trigonometric Arc Secant in radian + + + The angle in radian angle. + + + The inverse secant of the radian angle. + + + + + Trigonometric Arc Secant of this Complex number. + + + The complex value. + + + The arc secant of a complex number. + + + + + Trigonometric Arc Sine in radian + + + The angle in radian angle. + + + The inverse sine of the radian angle. + + + + + Trigonometric Arc Sine of this Complex number. + + + The complex value. + + + The arc sine of a complex number. + + + + + Trigonometric Arc Tangent in radian + + + The angle in radian angle. + + + The inverse tangent of the radian angle. + + + + + Trigonometric Arc Tangent of this Complex number. + + + The complex value. + + + The arc tangent of a complex number. + + + + + Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + + + The radian to convert. + + + The converted degree. + + + + + Converts a radian (2*Pi-periodic) angle to a grad (400-periodic) angle. + + + The radian to convert. + + + The converted grad. + + + + + Trigonometric Secant of an angle in radian + + + The angle in radian. + + + The secant of the radian angle. + + + + + Trigonometric Secant of a Complex number. + + + The complex value. + + + The secant of the complex number. + + + + + Trigonometric Sine of an angle in radian + + + The angle in radian. + + + The sine of the radian angle. + + + + + Trigonometric Sine of a Complex number. + + + The complex value. + + + The sine of the complex number. + + + + + Trigonometric Tangent of an angle in radian + + + The angle in radian. + + + The tangent of the radian angle. + + + + + Trigonometric Tangent of a Complex number. + + + The complex value. + + + The tangent of the complex number. + + + + + Implements the univariate Student t-distribution. For details about this + distribution, see + + Wikipedia - Student's t-distribution. + + We use a slightly generalized version (compared to + Wikipedia) of the Student t-distribution. Namely, one which also + parameterizes the location and scale. See the book "Bayesian Data + Analysis" by Gelman et al. for more details. + The density of the Student t-distribution p(x|mu,scale,dof) = + Gamma((dof+1)/2) (1 + (x - mu)^2 / (scale * scale * dof))^(-(dof+1)/2) / + (Gamma(dof/2)*Sqrt(dof*pi*scale)). + The distribution will use the by + default. Users can get/set the random number generator by using the + property. + The statistics classes will check all the incoming parameters + whether they are in the allowed range. This might involve heavy + computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the location of the Student t-distribution. + + + + + Keeps track of the degrees of freedom for the Student t-distribution. + + + + + Keeps track of the scale for the Student t-distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the StudentT class. This is a Student t-distribution with location 0.0 + scale 1.0 and degrees of freedom 1. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the StudentT class with a particular location, scale and degrees of + freedom. The distribution will + be initialized with the default random number generator. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + When the parameters don't pass the function. + + + + Computes the density of the Student t-distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Student t-distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Student t-distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples student-t distributed random variables. + + The algorithm is method 2 in section 5, chapter 9 + in L. Devroye's "Non-Uniform Random Variate Generation" + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the standard student-t distribution. + a random number from the standard student-t distribution. + + + + Generates a sample from the Student t-distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Student t-distribution. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution using the Box-Muller algorithm. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Student t-distribution. + + + + + Gets or sets the scale of the Student t-distribution. + + + + + Gets or sets the degrees of freedom of the Student t-distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Student t-distribution. + + + + + Gets the variance of the Student t-distribution. + + + + + Gets the standard deviation of the Student t-distribution. + + + + + Gets the entropy of the Student t-distribution. + + + + + Gets the skewness of the Student t-distribution. + + + + + Gets the mode of the Student t-distribution. + + + + + Gets the median of the Student t-distribution. + + + + + Gets the minimum of the Student t-distribution. + + + + + Gets the maximum of the Student t-distribution. + + + + + This structure represents the type over which the distribution + is defined. + + + + + The mean value. + + + + + The precision value. + + + + + Initializes a new instance of the struct. + + + The mean of the pair. + + + The precision of the pair. + + + + + Gets or sets the mean of the pair. + + + + + Gets or sets the precision of the pair. + + + + + The distribution is the conjugate prior distribution for the + distribution. It specifies a prior over the mean and precision of the distribution. + It is parameterized by four numbers: the mean location, the mean scale, the precision shape and the + precision inverse scale. + The distribution NG(mu, tau | mloc,mscale,psscale,pinvscale) = Normal(mu | mloc, 1/(mscale*tau)) * Gamma(tau | psscale,pinvscale). + The following degenerate cases are special: when the precision is known, + the precision shape will encode the value of the precision while the precision inverse scale is positive + infinity. When the mean is known, the mean location will encode the value of the mean while the scale + will be positive infinity. A completely degenerate NormalGamma distribution with known mean and precision is possible as well. + Wikipedia - Normal-Gamma distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The location of the mean. + + + + + The scale of the mean. + + + + + The shape of the precision. + + + + + The inverse scale of the precision. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The location of the mean. + + + The scale of the mean. + + + The shape of the precision. + + + The inverse scale of the precision. + + + + + Checks whether the parameters of the distribution are valid. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + When the parameters don't pass the function. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Returns the marginal distribution for the mean of the NormalGamma distribution. + + the marginal distribution for the mean of the NormalGamma distribution. + + + + Returns the marginal distribution for the precision of the distribution. + + The marginal distribution for the precision of the distribution/ + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + Density value + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + Density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + The log of the density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + The log of the density value + + + + Generates a sample from the NormalGamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + a sequence of samples from the distribution. + + + + Generates a sample from the NormalGamma distribution. + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sequence of samples from the distribution. + + + + Gets or sets the location of the mean. + + + + + Gets or sets the scale of the mean. + + + + + Gets or sets the shape of the precision. + + + + + Gets or sets the inverse scale of the precision. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the variance of the distribution. + + The mean of the distribution. + +
+
diff --git a/bin/x86/Debug/Microsoft.Ccr.Core.dll b/bin/x86/Debug/Microsoft.Ccr.Core.dll new file mode 100644 index 0000000..6d0a1c8 Binary files /dev/null and b/bin/x86/Debug/Microsoft.Ccr.Core.dll differ diff --git a/bin/x86/Debug/Microsoft.Msagl.Drawing.dll b/bin/x86/Debug/Microsoft.Msagl.Drawing.dll new file mode 100644 index 0000000..f0dc2cd Binary files /dev/null and b/bin/x86/Debug/Microsoft.Msagl.Drawing.dll differ diff --git a/bin/x86/Debug/Microsoft.Msagl.GraphViewerGDI.dll b/bin/x86/Debug/Microsoft.Msagl.GraphViewerGDI.dll new file mode 100644 index 0000000..e106a3c Binary files /dev/null and b/bin/x86/Debug/Microsoft.Msagl.GraphViewerGDI.dll differ diff --git a/bin/x86/Debug/Microsoft.Msagl.dll b/bin/x86/Debug/Microsoft.Msagl.dll new file mode 100644 index 0000000..c9bd6bc Binary files /dev/null and b/bin/x86/Debug/Microsoft.Msagl.dll differ diff --git a/bin/x86/Debug/Microsoft.Research.Science.Data.Slicer.dll b/bin/x86/Debug/Microsoft.Research.Science.Data.Slicer.dll new file mode 100644 index 0000000..759851e Binary files /dev/null and b/bin/x86/Debug/Microsoft.Research.Science.Data.Slicer.dll differ diff --git a/bin/x86/Debug/Microsoft.Research.Science.Data.dll b/bin/x86/Debug/Microsoft.Research.Science.Data.dll new file mode 100644 index 0000000..06a8f85 Binary files /dev/null and b/bin/x86/Debug/Microsoft.Research.Science.Data.dll differ diff --git a/bin/x86/Debug/Microsoft.VC90.CRT.manifest b/bin/x86/Debug/Microsoft.VC90.CRT.manifest new file mode 100644 index 0000000..bbd12cc --- /dev/null +++ b/bin/x86/Debug/Microsoft.VC90.CRT.manifest @@ -0,0 +1,6 @@ + + + + + +CXED+6HzJlSphyMNOn27ujadC0= MyKED+9DyS+1XcMeaC0Zlw2vFZ0= EeyDE7og6WoPd2oBhYbMEnpFHhY= + \ No newline at end of file diff --git a/bin/x86/Debug/R.NET.dll b/bin/x86/Debug/R.NET.dll new file mode 100644 index 0000000..74fb85c Binary files /dev/null and b/bin/x86/Debug/R.NET.dll differ diff --git a/bin/x86/Debug/SQLite.Designer.dll b/bin/x86/Debug/SQLite.Designer.dll new file mode 100644 index 0000000..2fae7f4 Binary files /dev/null and b/bin/x86/Debug/SQLite.Designer.dll differ diff --git a/bin/x86/Debug/SQLite.Interop.dll b/bin/x86/Debug/SQLite.Interop.dll new file mode 100644 index 0000000..6a7e29a Binary files /dev/null and b/bin/x86/Debug/SQLite.Interop.dll differ diff --git a/bin/x86/Debug/System.Data.SQLite.Linq.dll b/bin/x86/Debug/System.Data.SQLite.Linq.dll new file mode 100644 index 0000000..ea3dc7d Binary files /dev/null and b/bin/x86/Debug/System.Data.SQLite.Linq.dll differ diff --git a/bin/x86/Debug/System.Data.SQLite.dll b/bin/x86/Debug/System.Data.SQLite.dll new file mode 100644 index 0000000..fbf5a5e Binary files /dev/null and b/bin/x86/Debug/System.Data.SQLite.dll differ diff --git a/bin/x86/Debug/System.Reactive.dll b/bin/x86/Debug/System.Reactive.dll new file mode 100644 index 0000000..64ad590 Binary files /dev/null and b/bin/x86/Debug/System.Reactive.dll differ diff --git a/bin/x86/Debug/VPIC.dll b/bin/x86/Debug/VPIC.dll new file mode 100644 index 0000000..0b63d43 Binary files /dev/null and b/bin/x86/Debug/VPIC.dll differ diff --git a/bin/x86/Debug/msvcm90.dll b/bin/x86/Debug/msvcm90.dll new file mode 100644 index 0000000..6470ad0 Binary files /dev/null and b/bin/x86/Debug/msvcm90.dll differ diff --git a/bin/x86/Debug/msvcp90.dll b/bin/x86/Debug/msvcp90.dll new file mode 100644 index 0000000..354eed3 Binary files /dev/null and b/bin/x86/Debug/msvcp90.dll differ diff --git a/bin/x86/Debug/msvcr90.dll b/bin/x86/Debug/msvcr90.dll new file mode 100644 index 0000000..e2e6601 Binary files /dev/null and b/bin/x86/Debug/msvcr90.dll differ diff --git a/bin/x86/Debug/opencv_core231.dll b/bin/x86/Debug/opencv_core231.dll new file mode 100644 index 0000000..57b1f90 Binary files /dev/null and b/bin/x86/Debug/opencv_core231.dll differ diff --git a/bin/x86/Debug/opencv_imgproc231.dll b/bin/x86/Debug/opencv_imgproc231.dll new file mode 100644 index 0000000..7d91cb1 Binary files /dev/null and b/bin/x86/Debug/opencv_imgproc231.dll differ diff --git a/bin/x86/Debug/vtkCharts.dll b/bin/x86/Debug/vtkCharts.dll new file mode 100644 index 0000000..ae4c8bd Binary files /dev/null and b/bin/x86/Debug/vtkCharts.dll differ diff --git a/bin/x86/Debug/vtkCommon.dll b/bin/x86/Debug/vtkCommon.dll new file mode 100644 index 0000000..ec74886 Binary files /dev/null and b/bin/x86/Debug/vtkCommon.dll differ diff --git a/bin/x86/Debug/vtkDICOMParser.dll b/bin/x86/Debug/vtkDICOMParser.dll new file mode 100644 index 0000000..e267d62 Binary files /dev/null and b/bin/x86/Debug/vtkDICOMParser.dll differ diff --git a/bin/x86/Debug/vtkFiltering.dll b/bin/x86/Debug/vtkFiltering.dll new file mode 100644 index 0000000..8afab9b Binary files /dev/null and b/bin/x86/Debug/vtkFiltering.dll differ diff --git a/bin/x86/Debug/vtkGenericFiltering.dll b/bin/x86/Debug/vtkGenericFiltering.dll new file mode 100644 index 0000000..842f350 Binary files /dev/null and b/bin/x86/Debug/vtkGenericFiltering.dll differ diff --git a/bin/x86/Debug/vtkGeovis.dll b/bin/x86/Debug/vtkGeovis.dll new file mode 100644 index 0000000..6c16879 Binary files /dev/null and b/bin/x86/Debug/vtkGeovis.dll differ diff --git a/bin/x86/Debug/vtkGraphics.dll b/bin/x86/Debug/vtkGraphics.dll new file mode 100644 index 0000000..40591bd Binary files /dev/null and b/bin/x86/Debug/vtkGraphics.dll differ diff --git a/bin/x86/Debug/vtkHybrid.dll b/bin/x86/Debug/vtkHybrid.dll new file mode 100644 index 0000000..ee4c953 Binary files /dev/null and b/bin/x86/Debug/vtkHybrid.dll differ diff --git a/bin/x86/Debug/vtkIO.dll b/bin/x86/Debug/vtkIO.dll new file mode 100644 index 0000000..9eff926 Binary files /dev/null and b/bin/x86/Debug/vtkIO.dll differ diff --git a/bin/x86/Debug/vtkImaging.dll b/bin/x86/Debug/vtkImaging.dll new file mode 100644 index 0000000..ecf9e93 Binary files /dev/null and b/bin/x86/Debug/vtkImaging.dll differ diff --git a/bin/x86/Debug/vtkInfovis.dll b/bin/x86/Debug/vtkInfovis.dll new file mode 100644 index 0000000..ce21419 Binary files /dev/null and b/bin/x86/Debug/vtkInfovis.dll differ diff --git a/bin/x86/Debug/vtkNetCDF.dll b/bin/x86/Debug/vtkNetCDF.dll new file mode 100644 index 0000000..f84d06a Binary files /dev/null and b/bin/x86/Debug/vtkNetCDF.dll differ diff --git a/bin/x86/Debug/vtkNetCDF_cxx.dll b/bin/x86/Debug/vtkNetCDF_cxx.dll new file mode 100644 index 0000000..1c34864 Binary files /dev/null and b/bin/x86/Debug/vtkNetCDF_cxx.dll differ diff --git a/bin/x86/Debug/vtkParallel.dll b/bin/x86/Debug/vtkParallel.dll new file mode 100644 index 0000000..722c31e Binary files /dev/null and b/bin/x86/Debug/vtkParallel.dll differ diff --git a/bin/x86/Debug/vtkRendering.dll b/bin/x86/Debug/vtkRendering.dll new file mode 100644 index 0000000..d71738f Binary files /dev/null and b/bin/x86/Debug/vtkRendering.dll differ diff --git a/bin/x86/Debug/vtkViews.dll b/bin/x86/Debug/vtkViews.dll new file mode 100644 index 0000000..fa1cabf Binary files /dev/null and b/bin/x86/Debug/vtkViews.dll differ diff --git a/bin/x86/Debug/vtkVolumeRendering.dll b/bin/x86/Debug/vtkVolumeRendering.dll new file mode 100644 index 0000000..3430ee3 Binary files /dev/null and b/bin/x86/Debug/vtkVolumeRendering.dll differ diff --git a/bin/x86/Debug/vtkWidgets.dll b/bin/x86/Debug/vtkWidgets.dll new file mode 100644 index 0000000..bc88d4f Binary files /dev/null and b/bin/x86/Debug/vtkWidgets.dll differ diff --git a/bin/x86/Debug/vtkalglib.dll b/bin/x86/Debug/vtkalglib.dll new file mode 100644 index 0000000..f413758 Binary files /dev/null and b/bin/x86/Debug/vtkalglib.dll differ diff --git a/bin/x86/Debug/vtkexoIIc.dll b/bin/x86/Debug/vtkexoIIc.dll new file mode 100644 index 0000000..fb2969e Binary files /dev/null and b/bin/x86/Debug/vtkexoIIc.dll differ diff --git a/bin/x86/Debug/vtkexpat.dll b/bin/x86/Debug/vtkexpat.dll new file mode 100644 index 0000000..92e0b86 Binary files /dev/null and b/bin/x86/Debug/vtkexpat.dll differ diff --git a/bin/x86/Debug/vtkfreetype.dll b/bin/x86/Debug/vtkfreetype.dll new file mode 100644 index 0000000..38a6cdf Binary files /dev/null and b/bin/x86/Debug/vtkfreetype.dll differ diff --git a/bin/x86/Debug/vtkftgl.dll b/bin/x86/Debug/vtkftgl.dll new file mode 100644 index 0000000..cf0ec72 Binary files /dev/null and b/bin/x86/Debug/vtkftgl.dll differ diff --git a/bin/x86/Debug/vtkjpeg.dll b/bin/x86/Debug/vtkjpeg.dll new file mode 100644 index 0000000..a7fd02f Binary files /dev/null and b/bin/x86/Debug/vtkjpeg.dll differ diff --git a/bin/x86/Debug/vtklibxml2.dll b/bin/x86/Debug/vtklibxml2.dll new file mode 100644 index 0000000..4dd0732 Binary files /dev/null and b/bin/x86/Debug/vtklibxml2.dll differ diff --git a/bin/x86/Debug/vtkmetaio.dll b/bin/x86/Debug/vtkmetaio.dll new file mode 100644 index 0000000..033e9b1 Binary files /dev/null and b/bin/x86/Debug/vtkmetaio.dll differ diff --git a/bin/x86/Debug/vtkpng.dll b/bin/x86/Debug/vtkpng.dll new file mode 100644 index 0000000..a50b3fb Binary files /dev/null and b/bin/x86/Debug/vtkpng.dll differ diff --git a/bin/x86/Debug/vtkproj4.dll b/bin/x86/Debug/vtkproj4.dll new file mode 100644 index 0000000..f4b6794 Binary files /dev/null and b/bin/x86/Debug/vtkproj4.dll differ diff --git a/bin/x86/Debug/vtksys.dll b/bin/x86/Debug/vtksys.dll new file mode 100644 index 0000000..b152685 Binary files /dev/null and b/bin/x86/Debug/vtksys.dll differ diff --git a/bin/x86/Debug/vtktiff.dll b/bin/x86/Debug/vtktiff.dll new file mode 100644 index 0000000..254d6b1 Binary files /dev/null and b/bin/x86/Debug/vtktiff.dll differ diff --git a/bin/x86/Debug/vtkverdict.dll b/bin/x86/Debug/vtkverdict.dll new file mode 100644 index 0000000..6a43c91 Binary files /dev/null and b/bin/x86/Debug/vtkverdict.dll differ diff --git a/bin/x86/Debug/vtkzlib.dll b/bin/x86/Debug/vtkzlib.dll new file mode 100644 index 0000000..64ed985 Binary files /dev/null and b/bin/x86/Debug/vtkzlib.dll differ diff --git a/bin/x86/Debug/weka.dll b/bin/x86/Debug/weka.dll new file mode 100644 index 0000000..116519f Binary files /dev/null and b/bin/x86/Debug/weka.dll differ diff --git a/innoSetup.iss b/innoSetup.iss deleted file mode 100644 index 766e39b..0000000 --- a/innoSetup.iss +++ /dev/null @@ -1,159 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{7FDACC5F-8566-4FEC-9EFA-6931D5CE4878} -AppName=HCS Analyzer -AppVersion=1.0.4595 -;AppVerName=HCS Analyzer 1.0.4595 -AppPublisher=Institut Pasteur Kore -AppPublisherURL=http://hcs-analyzer.ip-korea.org/ -AppSupportURL=http://hcs-analyzer.ip-korea.org/ -AppUpdatesURL=http://hcs-analyzer.ip-korea.org/ -DefaultDirName={pf}\HCS Analyzer -DefaultGroupName=HCS Analyzer -AllowNoIcons=yes -OutputDir=C:\TestHCS -OutputBaseFilename=setup -SetupIconFile=E:\HCS-Analyzer\bin\LogoType1.ico -Compression=lzma -SolidCompression=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked -Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 - -[Files] -Source: "E:\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Accord.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Accord.Math.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Accord.Statistics.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\AForge.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\AForge.Math.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\AlgLib.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\AviRecorder.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Cosmo.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DataSetViewerControls.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DataSetViewerCore.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Controls.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Maps.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Maps.Extra.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Markers.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplayViews.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Emgu.CV.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Emgu.Util.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\FreeImage.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\FreeImage.NET.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\HCSPlugin.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\ICSharpCode.SharpZipLib.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.AWT.WinForms.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Beans.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Charsets.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Corba.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Core.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Jdbc.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Management.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Media.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Misc.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Naming.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Remoting.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Security.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.SwingAWT.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Text.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Tools.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Util.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.API.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Bind.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Crypto.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Parse.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Transform.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.WebServices.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.XPath.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.Reflection.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.Runtime.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\IKVM.Runtime.JNI.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.mummy.Runtime.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.mummy.Runtime.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkCharts.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkCommon.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkFiltering.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGenericFiltering.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGeovis.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGraphics.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkHybrid.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkImaging.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkInfovis.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkIO.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkParallel.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkRendering.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkViews.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkVolumeRendering.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkWidgets.Unmanaged.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.Drawing.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.GraphViewerGDI.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\Microsoft.Research.Science.Data.Slicer.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\MINE.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\msvcm90.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\msvcp90.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\msvcr90.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\opencv_core231.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\opencv_imgproc231.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\SQLite.Designer.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\SQLite.Interop.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\System.Data.SQLite.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\System.Data.SQLite.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\System.Reactive.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\VPIC.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkalglib.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkCharts.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkCommon.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkDICOMParser.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkexoIIc.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkexpat.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkFiltering.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkfreetype.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkftgl.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkGenericFiltering.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkGeovis.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkGraphics.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkHybrid.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkImaging.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkInfovis.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkIO.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkjpeg.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtklibxml2.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkmetaio.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkNetCDF.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkNetCDF_cxx.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkParallel.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkpng.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkproj4.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkRendering.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtksys.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtktiff.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkverdict.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkViews.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkVolumeRendering.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkWidgets.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\vtkzlib.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "E:\HCS-Analyzer\bin\x86\Debug\weka.dll"; DestDir: "{app}"; Flags: ignoreversion -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -[Icons] -Name: "{group}\HCS Analyzer"; Filename: "{app}\HCSAnalyzer.exe" -Name: "{group}\{cm:UninstallProgram,HCS Analyzer}"; Filename: "{uninstallexe}" -Name: "{commondesktop}\HCS Analyzer"; Filename: "{app}\HCSAnalyzer.exe"; Tasks: desktopicon -Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\HCS Analyzer"; Filename: "{app}\HCSAnalyzer.exe"; Tasks: quicklaunchicon - -[Run] -Filename: "{app}\HCSAnalyzer.exe"; Description: "{cm:LaunchProgram,HCS Analyzer}"; Flags: nowait postinstall skipifsilent - diff --git a/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..9453f19 Binary files /dev/null and b/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..28f45ec Binary files /dev/null and b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/obj/Debug/HCS Analyzer.csproj.FileListAbsolute.txt b/obj/Debug/HCS Analyzer.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..0a0163d --- /dev/null +++ b/obj/Debug/HCS Analyzer.csproj.FileListAbsolute.txt @@ -0,0 +1,240 @@ +C:\Work\underDev\HCS-Analyzer\bin\Debug\HCSAnalyzer.exe.config +D:\Source\HCS-Analyzer\bin\Debug\HCSAnalyzer.exe.config +D:\Source\HCS-Analyzer\obj\Debug\HCS Analyzer.csproj.ResolveComReference.cache +D:\Source\HCS-Analyzer\bin\Debug\FreeImage.dll +D:\Source\HCS-Analyzer\bin\Debug\opencv_core231.dll +D:\Source\HCS-Analyzer\bin\Debug\opencv_imgproc231.dll +D:\Source\HCS-Analyzer\bin\Debug\SQLite.Interop.dll +D:\Source\HCS-Analyzer\bin\Debug\HCSAnalyzer.exe.manifest +D:\Source\HCS-Analyzer\bin\Debug\HCSAnalyzer.application +D:\Source\HCS-Analyzer\bin\Debug\HCSAnalyzer.exe +D:\Source\HCS-Analyzer\bin\Debug\HCSAnalyzer.pdb +D:\Source\HCS-Analyzer\bin\Debug\Accord.dll +D:\Source\HCS-Analyzer\bin\Debug\Accord.Math.dll +D:\Source\HCS-Analyzer\bin\Debug\Accord.Statistics.dll +D:\Source\HCS-Analyzer\bin\Debug\AForge.dll +D:\Source\HCS-Analyzer\bin\Debug\AForge.Math.dll +D:\Source\HCS-Analyzer\bin\Debug\AlgLib.dll +D:\Source\HCS-Analyzer\bin\Debug\BioCSharp.dll +D:\Source\HCS-Analyzer\bin\Debug\DataSetViewerControls.dll +D:\Source\HCS-Analyzer\bin\Debug\Emgu.CV.dll +D:\Source\HCS-Analyzer\bin\Debug\Emgu.Util.dll +D:\Source\HCS-Analyzer\bin\Debug\FreeImage.NET.dll +D:\Source\HCS-Analyzer\bin\Debug\HCSPlugin.dll +D:\Source\HCS-Analyzer\bin\Debug\ICSharpCode.SharpZipLib.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.AWT.WinForms.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Beans.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Charsets.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Corba.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Core.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Jdbc.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Management.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Media.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Misc.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Naming.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Remoting.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Security.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.SwingAWT.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Text.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Tools.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.Util.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.API.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.Bind.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.Crypto.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.Parse.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.Transform.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.WebServices.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.OpenJDK.XML.XPath.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.Reflection.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.Runtime.dll +D:\Source\HCS-Analyzer\bin\Debug\IKVM.Runtime.JNI.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.mummy.Runtime.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.dll +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.dll +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.IO.dll +D:\Source\HCS-Analyzer\bin\Debug\MIConvexHullPlugin.dll +D:\Source\HCS-Analyzer\bin\Debug\Microsoft.Msagl.dll +D:\Source\HCS-Analyzer\bin\Debug\Microsoft.Msagl.Drawing.dll +D:\Source\HCS-Analyzer\bin\Debug\Microsoft.Msagl.GraphViewerGDI.dll +D:\Source\HCS-Analyzer\bin\Debug\MINE.dll +D:\Source\HCS-Analyzer\bin\Debug\R.NET.dll +D:\Source\HCS-Analyzer\bin\Debug\SQLite.Designer.dll +D:\Source\HCS-Analyzer\bin\Debug\System.Data.SQLite.dll +D:\Source\HCS-Analyzer\bin\Debug\System.Data.SQLite.Linq.dll +D:\Source\HCS-Analyzer\bin\Debug\weka.dll +D:\Source\HCS-Analyzer\bin\Debug\DataSetViewerCore.dll +D:\Source\HCS-Analyzer\bin\Debug\Microsoft.Research.Science.Data.Slicer.dll +D:\Source\HCS-Analyzer\bin\Debug\AviRecorder.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplayViews.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplay.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplay.Controls.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplay.Markers.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplay.Maps.dll +D:\Source\HCS-Analyzer\bin\Debug\DynamicDataDisplay.Maps.Extra.dll +D:\Source\HCS-Analyzer\bin\Debug\System.Reactive.dll +D:\Source\HCS-Analyzer\bin\Debug\BioCSharp.pdb +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.pdb +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.xml +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.IO.pdb +D:\Source\HCS-Analyzer\bin\Debug\MathNet.Numerics.IO.xml +D:\Source\HCS-Analyzer\bin\Debug\Kitware.mummy.Runtime.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkCharts.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkCommon.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkFiltering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkGenericFiltering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkGeovis.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkGraphics.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkHybrid.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkIO.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkImaging.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkInfovis.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkParallel.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkRendering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkViews.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkVolumeRendering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\Kitware.VTK.vtkWidgets.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkCharts.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkCommon.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkFiltering.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkGenericFiltering.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkGeovis.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkGraphics.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkHybrid.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkIO.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkImaging.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkInfovis.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkParallel.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkRendering.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkViews.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkVolumeRendering.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkWidgets.dll +D:\Source\HCS-Analyzer\bin\Debug\Cosmo.dll +D:\Source\HCS-Analyzer\bin\Debug\VPIC.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkalglib.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkDICOMParser.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkexoIIc.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkftgl.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkmetaio.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkNetCDF.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkNetCDF_cxx.dll +D:\Source\HCS-Analyzer\bin\Debug\vtksys.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkverdict.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkexpat.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkfreetype.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkjpeg.dll +D:\Source\HCS-Analyzer\bin\Debug\vtklibxml2.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkpng.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkproj4.dll +D:\Source\HCS-Analyzer\bin\Debug\vtktiff.dll +D:\Source\HCS-Analyzer\bin\Debug\vtkzlib.dll +D:\Source\HCS-Analyzer\bin\Debug\Microsoft.VC90.CRT.manifest +D:\Source\HCS-Analyzer\bin\Debug\msvcm90.dll +D:\Source\HCS-Analyzer\bin\Debug\msvcp90.dll +D:\Source\HCS-Analyzer\bin\Debug\msvcr90.dll +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.cImageViewer.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormFor3DDataDisplay.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources +D:\Source\HCS-Analyzer\obj\Debug\LibPlateAnalysis.FormForDescriptorInfo.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.AboutBox.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForProjections.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForMultivariateScreen.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForDRCDesign.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources +D:\Source\HCS-Analyzer\obj\Debug\LibPlateAnalysis.SimpleFormForXY.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForClassificationTree.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForGenerateScreening.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForKeggGene.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForPlateDimensions.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForSwapClasses.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForWellInformation.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.IO.FormForNewDescName.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.IO.FormForProgress.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.IO.FormForVariability.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormSaveScreening.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForNameRequest.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormForPathway.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormForPie.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormForImportExcel.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormForKegg.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormClassification.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormForNormalization.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormConsole.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.FormForOptionsWindow.resources +D:\Source\HCS-Analyzer\obj\Debug\LibPlateAnalysis.SimpleForm.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.PlatesListForm.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Forms.FormDendogram.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.HCSAnalyzer.resources +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.Properties.Resources.resources +D:\Source\HCS-Analyzer\obj\Debug\HCS Analyzer.csproj.GenerateResource.Cache +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.TrustInfo.xml +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.exe.manifest +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.application +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.exe +D:\Source\HCS-Analyzer\obj\Debug\HCSAnalyzer.pdb +D:\Source\HCS-Analyzer\obj\Debug\HCS Analyzer.csprojResolveAssemblyReference.cache diff --git a/obj/Debug/HCS Analyzer.csproj.GenerateResource.Cache b/obj/Debug/HCS Analyzer.csproj.GenerateResource.Cache new file mode 100644 index 0000000..efedab9 Binary files /dev/null and b/obj/Debug/HCS Analyzer.csproj.GenerateResource.Cache differ diff --git a/obj/Debug/HCS Analyzer.csproj.ResolveComReference.cache b/obj/Debug/HCS Analyzer.csproj.ResolveComReference.cache new file mode 100644 index 0000000..807fe2e Binary files /dev/null and b/obj/Debug/HCS Analyzer.csproj.ResolveComReference.cache differ diff --git a/obj/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache b/obj/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..e4f0b2f Binary files /dev/null and b/obj/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache differ diff --git a/obj/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources b/obj/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources differ diff --git a/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources differ diff --git a/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources differ diff --git a/obj/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources differ diff --git a/obj/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources b/obj/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources differ diff --git a/obj/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources b/obj/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormClassification.resources b/obj/Debug/HCSAnalyzer.FormClassification.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormClassification.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormConsole.resources b/obj/Debug/HCSAnalyzer.FormConsole.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormConsole.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormForImportExcel.resources b/obj/Debug/HCSAnalyzer.FormForImportExcel.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormForImportExcel.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormForKegg.resources b/obj/Debug/HCSAnalyzer.FormForKegg.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormForKegg.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormForNormalization.resources b/obj/Debug/HCSAnalyzer.FormForNormalization.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormForNormalization.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormForOptionsWindow.resources b/obj/Debug/HCSAnalyzer.FormForOptionsWindow.resources new file mode 100644 index 0000000..90914b6 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormForOptionsWindow.resources differ diff --git a/obj/Debug/HCSAnalyzer.FormForPie.resources b/obj/Debug/HCSAnalyzer.FormForPie.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.FormForPie.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.AboutBox.resources b/obj/Debug/HCSAnalyzer.Forms.AboutBox.resources new file mode 100644 index 0000000..dee2d02 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.AboutBox.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormDendogram.resources b/obj/Debug/HCSAnalyzer.Forms.FormDendogram.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormDendogram.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources b/obj/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources b/obj/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources b/obj/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources b/obj/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources b/obj/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources b/obj/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources b/obj/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForPathway.resources b/obj/Debug/HCSAnalyzer.Forms.FormForPathway.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForPathway.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources b/obj/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForProjections.resources b/obj/Debug/HCSAnalyzer.Forms.FormForProjections.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForProjections.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources b/obj/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources b/obj/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources b/obj/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources new file mode 100644 index 0000000..e3415b8 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources b/obj/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources b/obj/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources b/obj/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources b/obj/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources b/obj/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources differ diff --git a/obj/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources b/obj/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources differ diff --git a/obj/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources b/obj/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources differ diff --git a/obj/Debug/HCSAnalyzer.HCSAnalyzer.resources b/obj/Debug/HCSAnalyzer.HCSAnalyzer.resources new file mode 100644 index 0000000..a90f980 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.HCSAnalyzer.resources differ diff --git a/obj/Debug/HCSAnalyzer.PlatesListForm.resources b/obj/Debug/HCSAnalyzer.PlatesListForm.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.PlatesListForm.resources differ diff --git a/obj/Debug/HCSAnalyzer.Properties.Resources.resources b/obj/Debug/HCSAnalyzer.Properties.Resources.resources new file mode 100644 index 0000000..7b27724 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Properties.Resources.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources differ diff --git a/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources differ diff --git a/obj/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources b/obj/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources differ diff --git a/obj/Debug/HCSAnalyzer.TrustInfo.xml b/obj/Debug/HCSAnalyzer.TrustInfo.xml new file mode 100644 index 0000000..f027c9c --- /dev/null +++ b/obj/Debug/HCSAnalyzer.TrustInfo.xml @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/obj/Debug/HCSAnalyzer.application b/obj/Debug/HCSAnalyzer.application new file mode 100644 index 0000000..4df9dfd --- /dev/null +++ b/obj/Debug/HCSAnalyzer.application @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + YBSoivHCIl1oNy33ZxRc/Kxfcq+w8gs9JdZl4WdykdI= + + + + \ No newline at end of file diff --git a/obj/Debug/HCSAnalyzer.cImageViewer.resources b/obj/Debug/HCSAnalyzer.cImageViewer.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.cImageViewer.resources differ diff --git a/obj/Debug/HCSAnalyzer.exe b/obj/Debug/HCSAnalyzer.exe new file mode 100644 index 0000000..26c2e13 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.exe differ diff --git a/obj/Debug/HCSAnalyzer.exe.manifest b/obj/Debug/HCSAnalyzer.exe.manifest new file mode 100644 index 0000000..7f2caad --- /dev/null +++ b/obj/Debug/HCSAnalyzer.exe.manifest @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8KOJnwib7U9JdLKRIi8YWOytNjiIiFViXVihhk80KsQ= + + + + + + + + + + + + MlvgoKHc8ZqLhru+z7L0NoTAC2Y4Sduw9zgSDMc7kKE= + + + + + + + + + + + + ROOsglSFnp4oKJRY9JZjOWgjZmJgOE2Fino8ko+ytHE= + + + + + + + + + + + + dOoGGvE9uB490Mj/QuL2GmwVX7p6Br73U0Rp0LaC6/Y= + + + + + + + + + + + + I26n5ALaj6ms4PfrFDOyKedcCJpFa2uqlmg4lMk+Pm4= + + + + + + + + + + + + orvTJce9vfsTnJVs0l3cLIVKW8J6DTMKcpEY0hX8x48= + + + + + + + + + + + + 8IzhgSOiUFUlqVUP2NiftA0mAvSp4MrWkVmYN05Ptlw= + + + + + + + + + + + + OwqhyweXx8w/t4mZJ9C8Me1eC/cpbL4t4AfwcONjWV4= + + + + + + + + + + + + UWH2aMLlI2dKoaGcuykhfwcs04J9zZsvN+UydZ6uG1w= + + + + + + + + + + + + T3pPGb3I8Y+lJPPes8AQvBnbnQoIaBnnR0Ixi44NVkA= + + + + + + + + + + + + /DVtur+HnWSULpUk52hXP5IjU+ELxV3Bx2YKD4MO/sI= + + + + + + + + + + + + xtKew1bu0hB/+/5L0wxQeRKE7n2eAH0aidhoGvodomw= + + + + + + + + + + + + pFFLzgsAfA+RrG/fyd1JX9SlTxI00KOoaZsxfVlNCPQ= + + + + + + + + + + + + JSRGnOx5Min0J6AkXr85eNEGWZJkRDcgLCdm7a455bI= + + + + + + + + + + + + LqcswZtROX7GtsKoPtYSDTmtFLd/+y1z7LGdeBUP9lM= + + + + + + + + + + + + bVaxaz2utuQjFWdvJ6JBPozuW94yUTUqyJeWvebUQD0= + + + + + + + + + + + + /advakMUFUP2zdPia1tFyiKZqtdBqlNZI1JsCC/tuDE= + + + + + + + + + + + + DE7mrDPZUhtxcBzZte/N7UAOVH7gMf0Y1nqH7nlzH8o= + + + + + + + + + + + + Zqi7bUZMKc71Ra4IxR3PjwpOYxDVoGRFWRPHqC7yfgQ= + + + + + + + + + + + + hDEUMU038nVuTJV0UHn5ycsLR9Kx1+9E7uMEvHlm6l0= + + + + + + + + + + + + wqQq374TSWtQHUfp70nTyDosjGFjcgZu7ohTONFB7X4= + + + + + + + + + + + + nLtFEWQq9LqfjTJ+P1CHx4s1qGauRrVETQE3yQJksD4= + + + + + + + + + + + + 1I0AW0SA/p/4cpayVGv3dXirugfWWL1uhLTnH44k/FU= + + + + + + + + + + + + 6zRtqzcEh4l0cvbl7FMiglD1zzUuG3+pj3PuejX3pa8= + + + + + + + + + + + + 7jk97KPFeCvbq1URUEGsWRVRfUXuh845xUyGfzL2P4M= + + + + + + + + + + + + kEsXbShajCmjdP9nIzREmPshLL+rZhFoSWt8S0xWTdw= + + + + + + + + + + + + w5hGrac1Gh+HSD070qT06C7MnWlNbeRDTQNl/qkhezo= + + + + + + + + + + + + OTAgwa9LTpjDE5bnj+FuUjlw9YgxipvW6Hy4VtSoi+s= + + + + + + + + + + + + 4FX9WU1Z0t2PdwDgx1xc1JeomZO3g5lQiHQF9vPaY64= + + + + + + + + + + + + nKECbYpu5JPf2QnU3zowrZAHe1iTIxQtUKEOZpsAyP0= + + + + + + + + + + + + Ktyzx0HR0//WOgP79hoN7obafRXXTLupTXa1u+FNurc= + + + + + + + + + + + + MHQayEZMIh3ooEzA8blC2q1bUeM94vxAcPd7RO34Y8A= + + + + + + + + + + + + uR39PCjv4qsMJrEAr3UY6Uto9j+w6oVFqIPYedSNP4s= + + + + + + + + + + + + quoc17XtvxXSG2uFE89cxqN6LWluIvkDJLZnFPhCSqo= + + + + + + + + + + + + dNNdP+gyRfeTv6aaeL4sy81FGMUkGj3n2eh6T/uMdT4= + + + + + + + + + + + + 4Y+jwhiQq+bqLOBQ4Q419Ga8oinjwmCFMbL0yZbOluE= + + + + + + + + + + + + VRNrGOI7Eqao15Zn+x1PROjnBe4P2hMDdhpCN906ctM= + + + + + + + + + + + + 9RtFrT2hHc0w7AySwKv5kj7t+WEeKhrg+V8SoKIOV7Q= + + + + + + + + + + + + JcqvRftiwBMXfTA1EuXhx9cPCIg9LNFd5OYnZC9pgMI= + + + + + + + + + + + + iP+0aOV+cIZBnhjVk7junLLxUKNNbYIZDyM9saNq66c= + + + + + + + + + + + + c2qaEVhfHpmvhvKqYrygbkEADogK0LdDnzpF7o6WY+A= + + + + + + + + + + + + b7qYEK4B2DGn+TLiBrZeVt2+ZI9daTDf5FLZqFdXBZQ= + + + + + + + + + + + + WcE8QTAUFF6HIkduMcHvTSaUH1PYP9fqieCijfbdk3k= + + + + + + + + + + + + IYSvp7pIOjt8unEI2xjNF0sf0NP4GkQWvokJdkp6V10= + + + + + + + + + + + + eGtZ2tznuTcJjjTN53Yp6KP5dI0iwD4Fy8fsz5Vqln0= + + + + + + + + + + + + BxjDLyGE/isXep8d+t/P/MLBdV3oT2WXMLojfhMzmvc= + + + + + + + + + + + + kmyGDNFNJGjHKLDiZyJbH3PnTRi7pcP2WsPocH9t83Q= + + + + + + + + + + + + 8hJyZUBkWNAb0geD9cMRzzdbLTnVwdA+aHYlK3b9g0Q= + + + + + + + + + + + + vVh/J0ypxp8GFxJbqQMaMbi5k3Fzcr3mQMJtD9v7j5g= + + + + + + + + + + + + 2wcQrKrt9SKkjJFpsft73X0RPZ1YAeGI8NzTMBWNMdI= + + + + + + + + + + + + veeJGlCkso/RwoTvFj9fiwmMSHQ5IEC37H3EG7OYjVo= + + + + + + + + + + + + uVuOW0FP3fnEzr02cSSq7HmRiLRBNzhrkmcmOucBOjI= + + + + + + + + + + + + hxV3+qsTJzt5/C9DdgAQUzJRvxeM8Qc5AD3y/yzw1OY= + + + + + + + + + + + + isqBFx7tOXKA0l5AeMof0r84VRi2y38xTYHBvDDWlS8= + + + + + + + + + + + + 4wKXB0Iu8uVcw2aMz+ADbWNfb1oVZTcnNfCIjdB3eJw= + + + + + + + + + + + + BP7EVxT4R2/XjSb5mXt2mxtecSp4Y+VHvpWeXhT/cvs= + + + + + + + + + + + + T7rkgGwP7my5YKuIEih91dnN+TAYEZYo2umJXTuDJ8U= + + + + + + + + + + + + wmA1PXzoVfv0P5Bxiu0VhtE7I5H5/i2q77nkRQxIpWM= + + + + + + + + + + + + jUUkMAZHEYAKpZNtYTYMJmiSQ4YIYHyvOUfdQum7a+U= + + + + + + + + + + + + AOJp8j/x7phKomo9bDR7cLpJM2svuB+dvd0seBlE+CQ= + + + + + + + + + + + + t9SfQ6zPy1Jv/GXjp6GxVsqM2tJfSAuPrF/RLaUZVqA= + + + + + + + + + + + + zrKGNYT1OyC+fCGh9IC8oEWgquZGI4V4vXUMNHAR1QQ= + + + + + + + + + + + + iGZyAXhWLUr7a0hOA4buoz7bbfGIfipQiTDxPU/AJf0= + + + + + + + + + + + + g49msnmXij1Vzkyjmm/lDNI/Q5LTibKAQuLFe1E76+g= + + + + + + + + + + YW7vPho7Zr+OmPJfQ+rtVJQ32cLG5zi/ybqfuPJzopA= + + + + + + + + + AOJzOomFU1O8eDvCEjjyNk/jG63GeS+46p+1Uw2WUcA= + + + + + + + + + riqnp/GV0TU9TOVK42QRSjnbJafehBgHAcFQnWsAIbg= + + + + + + + + + AJ2ThaNzw0s60ZlnY74ZNZrAQAbfREc4MmXi6CrukRQ= + + + + + + + + + P7l7JKeQFRtCUNerUEyoryN/X52C76maVCjEAbe3gW0= + + + + + + + + + QOX0W9BhofXgA3Jqwt3e/C5FCvIGCaNFomDQUNCHYho= + + + \ No newline at end of file diff --git a/obj/Debug/HCSAnalyzer.pdb b/obj/Debug/HCSAnalyzer.pdb new file mode 100644 index 0000000..7f9d337 Binary files /dev/null and b/obj/Debug/HCSAnalyzer.pdb differ diff --git a/obj/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources b/obj/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources differ diff --git a/obj/Debug/LibPlateAnalysis.SimpleForm.resources b/obj/Debug/LibPlateAnalysis.SimpleForm.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/LibPlateAnalysis.SimpleForm.resources differ diff --git a/obj/Debug/LibPlateAnalysis.SimpleFormForXY.resources b/obj/Debug/LibPlateAnalysis.SimpleFormForXY.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/Debug/LibPlateAnalysis.SimpleFormForXY.resources differ diff --git a/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..c1b81fb Binary files /dev/null and b/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache b/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..3cc37db Binary files /dev/null and b/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..87c6a13 Binary files /dev/null and b/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/obj/x86/Debug/HCS Analyzer.csproj.FileListAbsolute.txt b/obj/x86/Debug/HCS Analyzer.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..428d809 --- /dev/null +++ b/obj/x86/Debug/HCS Analyzer.csproj.FileListAbsolute.txt @@ -0,0 +1,476 @@ +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\FreeImage.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\opencv_core231.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\opencv_imgproc231.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\SQLite.Interop.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSAnalyzer.exe.config +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSAnalyzer.exe.manifest +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSAnalyzer.application +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSAnalyzer.exe +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSAnalyzer.pdb +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Accord.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Accord.Math.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Accord.Statistics.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\AForge.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\AForge.Math.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\AlgLib.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DataSetViewerControls.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Emgu.CV.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Emgu.Util.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\FreeImage.NET.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\HCSPlugin.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\ICSharpCode.SharpZipLib.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.AWT.WinForms.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Beans.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Charsets.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Corba.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Core.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Jdbc.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Management.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Media.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Misc.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Naming.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Remoting.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Security.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.SwingAWT.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Text.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Tools.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.Util.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.API.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.Bind.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.Crypto.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.Parse.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.Transform.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.WebServices.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.OpenJDK.XML.XPath.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.Reflection.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.Runtime.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\IKVM.Runtime.JNI.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.mummy.Runtime.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MIConvexHullPlugin.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Microsoft.Msagl.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Microsoft.Msagl.Drawing.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Microsoft.Msagl.GraphViewerGDI.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MINE.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\R.NET.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\SQLite.Designer.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\System.Data.SQLite.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\System.Data.SQLite.Linq.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\weka.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DataSetViewerCore.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Microsoft.Research.Science.Data.Slicer.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\AviRecorder.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplayViews.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplay.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplay.Controls.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplay.Markers.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplay.Maps.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\DynamicDataDisplay.Maps.Extra.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\System.Reactive.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.mummy.Runtime.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkCharts.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkCommon.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkFiltering.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkGenericFiltering.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkGeovis.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkGraphics.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkHybrid.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkIO.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkImaging.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkInfovis.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkParallel.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkRendering.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkViews.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkVolumeRendering.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Kitware.VTK.vtkWidgets.Unmanaged.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkCharts.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkCommon.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkFiltering.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkGenericFiltering.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkGeovis.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkGraphics.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkHybrid.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkIO.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkImaging.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkInfovis.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkParallel.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkRendering.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkViews.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkVolumeRendering.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkWidgets.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Cosmo.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\VPIC.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkalglib.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkDICOMParser.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkexoIIc.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkftgl.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkmetaio.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkNetCDF.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkNetCDF_cxx.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtksys.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkverdict.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkexpat.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkfreetype.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkjpeg.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtklibxml2.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkpng.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkproj4.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtktiff.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\vtkzlib.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\Microsoft.VC90.CRT.manifest +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\msvcm90.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\msvcp90.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\msvcr90.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCS Analyzer.csprojResolveAssemblyReference.cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.cImageViewer.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormFor3DDataDisplay.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\LibPlateAnalysis.FormForDescriptorInfo.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.AboutBox.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForProjections.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForMultivariateScreen.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForDRCDesign.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\LibPlateAnalysis.SimpleFormForXY.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForClassificationTree.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForGenerateScreening.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForKeggGene.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForPlateDimensions.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForSwapClasses.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForWellInformation.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForNewDescName.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForProgress.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForVariability.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormSaveScreening.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForNameRequest.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormForPathway.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormForPie.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormForImportExcel.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormForKegg.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormClassification.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormForNormalization.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormConsole.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.FormForOptionsWindow.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\LibPlateAnalysis.SimpleForm.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.PlatesListForm.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Forms.FormDendogram.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.HCSAnalyzer.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.Properties.Resources.resources +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCS Analyzer.csproj.GenerateResource.Cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.TrustInfo.xml +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.exe.manifest +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.application +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.exe +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCSAnalyzer.pdb +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\obj\x86\Debug\HCS Analyzer.csproj.ResolveComReference.cache +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.IO.dll +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.pdb +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.xml +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.IO.pdb +D:\HCS-Analyzer - Source v1.2.1.3(Beta)\HCS-Analyzer - Source v1.2.1.3(Beta)\bin\x86\Debug\MathNet.Numerics.IO.xml +D:\Source\HCS-Analyzer\bin\x86\Debug\FreeImage.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\opencv_core231.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\opencv_imgproc231.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\SQLite.Interop.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.exe.config +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.exe.manifest +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.application +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.exe +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSAnalyzer.pdb +D:\Source\HCS-Analyzer\bin\x86\Debug\Accord.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Accord.Math.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Accord.Statistics.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\AForge.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\AForge.Math.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\AlgLib.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DataSetViewerControls.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Emgu.CV.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Emgu.Util.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\FreeImage.NET.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\HCSPlugin.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\ICSharpCode.SharpZipLib.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.AWT.WinForms.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Beans.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Charsets.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Corba.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Core.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Jdbc.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Management.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Media.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Misc.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Naming.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Remoting.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Security.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.SwingAWT.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Text.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Tools.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.Util.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.API.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Bind.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Crypto.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Parse.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.Transform.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.WebServices.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.OpenJDK.XML.XPath.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.Reflection.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.Runtime.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\IKVM.Runtime.JNI.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.mummy.Runtime.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.IO.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\MIConvexHullPlugin.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.Drawing.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Microsoft.Msagl.GraphViewerGDI.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\MINE.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\R.NET.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\SQLite.Designer.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\System.Data.SQLite.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\System.Data.SQLite.Linq.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\weka.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DataSetViewerCore.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Microsoft.Research.Science.Data.Slicer.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\AviRecorder.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplayViews.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Controls.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Markers.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Maps.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\DynamicDataDisplay.Maps.Extra.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\System.Reactive.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.pdb +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.xml +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.IO.pdb +D:\Source\HCS-Analyzer\bin\x86\Debug\MathNet.Numerics.IO.xml +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.mummy.Runtime.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkCharts.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkCommon.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkFiltering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGenericFiltering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGeovis.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkGraphics.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkHybrid.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkIO.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkImaging.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkInfovis.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkParallel.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkRendering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkViews.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkVolumeRendering.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Kitware.VTK.vtkWidgets.Unmanaged.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkCharts.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkCommon.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkFiltering.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkGenericFiltering.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkGeovis.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkGraphics.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkHybrid.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkIO.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkImaging.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkInfovis.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkParallel.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkRendering.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkViews.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkVolumeRendering.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkWidgets.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Cosmo.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\VPIC.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkalglib.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkDICOMParser.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkexoIIc.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkftgl.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkmetaio.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkNetCDF.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkNetCDF_cxx.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtksys.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkverdict.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkexpat.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkfreetype.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkjpeg.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtklibxml2.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkpng.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkproj4.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtktiff.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\vtkzlib.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\Microsoft.VC90.CRT.manifest +D:\Source\HCS-Analyzer\bin\x86\Debug\msvcm90.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\msvcp90.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\msvcr90.dll +D:\Source\HCS-Analyzer\obj\x86\Debug\HCS Analyzer.csprojResolveAssemblyReference.cache +D:\Source\HCS-Analyzer\obj\x86\Debug\HCS Analyzer.csproj.ResolveComReference.cache +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.cImageViewer.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormFor3DDataDisplay.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\LibPlateAnalysis.FormForDescriptorInfo.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.AboutBox.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForProjections.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForMultivariateScreen.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForDRCDesign.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\LibPlateAnalysis.SimpleFormForXY.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForClassificationTree.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForGenerateScreening.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForKeggGene.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForPlateDimensions.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForSwapClasses.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForWellInformation.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForNewDescName.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForProgress.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.IO.FormForVariability.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormSaveScreening.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForNameRequest.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormForPathway.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormForPie.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormForImportExcel.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormForKegg.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormClassification.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormForNormalization.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormConsole.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.FormForOptionsWindow.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\LibPlateAnalysis.SimpleForm.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.PlatesListForm.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Forms.FormDendogram.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.HCSAnalyzer.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.Properties.Resources.resources +D:\Source\HCS-Analyzer\obj\x86\Debug\HCS Analyzer.csproj.GenerateResource.Cache +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.TrustInfo.xml +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.exe.manifest +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.application +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.exe +D:\Source\HCS-Analyzer\obj\x86\Debug\HCSAnalyzer.pdb +D:\Source\HCS-Analyzer\bin\x86\Debug\BioCSharp.dll +D:\Source\HCS-Analyzer\bin\x86\Debug\BioCSharp.pdb diff --git a/obj/x86/Debug/HCS Analyzer.csproj.GenerateResource.Cache b/obj/x86/Debug/HCS Analyzer.csproj.GenerateResource.Cache new file mode 100644 index 0000000..f934f53 Binary files /dev/null and b/obj/x86/Debug/HCS Analyzer.csproj.GenerateResource.Cache differ diff --git a/obj/x86/Debug/HCS Analyzer.csproj.ResolveComReference.cache b/obj/x86/Debug/HCS Analyzer.csproj.ResolveComReference.cache new file mode 100644 index 0000000..807fe2e Binary files /dev/null and b/obj/x86/Debug/HCS Analyzer.csproj.ResolveComReference.cache differ diff --git a/obj/x86/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache b/obj/x86/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..dc83c6c Binary files /dev/null and b/obj/x86/Debug/HCS Analyzer.csprojResolveAssemblyReference.cache differ diff --git a/obj/x86/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources b/obj/x86/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Cell_by_Cell_and_DB.Simulator.Forms.FormForModelsHistory.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForSingleSlider.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.GUI.FormForXYMinMax.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Classes.Base_Classes.Viewers.FormForDisplay.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources b/obj/x86/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Classes.Machine_Learning.ClusteringInfo.PanelForParamManual.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources b/obj/x86/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Controls.cWindowToDisplayGeneralArray.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormClassification.resources b/obj/x86/Debug/HCSAnalyzer.FormClassification.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormClassification.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormConsole.resources b/obj/x86/Debug/HCSAnalyzer.FormConsole.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormConsole.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormForImportExcel.resources b/obj/x86/Debug/HCSAnalyzer.FormForImportExcel.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormForImportExcel.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormForKegg.resources b/obj/x86/Debug/HCSAnalyzer.FormForKegg.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormForKegg.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormForNormalization.resources b/obj/x86/Debug/HCSAnalyzer.FormForNormalization.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormForNormalization.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormForOptionsWindow.resources b/obj/x86/Debug/HCSAnalyzer.FormForOptionsWindow.resources new file mode 100644 index 0000000..90914b6 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormForOptionsWindow.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.FormForPie.resources b/obj/x86/Debug/HCSAnalyzer.FormForPie.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.FormForPie.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.AboutBox.resources b/obj/x86/Debug/HCSAnalyzer.Forms.AboutBox.resources new file mode 100644 index 0000000..dee2d02 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.AboutBox.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForEMInfo.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForHierarchical.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.ClusteringForms.FormForKMeansInfo.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormDendogram.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormDendogram.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormDendogram.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormFor3DDataDisplay.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForClassificationTree.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForDRCDesign.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForGenerateScreening.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForKeggGene.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForMultivariateScreen.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForNameRequest.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForPathway.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForPathway.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForPathway.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForPlateDimensions.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForProjections.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForProjections.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForProjections.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForSwapClasses.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormForWellInformation.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormSaveScreening.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForDRCAnalysis.FormForDRCSelection.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.ForClassSelection.UserControlForSingleClass.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForMaxMinRequest.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForPointSize.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormForSingleCellsDisplay.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.FormToDisplaySimpleTable.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayScatter2D.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cDisplayTable.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForGraphsDisplay.cWindowToDisplayHisto.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForImageDisplay.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.FormForLUTManager.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForImages.UserControlSingleLUT.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForClassificationInfo.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.FormForKernelEditor.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKNN.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamKStar.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamNaiveBayes.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamOneR.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources new file mode 100644 index 0000000..e3415b8 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamPerceptron.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomForest.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamRandomTree.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamSVM.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClassificationInfo.PanelForParamZeroR.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamCobWeb.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamEM.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamFarthestFirst.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamHierarchical.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.ClusteringInfo.PanelForParamKMeans.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForClusteringInfo.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForFullScreeningViewOptions.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormForGlobalInfoOptions.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.FormToDisplayDRC.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForCellularPhenotypesColor.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForOptions3D.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForParamJ48.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForPlatesandWells.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.FormsForOptions.PanelForOptions.PanelForWellClassesColor.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForDoubleProgress.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForMultipleClassSelection.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForNewDescName.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForProgress.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms.IO.FormForVariability.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources b/obj/x86/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Forms._3D.FormFor3DVizuOptions.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources b/obj/x86/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.GUI.FormsForGraphsDisplay.Generic.FormPanelForHisto.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.HCSAnalyzer.resources b/obj/x86/Debug/HCSAnalyzer.HCSAnalyzer.resources new file mode 100644 index 0000000..a90f980 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.HCSAnalyzer.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.PlatesListForm.resources b/obj/x86/Debug/HCSAnalyzer.PlatesListForm.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.PlatesListForm.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Properties.Resources.resources b/obj/x86/Debug/HCSAnalyzer.Properties.Resources.resources new file mode 100644 index 0000000..7b27724 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Properties.Resources.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormFor3DVisu.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForCellTypeRelationships.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForInfoSingleCellPopInit_Simulator.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForRandSpecOfVar.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForSimuGenerator.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.FormForVariableDef.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.FormForNewCellType.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamCellCycle.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamGeneralForCellType.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForParamVelocity.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.NewCellType.PanelForTransitionMatrix.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellPopulations.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamCellTypes.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamGeneral.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamPlateDesign.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParamWorldDimensions.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.Simulator.Forms.Panels.PanelForParams3D.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources b/obj/x86/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.TMP_ToBeRemoved.FormTMP.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.TrustInfo.xml b/obj/x86/Debug/HCSAnalyzer.TrustInfo.xml new file mode 100644 index 0000000..f027c9c --- /dev/null +++ b/obj/x86/Debug/HCSAnalyzer.TrustInfo.xml @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/obj/x86/Debug/HCSAnalyzer.application b/obj/x86/Debug/HCSAnalyzer.application new file mode 100644 index 0000000..0a62c5b --- /dev/null +++ b/obj/x86/Debug/HCSAnalyzer.application @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + NP8t69KGowzFk4a4xnxhN2QFmdNgigDamOrZMeJvsiE= + + + + \ No newline at end of file diff --git a/obj/x86/Debug/HCSAnalyzer.cImageViewer.resources b/obj/x86/Debug/HCSAnalyzer.cImageViewer.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.cImageViewer.resources differ diff --git a/obj/x86/Debug/HCSAnalyzer.exe b/obj/x86/Debug/HCSAnalyzer.exe new file mode 100644 index 0000000..c6bf973 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.exe differ diff --git a/obj/x86/Debug/HCSAnalyzer.exe.manifest b/obj/x86/Debug/HCSAnalyzer.exe.manifest new file mode 100644 index 0000000..af3edb0 --- /dev/null +++ b/obj/x86/Debug/HCSAnalyzer.exe.manifest @@ -0,0 +1,965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8KOJnwib7U9JdLKRIi8YWOytNjiIiFViXVihhk80KsQ= + + + + + + + + + + + + MlvgoKHc8ZqLhru+z7L0NoTAC2Y4Sduw9zgSDMc7kKE= + + + + + + + + + + + + ROOsglSFnp4oKJRY9JZjOWgjZmJgOE2Fino8ko+ytHE= + + + + + + + + + + + + dOoGGvE9uB490Mj/QuL2GmwVX7p6Br73U0Rp0LaC6/Y= + + + + + + + + + + + + I26n5ALaj6ms4PfrFDOyKedcCJpFa2uqlmg4lMk+Pm4= + + + + + + + + + + + + orvTJce9vfsTnJVs0l3cLIVKW8J6DTMKcpEY0hX8x48= + + + + + + + + + + + + 8IzhgSOiUFUlqVUP2NiftA0mAvSp4MrWkVmYN05Ptlw= + + + + + + + + + + + + OwqhyweXx8w/t4mZJ9C8Me1eC/cpbL4t4AfwcONjWV4= + + + + + + + + + + + + UWH2aMLlI2dKoaGcuykhfwcs04J9zZsvN+UydZ6uG1w= + + + + + + + + + + + + T3pPGb3I8Y+lJPPes8AQvBnbnQoIaBnnR0Ixi44NVkA= + + + + + + + + + + + + /DVtur+HnWSULpUk52hXP5IjU+ELxV3Bx2YKD4MO/sI= + + + + + + + + + + + + xtKew1bu0hB/+/5L0wxQeRKE7n2eAH0aidhoGvodomw= + + + + + + + + + + + + pFFLzgsAfA+RrG/fyd1JX9SlTxI00KOoaZsxfVlNCPQ= + + + + + + + + + + + + JSRGnOx5Min0J6AkXr85eNEGWZJkRDcgLCdm7a455bI= + + + + + + + + + + + + LqcswZtROX7GtsKoPtYSDTmtFLd/+y1z7LGdeBUP9lM= + + + + + + + + + + + + bVaxaz2utuQjFWdvJ6JBPozuW94yUTUqyJeWvebUQD0= + + + + + + + + + + + + /advakMUFUP2zdPia1tFyiKZqtdBqlNZI1JsCC/tuDE= + + + + + + + + + + + + DE7mrDPZUhtxcBzZte/N7UAOVH7gMf0Y1nqH7nlzH8o= + + + + + + + + + + + + Zqi7bUZMKc71Ra4IxR3PjwpOYxDVoGRFWRPHqC7yfgQ= + + + + + + + + + + + + CFL7ewBHxybH0YEtPkyZ/1NUOw+0aslxcOchND7yz7M= + + + + + + + + + + + + wqQq374TSWtQHUfp70nTyDosjGFjcgZu7ohTONFB7X4= + + + + + + + + + + + + nLtFEWQq9LqfjTJ+P1CHx4s1qGauRrVETQE3yQJksD4= + + + + + + + + + + + + 1I0AW0SA/p/4cpayVGv3dXirugfWWL1uhLTnH44k/FU= + + + + + + + + + + + + 6zRtqzcEh4l0cvbl7FMiglD1zzUuG3+pj3PuejX3pa8= + + + + + + + + + + + + 7jk97KPFeCvbq1URUEGsWRVRfUXuh845xUyGfzL2P4M= + + + + + + + + + + + + kEsXbShajCmjdP9nIzREmPshLL+rZhFoSWt8S0xWTdw= + + + + + + + + + + + + w5hGrac1Gh+HSD070qT06C7MnWlNbeRDTQNl/qkhezo= + + + + + + + + + + + + OTAgwa9LTpjDE5bnj+FuUjlw9YgxipvW6Hy4VtSoi+s= + + + + + + + + + + + + 4FX9WU1Z0t2PdwDgx1xc1JeomZO3g5lQiHQF9vPaY64= + + + + + + + + + + + + nKECbYpu5JPf2QnU3zowrZAHe1iTIxQtUKEOZpsAyP0= + + + + + + + + + + + + Ktyzx0HR0//WOgP79hoN7obafRXXTLupTXa1u+FNurc= + + + + + + + + + + + + MHQayEZMIh3ooEzA8blC2q1bUeM94vxAcPd7RO34Y8A= + + + + + + + + + + + + uR39PCjv4qsMJrEAr3UY6Uto9j+w6oVFqIPYedSNP4s= + + + + + + + + + + + + quoc17XtvxXSG2uFE89cxqN6LWluIvkDJLZnFPhCSqo= + + + + + + + + + + + + dNNdP+gyRfeTv6aaeL4sy81FGMUkGj3n2eh6T/uMdT4= + + + + + + + + + + + + 4Y+jwhiQq+bqLOBQ4Q419Ga8oinjwmCFMbL0yZbOluE= + + + + + + + + + + + + VRNrGOI7Eqao15Zn+x1PROjnBe4P2hMDdhpCN906ctM= + + + + + + + + + + + + 9RtFrT2hHc0w7AySwKv5kj7t+WEeKhrg+V8SoKIOV7Q= + + + + + + + + + + + + JcqvRftiwBMXfTA1EuXhx9cPCIg9LNFd5OYnZC9pgMI= + + + + + + + + + + + + iP+0aOV+cIZBnhjVk7junLLxUKNNbYIZDyM9saNq66c= + + + + + + + + + + + + c2qaEVhfHpmvhvKqYrygbkEADogK0LdDnzpF7o6WY+A= + + + + + + + + + + + + b7qYEK4B2DGn+TLiBrZeVt2+ZI9daTDf5FLZqFdXBZQ= + + + + + + + + + + + + WcE8QTAUFF6HIkduMcHvTSaUH1PYP9fqieCijfbdk3k= + + + + + + + + + + + + IYSvp7pIOjt8unEI2xjNF0sf0NP4GkQWvokJdkp6V10= + + + + + + + + + + + + eGtZ2tznuTcJjjTN53Yp6KP5dI0iwD4Fy8fsz5Vqln0= + + + + + + + + + + + + BxjDLyGE/isXep8d+t/P/MLBdV3oT2WXMLojfhMzmvc= + + + + + + + + + + + + kmyGDNFNJGjHKLDiZyJbH3PnTRi7pcP2WsPocH9t83Q= + + + + + + + + + + + + 8hJyZUBkWNAb0geD9cMRzzdbLTnVwdA+aHYlK3b9g0Q= + + + + + + + + + + + + vVh/J0ypxp8GFxJbqQMaMbi5k3Fzcr3mQMJtD9v7j5g= + + + + + + + + + + + + 2wcQrKrt9SKkjJFpsft73X0RPZ1YAeGI8NzTMBWNMdI= + + + + + + + + + + + + veeJGlCkso/RwoTvFj9fiwmMSHQ5IEC37H3EG7OYjVo= + + + + + + + + + + + + uVuOW0FP3fnEzr02cSSq7HmRiLRBNzhrkmcmOucBOjI= + + + + + + + + + + + + hxV3+qsTJzt5/C9DdgAQUzJRvxeM8Qc5AD3y/yzw1OY= + + + + + + + + + + + + isqBFx7tOXKA0l5AeMof0r84VRi2y38xTYHBvDDWlS8= + + + + + + + + + + + + 4wKXB0Iu8uVcw2aMz+ADbWNfb1oVZTcnNfCIjdB3eJw= + + + + + + + + + + + + BP7EVxT4R2/XjSb5mXt2mxtecSp4Y+VHvpWeXhT/cvs= + + + + + + + + + + + + T7rkgGwP7my5YKuIEih91dnN+TAYEZYo2umJXTuDJ8U= + + + + + + + + + + + + wmA1PXzoVfv0P5Bxiu0VhtE7I5H5/i2q77nkRQxIpWM= + + + + + + + + + + + + jUUkMAZHEYAKpZNtYTYMJmiSQ4YIYHyvOUfdQum7a+U= + + + + + + + + + + + + AOJp8j/x7phKomo9bDR7cLpJM2svuB+dvd0seBlE+CQ= + + + + + + + + + + + + t9SfQ6zPy1Jv/GXjp6GxVsqM2tJfSAuPrF/RLaUZVqA= + + + + + + + + + + + + zrKGNYT1OyC+fCGh9IC8oEWgquZGI4V4vXUMNHAR1QQ= + + + + + + + + + + + + iGZyAXhWLUr7a0hOA4buoz7bbfGIfipQiTDxPU/AJf0= + + + + + + + + + + + + g49msnmXij1Vzkyjmm/lDNI/Q5LTibKAQuLFe1E76+g= + + + + + + + + + + YW7vPho7Zr+OmPJfQ+rtVJQ32cLG5zi/ybqfuPJzopA= + + + + + + + + + AOJzOomFU1O8eDvCEjjyNk/jG63GeS+46p+1Uw2WUcA= + + + + + + + + + riqnp/GV0TU9TOVK42QRSjnbJafehBgHAcFQnWsAIbg= + + + + + + + + + AJ2ThaNzw0s60ZlnY74ZNZrAQAbfREc4MmXi6CrukRQ= + + + + + + + + + P7l7JKeQFRtCUNerUEyoryN/X52C76maVCjEAbe3gW0= + + + + + + + + + QOX0W9BhofXgA3Jqwt3e/C5FCvIGCaNFomDQUNCHYho= + + + \ No newline at end of file diff --git a/obj/x86/Debug/HCSAnalyzer.pdb b/obj/x86/Debug/HCSAnalyzer.pdb new file mode 100644 index 0000000..d858456 Binary files /dev/null and b/obj/x86/Debug/HCSAnalyzer.pdb differ diff --git a/obj/x86/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources b/obj/x86/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/LibPlateAnalysis.FormForDescriptorInfo.resources differ diff --git a/obj/x86/Debug/LibPlateAnalysis.SimpleForm.resources b/obj/x86/Debug/LibPlateAnalysis.SimpleForm.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/LibPlateAnalysis.SimpleForm.resources differ diff --git a/obj/x86/Debug/LibPlateAnalysis.SimpleFormForXY.resources b/obj/x86/Debug/LibPlateAnalysis.SimpleFormForXY.resources new file mode 100644 index 0000000..c0ca53c Binary files /dev/null and b/obj/x86/Debug/LibPlateAnalysis.SimpleFormForXY.resources differ diff --git a/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll b/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..c6404b7 Binary files /dev/null and b/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/obj/x86/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/obj/x86/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/obj/x86/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/obj/x86/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/obj/x86/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/obj/x86/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..4154a4b --- /dev/null +++ b/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nupkg b/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nupkg new file mode 100644 index 0000000..3b04d4c Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nupkg differ diff --git a/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nuspec b/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nuspec new file mode 100644 index 0000000..3db589f --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/MathNet.Numerics.2.5.0.nuspec @@ -0,0 +1,65 @@ + + + + MathNet.Numerics + 2.5.0 + Math.NET Numerics + Marcus Cuda, Christoph Ruegg, Jurgen Van Gael + Marcus Cuda, Christoph Ruegg, Jurgen Van Gael + http://mathnetnumerics.codeplex.com/license + http://numerics.mathdotnet.com/ + http://www.mathdotnet.com/images/MathNet128.png + false + Math.NET Numerics is the numerical foundation of the Math.NET project, aiming to provide methods and algorithms for numerical computations in science, engineering and every day use. Numerics is the result of merging dnAnalytics with Math.NET Iridium and is intended to replace both. Also includes a portable build supporting .Net 4 and higher, SL5, WP8 and .NET for Windows Store apps. + Math.NET Numerics, providing methods and algorithms for numerical computations in science, engineering and every day use. Supports .Net 4 and higher, SL5, WP8 and .NET for Windows Store apps. + ### Potentially Breaking Changes: + +Despite semver this release contains two changes that may break code but without triggering a major version number change. The changes fix semantic bugs and a major usability issue without changing the formal API itself. Most users are not expected to be affected negatively. Nevertheless, this is an exceptional case and we try hard to avoid such changes in the future. + +- Statistics: Empty statistics now return NaN instead of either 0 or throwing an exception. *This may break code in case you relied upon the previous unusual and inconsistent behavior.* + +- Linear Algebra: More reasonable ToString behavior for matrices and vectors. *This may break code if you relied upon ToString to export your full data to text form intended to be parsed again later. Note that the classes in the MathNet.Numerics.IO library are more appropriate for storing and loading data.* + +### Statistics: + +- More consistent behavior for empty and single-element data sets: Min, Max, Mean, Variance, Standard Deviation etc. no longer throw exceptions if the data set is empty but instead return NaN. Variance and Standard Deviation will also return NaN if the set contains only a single entry. Population Variance and Population Standard Deviation will return 0 in this case. +- Reworked order statistics (Quantile, Quartile, Percentile, IQR, Fivenum, etc.), now much easier to use and supporting compatibility with all 9 R-types, Excel and Mathematica. The obsolete Percentile class now leverages the new order statistics, fixing a range check bug as side effect. +- New Hybrid Monte Carlo sampler for multivariate distributions. +- New financial statistics: absolute risk and return measures. +- Explicit statistics for sorted arrays, unsorted arrays and sequences/streams. Faster algorithms on sorted data, also avoids multiple enumerations. +- Some statistics like Quantile or empirical inverse CDF can optionally return a parametric function when multiple evaluations are needed, like for plotting. + +### Linear Algebra: + +- More reasonable ToString behavior for matrices and vectors: `ToString` methods no longer render the whole structure to a string for large data, among others because they used to wreak havoc in debugging and interactive scenarios like F# FSI. Instead, ToString now only renders an excerpt of the data, together with a line about dimension, type and in case of sparse data a sparseness indicator. The intention is to give a good idea about the data in a visually useful way. How much data is shown can be adjusted in the Control class. See also ToTypeString and ToVector/MatrixString. +- Performance: reworked and tuned common parallelization. Some operations are up to 3 magnitudes faster in some extreme cases. Replaced copy loops with native routines. More algorithms are storage-aware (and should thus perform better especially on sparse data). +- Fixed range checks in the Thin-QR decomposition. +- Fixed bug in Gram Schmidt for solving tall matrices. +- Vectors now implement the BCL IList interfaces (fixed-length) for better integration with existing .Net code. +- Matrix/Vector parsing has been updated to be able to parse the new visual format as well (see ToMatrixString). +- DebuggerDisplay attributes for matrices and vectors. +- Map/IndexedMap combinators with storage-aware and partially parallelized implementations for both dense and sparse data. +- Reworked Matrix/Vector construction from arrays, enumerables, indexed enumerables, nested enumerables or by providing an init function/lambda. Non-obsolete constructors now always use the raw data array directly without copying, while static functions always return a matrix/vector independent of the provided data source. +- F#: Improved extensions for matrix and vector construction: create, zeroCreate, randomCreate, init, ofArray2, ofRows/ofRowsList, ofColumns/ofSolumnsList, ofSeqi/Listi (indexed). Storage-aware for performance. +- F#: Updated map/mapi and other combinators to leverage core implementation, added -nz variants where zero-values may be skipped (relevant mostly for sparse matrices). +- F#: Idiomatic slice setters for sub-matrices and sub-vectors +- F#: More examples for matrix/vector creation and linear regression in the F# Sample-package. + +### Misc: + +- Control: Simpler usage with new static ConfigureAuto and ConfigureSingleThread methods. Resolved misleading configuration logic and naming around disabling parallelization. +- Control: New settings for linear algebra ToString behavior. +- Fixed range check in the Xor-shift pseudo-RNG. +- Parallelization: Reworked our common logic to avoid expensive lambda calls in inner loops. Tunable. +- F#: Examples (and thus the NuGet Sample package) are now F# scripts prepared for experimenting interactively in FSI, instead of normal F# files. Tries to get the assembly references right for most users, both within the Math.NET Numerics solution and the NuGet package. +- Various minor improvements on consistency, performance, tests, xml docs, obsolete attributes, redundant code, argument checks, resources, cleanup, nuget, etc. + math numeric statistics probability integration interpolation linear algebra matrix fft + + + + + + + + + \ No newline at end of file diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.dll b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.dll new file mode 100644 index 0000000..09c3a22 Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.dll differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.pdb b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.pdb new file mode 100644 index 0000000..d1854fb Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.pdb differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.xml b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.xml new file mode 100644 index 0000000..c390792 --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.IO.xml @@ -0,0 +1,1145 @@ + + + + MathNet.Numerics.IO + + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Base class to read a single from a file or stream. + + The type of Matrix to return. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Reads a from a file. + + The file to read the matrix from. + A containing the data from the file. is returned if the file is empty. + If is . + If the file doesn't exist. + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Reads a from a . + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + If is . + If a value is not a number or not in a valid format. + If a value represents a number less than or greater than . + + + + Subclasses override this method to do the actual reading. + + The to read the matrix from. + A matrix containing the data from the . is returned if the is empty. + + + + The function that will do the conversion for a given type. + + + + + Initializes static members of the class. + + + + + Converts the string into a Complex32. + + The number to convert. + The converted number. + + + + Converts the string into a Complex. + + The number to convert. + The converted number. + + + + Converts the string into a double. + + The number to convert. + The converted number. + + + + Converts the string into a float. + + The number to convert. + The converted number. + + + + Constructor to create matrix instance. + + + + + The base regular expression. + + + + + The regular expression to use. + + + + + The to use. + + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Performs the actual reading. + + The to read the matrix from. + + A matrix containing the data from the . is returned if the is empty. + + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + + + + Gets or sets a value indicating whether the files has a header row. + + + true if this instance has a header row; otherwise, false. + + Defaults to . + + + + Converts a string into the given data type. + + + The number as a string to convert. + + The converted number. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Creates matrices from Matlab files. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + The name of the file to read from. + + + + + The stream to read from if we are not reading from a file directly. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Reads the first matrix from the file or stream. + + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + + + + + Reads the named matrix from the file or stream. + + The name of the matrix to read. + + A sparse or dense matrix depending on how the matrix + is defined in the Matlab file. + is returned if a matrix with the requests name doesn't exist. + + + + + Reads all matrices from the file or stream. + + All matrices from the file or stream. The key to the + is the matrix's name. + + + + Reads the named matrices from the file or stream. + + The names of the matrices to retrieve. + + The named matrices from the file or stream. The key to the + is the matrix's name. + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + + Writes an to delimited text file. If the user does not + specify a delimiter, a tab separator is used. + + + + + Base class to write a single to a file or stream. + + + + + The to use. + + + + + Writes the given to the given file. If the file already exists, + the file will be overwritten. + + The matrix to write. + The file to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given stream. + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the given . + + The matrix to write. + The to write the matrix to. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Subclasses must implement this method to do the actually writing. + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to serialize. + The to write the matrix to. + The number format to use. + The culture to use. + + + + Gets or sets the to use when parsing the numbers. + + The culture info. + Defaults to CultureInfo.CurrentCulture. + This property is only used for matrix writers that write out text files. + + + + Gets or sets he number format to use. + + The number format to use when writing out each element. + This property is only used for matrix writers that write out text files. + + + + The delimiter to use. + + + + + Initializes a new instance of the class. + a comma as the delimiter. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Initializes a new instance of the class. + using the given delimiter. + + + the delimiter to use. + + + + + Writes the given to the given . + + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + The matrix to write. + The to write the matrix to. + The number format to use on each element. + The culture to use. + If either or is null. + + + + Gets or sets the column header values. + + The column header values. + Will write the column headers if the list is not empty or null. + + + + Writes matrices to a Matlab file. + + + + + The file header value + + + + + The length of the header text. + + + + + Have we written the header yet. + + + + + The binary writer to write to. + + + + + Initializes a new instance of the class. + + The name of the Matlab file to save the matrices to. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Writes the given to the file. + + The matrix to write. + The name of the matrix to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Writes the given to the file. + + The matrices to write. + The names of the matrices to store in the file. + If either or is null. + The data type of the Matrix. It can be either: double, float, Complex, or Complex32. + + + + Closes the stream the being written to. + + Calls . + + + + Writes the matrix tag and name. + + The writer we are using. + The array class we are writing. + if set to true if this a complex matrix. + The name name of the matrix. + The number of rows. + The columns of columns. + The maximum number of non-zero elements. + + + + Compresses the data array. + + The data to compress. + The compressed data. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the dense data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Gets the sparse data array. + + The matrix to get the data from. + The name of the matrix. + The matrix data as an array. + + + + Writes the compressed data. + + The data to write. + + + + Writes the file header. + + + + + Pads the data with the given byte. + + Where to write the pad values. + The number of bytes to pad. + What value to pad with. + + + + Computes the Adler-32 checksum of the given data. + + The data to create the checksum. + The checksum + + + + Enumeration for the Matlab array types + + + + + mxUNKNOWN CLASS + + + + + mxCELL CLASS + + + + + mxSTRUCT CLASS + + + + + mxOBJECT CLASS + + + + + mxCHAR CLASS + + + + + mxSPARSE CLASS + + + + + mxDOUBLE CLASS + + + + + mxSINGLE CLASS + + + + + mxINT8 CLASS + + + + + mxUINT8 CLASS + + + + + mxINT16 CLASS + + + + + mxUINT16 CLASS + + + + + mxINT32 CLASS + + + + + mxUINT32 CLASS + + + + + mxINT64 CLASS + + + + + mxUINT64 CLASS + + + + + mxFUNCTION CLASS + + + + + Matlab Array Flags + + + + + Complex flag + + + + + Global flag + + + + + Logical flag + + + + + Matlab data types + + + + + Unkown type + + + + + miINT8 type + + + + + miUINT8 type + + + + + miINT16 type + + + + + miUINT16 type + + + + + miINT32 type + + + + + miUINT32 type + + + + + miSINGLE type + + + + + miDOUBLE type + + + + + miINT64 type + + + + + miUINT6 4type + + + + + miMATRIX type + + + + + miCOMPRESSED type + + + + + miUTF8 type + + + + + miUTF16 type + + + + + miUTF32 type + + + + + Represents a Matlab file + + The data type of the matrix to return. + + + + Matrices in a matlab file stored as 1-D arrays + + + + + Gets or sets the header text. + + The header text. + + + + Gets or sets the first name of the matrix. + + The first name of the matrix. + + + + Gets the first matrix. + + The first matrix. + + + + Gets the matrices. + + The matrices. + + + + Parse a Matlab file + + The data type of the matrix. + + + + Large Block Size + + + + + Little Endian Indicator + + + + + Small Block Size + + + + + Holds the names of the matrices in the file. + + + + + The stream to read the matlab file from. + + + + + Initializes a new instance of the class. + + Name of the file. + + + + Initializes a new instance of the class. + + The stream to read from. + + + + Initializes a new instance of the class. + + The stream to read from. + The name of the objects to retrieve. + + + + Initializes a new instance of the class. + + Name of the file. + The name of the objects to retrieve. + + + + Copies the names of the objects to retrieve to a local field. + + The name of the objects to retrieve. + + + + Parses the file. + + The parsed Matlab file as a object. + + + + Aligns the data. + + The stream. + The size of the array. + if set to true if reading from a small block. + + + + Decompresses the block. + + The compressed data. + The type data type contained in the block. + The decompressed block. + + + + Adds a matrix from the actual file into our presentation of a matlab file. + + The data of the matrix. + The instance. + + + + Populates a sparse matrix. + + The reader. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The size of the block. + A populated sparse matrix. + + + + Populates the double sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the float sparse matrix. + + The matrix to populate + The Matlab data type. + The row indices. + The column indices. + The reader to read from. + + + + Populates the complex sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates the complex32 sparse matrix. + + The matrix to populate + The Matlab data type. + if set to true if the Matlab complex flag is set. + The row indices. + The column indices. + The reader to read from. + The length of the stored data. + + + + Populates a dense matrix. + + The Matlab data type. + The reader to read from. + if set to true if the Matlab complex flag is set. + The number of rows. + The number of columns. + The length of the stored data. + Returns a populated dense matrix. + + + + Populates the double dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Populates the complex dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the complex32 dense matrix. + + The matrix to populate. + The Matlab data type. + if set to true if the Matlab complex flag is set. + The reader to read from. + The number of rows. + The number of columns. + The length of the stored data. + + + + Populates the float dense matrix. + + The matrix to populate. + The Matlab data type. + The reader to read from. + The number of rows. + The number of columns. + + + + Creates a matrix. + + if set to true, creates a sparse matrix. + The number of rows. + The number of columns. + A matrix with the specified storage. + + + + Creates a from a delimited text file. If the user does not + specify a delimiter, then any whitespace is used. + + The type of the matrix to return. + + + + Initializes a new instance of the class using + any whitespace as the delimiter. + + + + + Initializes a new instance of the class. + + The delimiter to use. + + + + Initializes a new instance of the class. + + + The delimiter to use. + + + If is . + + + + + Creates matrices from Matlab files. + + + + + Initializes a new instance of the class. + + Name of the file to read matrices from. + + + + Initializes a new instance of the class. + + The stream to reader matrices from. + + + diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.dll b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.dll new file mode 100644 index 0000000..89f9e7d Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.dll differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.pdb b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.pdb new file mode 100644 index 0000000..90349fa Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.pdb differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.xml b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.xml new file mode 100644 index 0000000..6c9973f --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/lib/net40/MathNet.Numerics.xml @@ -0,0 +1,45847 @@ + + + + MathNet.Numerics + + + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + Supported data types are double, single, , and . + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiply elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. On exit, work[0] contains the optimal work size value. + + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix + The number of columns of B. + On exit, the solution matrix. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + The B matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Not used in the managed provider. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + How to transpose a matrix. + + + + + Don't transpose a matrix. + + + + + Transpose a matrix. + + + + + Conjugate transpose a complex matrix. + + If a conjugate transpose is used with a real matrix, then the matrix is just transposed. + + + + Types of matrix norms. + + + + + The 1-norm. + + + + + The Frobenius norm. + + + + + The infinity norm. + + + + + The largest absolute value norm. + + + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + Intel's Math Kernel Library (MKL) linear algebra provider. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows in the matrix. + The number of columns in the matrix. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex.One and beta set to Complex.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to Complex32.One and beta set to Complex32.Zero, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always Complex32.One + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0f and beta set to 0.0f, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0f + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. For real matrices, the work array should be at least + Max(3*Min(M, N) + Max(M, N), 5*Min(M,N)). For complex matrices, 2*Min(M, N) + Max(M, N). + On exit, work[0] contains the optimal work size value. + This is equivalent to the GESVD LAPACK routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + P/Invoke methods to the native math libraries. + + + + + Name of the native DLL. + + + + + Useful extension methods for Arrays. + + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Enumerative Combinatorics and Counting. + + + + + Counts the number of possible variations without repetition. + The order matters and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of distinct variations. + + + + Counts the number of possible variations with repetition. + The order matters and each object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of distinct variations with repetition. + + + + Counts the number of possible combinations without repetition. + The order does not matter and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of combinations. + + + + Counts the number of possible combinations with repetition. + The order does not matter and an object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of combinations with repetition. + + + + Counts the number of possible permutations (without repetition). + + Number of (distinguishable) elements in the set. + Maximum number of permutations without repetition. + + + + Extension methods for the Complex type provided by System.Numerics + + + + + Gets the squared magnitude of the Complex number. + + The number to perfom this operation on. + The squared magnitude of the Complex number. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex. + + + + Gets the conjugate of the Complex number. + + The number to perfom this operation on. + + The semantic of setting the conjugate is such that + + // a, b of type Complex32 + a.Conjugate = b; + + is equivalent to + + // a, b of type Complex32 + a = b.Conjugate + + + The conjugate of the number. + + + + Returns the multiplicative inverse of a complex number. + + + + + Exponential of this Complex (exp(x), E^x). + + The number to perfom this operation on. + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex (Base E). + + The number to perfom this operation on. + + The natural logarithm of this complex number. + + + + + Common Logarithm of this Complex (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex with custom base. + + The logarithm of this complex number. + + + + Raise this Complex to the given value. + + The number to perfom this operation on. + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex to the inverse of the given value. + + The number to perfom this operation on. + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex + + The number to perfom this operation on. + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex + + The number to perfom this operation on. + + The square root of this complex number. + + + + + Gets a value indicating whether the Complex32 is zero. + + The number to perfom this operation on. + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + The number to perfom this operation on. + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + The number to perfom this operation on. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + The number to perfom this operation on. + + true if this instance is NaN; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + The number to perfom this operation on. + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + The number to perfom this operation on. + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + The number to perfom this operation on. + + true if this instance is real nonnegative number; otherwise, false. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + The number to perfom this operation on. + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The number to perfom this operation on. + The value to compare with. + A norm of the difference between this and the other value. + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as double. + + + + + Converts the string representation of a complex number to a double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + A collection of frequently used mathematical constants. + + + + The number e + + + The number log[2](e) + + + The number log[10](e) + + + The number log[e](2) + + + The number log[e](10) + + + The number log[e](pi) + + + The number log[e](2*pi)/2 + + + The number 1/e + + + The number sqrt(e) + + + The number sqrt(2) + + + The number sqrt(1/2) = 1/sqrt(2) = sqrt(2)/2 + + + The number sqrt(3)/2 + + + The number pi + + + The number 2*pi + + + The number 1/pi + + + The number pi/2 + + + The number pi/4 + + + The number sqrt(pi) + + + The number sqrt(2pi) + + + The number sqrt(2*pi*e) + + + The number log(sqrt(2*pi)) + + + The number log(sqrt(2*pi*e)) + + + The number log(2 * sqrt(e / pi)) + + + The number 1/pi + + + The number 2/pi + + + The number 1/sqrt(pi) + + + The number 1/sqrt(2pi) + + + The number 2/sqrt(pi) + + + The number 2 * sqrt(e / pi) + + + The number (pi)/180 - factor to convert from Degree (deg) to Radians (rad). + + + + + The number (pi)/200 - factor to convert from NewGrad (grad) to Radians (rad). + + + + + The number ln(10)/20 - factor to convert from Power Decibel (dB) to Neper (Np). Use this version when the Decibel represent a power gain but the compared values are not powers (e.g. amplitude, current, voltage). + + + The number ln(10)/10 - factor to convert from Neutral Decibel (dB) to Neper (Np). Use this version when either both or neither of the Decibel and the compared values represent powers. + + + The Catalan constant + Sum(k=0 -> inf){ (-1)^k/(2*k + 1)2 } + + + The Euler-Mascheroni constant + lim(n -> inf){ Sum(k=1 -> n) { 1/k - log(n) } } + + + The number (1+sqrt(5))/2, also known as the golden ratio + + + The Glaisher constant + e^(1/12 - Zeta(-1)) + + + The Khinchin constant + prod(k=1 -> inf){1+1/(k*(k+2))^log(k,2)} + + + + The size of a double in bytes. + + + + + The size of an int in bytes. + + + + + The size of a float in bytes. + + + + + The size of a Complex in bytes. + + + + + The size of a Complex in bytes. + + + + Speed of Light in Vacuum: c_0 = 2.99792458e8 [m s^-1] (defined, exact; 2007 CODATA) + + + Magnetic Permeability in Vacuum: mu_0 = 4*Pi * 10^-7 [N A^-2 = kg m A^-2 s^-2] (defined, exact; 2007 CODATA) + + + Electric Permittivity in Vacuum: epsilon_0 = 1/(mu_0*c_0^2) [F m^-1 = A^2 s^4 kg^-1 m^-3] (defined, exact; 2007 CODATA) + + + Characteristic Impedance of Vacuum: Z_0 = mu_0*c_0 [Ohm = m^2 kg s^-3 A^-2] (defined, exact; 2007 CODATA) + + + Newtonian Constant of Gravitation: G = 6.67429e-11 [m^3 kg^-1 s^-2] (2007 CODATA) + + + Planck's constant: h = 6.62606896e-34 [J s = m^2 kg s^-1] (2007 CODATA) + + + Reduced Planck's constant: h_bar = h / (2*Pi) [J s = m^2 kg s^-1] (2007 CODATA) + + + Planck mass: m_p = (h_bar*c_0/G)^(1/2) [kg] (2007 CODATA) + + + Planck temperature: T_p = (h_bar*c_0^5/G)^(1/2)/k [K] (2007 CODATA) + + + Planck length: l_p = h_bar/(m_p*c_0) [m] (2007 CODATA) + + + Planck time: t_p = l_p/c_0 [s] (2007 CODATA) + + + Elementary Electron Charge: e = 1.602176487e-19 [C = A s] (2007 CODATA) + + + Magnetic Flux Quantum: theta_0 = h/(2*e) [Wb = m^2 kg s^-2 A^-1] (2007 CODATA) + + + Conductance Quantum: G_0 = 2*e^2/h [S = m^-2 kg^-1 s^3 A^2] (2007 CODATA) + + + Josephson Constant: K_J = 2*e/h [Hz V^-1] (2007 CODATA) + + + Von Klitzing Constant: R_K = h/e^2 [Ohm = m^2 kg s^-3 A^-2] (2007 CODATA) + + + Bohr Magneton: mu_B = e*h_bar/2*m_e [J T^-1] (2007 CODATA) + + + Nuclear Magneton: mu_N = e*h_bar/2*m_p [J T^-1] (2007 CODATA) + + + Fine Structure Constant: alpha = e^2/4*Pi*e_0*h_bar*c_0 [1] (2007 CODATA) + + + Rydberg Constant: R_infty = alpha^2*m_e*c_0/2*h [m^-1] (2007 CODATA) + + + Bor Radius: a_0 = alpha/4*Pi*R_infty [m] (2007 CODATA) + + + Hartree Energy: E_h = 2*R_infty*h*c_0 [J] (2007 CODATA) + + + Quantum of Circulation: h/2*m_e [m^2 s^-1] (2007 CODATA) + + + Fermi Coupling Constant: G_F/(h_bar*c_0)^3 [GeV^-2] (2007 CODATA) + + + Weak Mixin Angle: sin^2(theta_W) [1] (2007 CODATA) + + + Electron Mass: [kg] (2007 CODATA) + + + Electron Mass Energy Equivalent: [J] (2007 CODATA) + + + Electron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Electron Compton Wavelength: [m] (2007 CODATA) + + + Classical Electron Radius: [m] (2007 CODATA) + + + Tomson Cross Section: [m^2] (2002 CODATA) + + + Electron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Electon G-Factor: [1] (2007 CODATA) + + + Muon Mass: [kg] (2007 CODATA) + + + Muon Mass Energy Equivalent: [J] (2007 CODATA) + + + Muon Molar Mass: [kg mol^-1] (2007 CODATA) + + + Muon Compton Wavelength: [m] (2007 CODATA) + + + Muon Magnetic Moment: [J T^-1] (2007 CODATA) + + + Muon G-Factor: [1] (2007 CODATA) + + + Tau Mass: [kg] (2007 CODATA) + + + Tau Mass Energy Equivalent: [J] (2007 CODATA) + + + Tau Molar Mass: [kg mol^-1] (2007 CODATA) + + + Tau Compton Wavelength: [m] (2007 CODATA) + + + Proton Mass: [kg] (2007 CODATA) + + + Proton Mass Energy Equivalent: [J] (2007 CODATA) + + + Proton Molar Mass: [kg mol^-1] (2007 CODATA) + + + Proton Compton Wavelength: [m] (2007 CODATA) + + + Proton Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton G-Factor: [1] (2007 CODATA) + + + Proton Shielded Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Proton Shielded Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Neutron Mass: [kg] (2007 CODATA) + + + Neutron Mass Energy Equivalent: [J] (2007 CODATA) + + + Neutron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Neuron Compton Wavelength: [m] (2007 CODATA) + + + Neutron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Neutron G-Factor: [1] (2007 CODATA) + + + Neutron Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Deuteron Mass: [kg] (2007 CODATA) + + + Deuteron Mass Energy Equivalent: [J] (2007 CODATA) + + + Deuteron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Deuteron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Helion Mass: [kg] (2007 CODATA) + + + Helion Mass Energy Equivalent: [J] (2007 CODATA) + + + Helion Molar Mass: [kg mol^-1] (2007 CODATA) + + + Avogadro constant: [mol^-1] (2010 CODATA) + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 + + + The SI prefix factor corresponding to 1 000 + + + The SI prefix factor corresponding to 100 + + + The SI prefix factor corresponding to 10 + + + The SI prefix factor corresponding to 0.1 + + + The SI prefix factor corresponding to 0.01 + + + The SI prefix factor corresponding to 0.001 + + + The SI prefix factor corresponding to 0.000 001 + + + The SI prefix factor corresponding to 0.000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 000 001 + + + + Sets parameters for the library. + + + + + Given the number elements, should the operation be parallelized. + + The number elements to check. + true if the operation should be parallelized; false otherwise. + + + + Gets or sets a value indicating whether the distribution classes check validate each parameter. + For the multivariate distributions this could involve an expensive matrix factorization. + The default setting of this property is true. + + + + + Gets or sets a value indicating whether to use thread safe random number generators (RNG). + Thread safe RNG about two and half time slower than non-thread safe RNG. + + + true to use thread safe random number generators ; otherwise, false. + + + + + Gets or sets a value indicating whether parallelization shall be disabled globally. + + + + + Gets or sets the linear algebra provider. + + The linear algebra provider. + + + + Gets or sets a value indicating how many parallel worker threads shall be used + when parallelization is applicable. + + Default to the number of processor cores, must be between 1 and 1024 (inclusive). + + + + Gets or sets the the block size to use for + the native linear algebra provider. + + The block size. Default 512, must be at least 32. + + + + Gets or sets the order of the matrix when linear algebra provider + must calculate multiply in parallel threads. + + The order. Default 64, must be at least 3. + + + + Gets or sets the number of elements a vector or matrix + must contain before we multiply threads. + + Number of elements. Default 300, must be at least 3. + + + + Maximum number of columns to print in ToString methods by default. + + + + + Maximum number of rows to print in ToString methods by default. + + + + + 32-bit single precision complex numbers class. + + + + The class Complex32 provides all elementary operations + on complex numbers. All the operators +, -, + *, /, ==, != are defined in the + canonical way. Additional complex trigonometric functions + are also provided. Note that the Complex32 structures + has two special constant values and + . + + + + Complex32 x = new Complex32(1f,2f); + Complex32 y = Complex32.FromPolarCoordinates(1f, Math.Pi); + Complex32 z = (x + y) / (x - y); + + + + For mathematical details about complex numbers, please + have a look at the + Wikipedia + + + + + + Support Interface for Precision Operations (like AlmostEquals). + + Type of the implementing class. + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The value to compare with. + A norm of the difference between this and the other value. + + + + The real component of the complex number. + + + + + The imaginary component of the complex number. + + + + + Initializes a new instance of the Complex32 structure with the given real + and imaginary parts. + + The value for the real component. + The value for the imaginary component. + + + + Creates a complex number from a point's polar coordinates. + + A complex number. + The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number. + The phase, which is the angle from the line to the horizontal axis, measured in radians. + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to one and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to one. + + + + + Returns a new instance + with real and imaginary numbers positive infinite. + + + + + Returns a new instance + with real and imaginary numbers not a number. + + + + + Gets a value indicating whether the Complex32 is zero. + + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + + true if this instance is ; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + + true if this instance is real nonnegative number; otherwise, false. + + + + + Exponential of this Complex32 (exp(x), E^x). + + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex32 (Base E). + + The natural logarithm of this complex number. + + + + Common Logarithm of this Complex32 (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex32 with custom base. + + The logarithm of this complex number. + + + + Raise this Complex32 to the given value. + + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex32 to the inverse of the given value. + + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex32 + + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex32 + + + The square root of this complex number. + + + + + Equality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real and imaginary components of the two complex numbers are equal; false otherwise. + + + + Inequality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real or imaginary components of the two complex numbers are not equal; false otherwise. + + + + Unary addition. + + The complex number to operate on. + Returns the same complex number. + + + + Unary minus. + + The complex number to operate on. + The negated value of the . + + + Addition operator. Adds two complex numbers together. + The result of the addition. + One of the complex numbers to add. + The other complex numbers to add. + + + Subtraction operator. Subtracts two complex numbers. + The result of the subtraction. + The complex number to subtract from. + The complex number to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The complex numbers to add. + The float value to add. + + + Subtraction operator. Subtracts float value from a complex value. + The result of the subtraction. + The complex number to subtract from. + The float value to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The float value to add. + The complex numbers to add. + + + Subtraction operator. Subtracts complex value from a float value. + The result of the subtraction. + The float vale to subtract from. + The complex value to subtract. + + + Multiplication operator. Multiplies two complex numbers. + The result of the multiplication. + One of the complex numbers to multiply. + The other complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The float value to multiply. + The complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The complex number to multiply. + The float value to multiply. + + + Division operator. Divides a complex number by another. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a float value by a complex number. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a complex number by a float value. + The result of the division. + The dividend. + The divisor. + + + + Computes the conjugate of a complex number and returns the result. + + + + + Returns the multiplicative inverse of a complex number. + + + + + Converts the value of the current complex number to its equivalent string representation in Cartesian form. + + The string representation of the current instance in Cartesian form. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format for its real and imaginary parts. + + The string representation of the current instance in Cartesian form. + A standard or custom numeric format string. + + is not a valid format string. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified culture-specific formatting information. + + The string representation of the current instance in Cartesian form, as specified by . + An object that supplies culture-specific formatting information. + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format and culture-specific format information for its real and imaginary parts. + The string representation of the current instance in Cartesian form, as specified by and . + A standard or custom numeric format string. + An object that supplies culture-specific formatting information. + + is not a valid format string. + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + The hash code for the complex number. + + + The hash code of the complex number. + + + The hash code is calculated as + System.Math.Exp(ComplexMath.Absolute(complexNumber)). + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + + A norm of this value. + + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + + The value to compare with. + + + A norm of the difference between this and the other value. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as float. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Explicit conversion of a real decimal to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Explicit conversion of a Complex to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Implicit conversion of a real byte to a Complex32. + + The byte value to convert. + The result of the conversion. + + + + Implicit conversion of a real short to a Complex32. + + The short value to convert. + The result of the conversion. + + + + Implicit conversion of a signed byte to a Complex32. + + The signed byte value to convert. + The result of the conversion. + + + + Implicit conversion of a unsgined real short to a Complex32. + + The unsgined short value to convert. + The result of the conversion. + + + + Implicit conversion of a real int to a Complex32. + + The int value to convert. + The result of the conversion. + + + + Implicit conversion of a BigInteger int to a Complex32. + + The BigInteger value to convert. + The result of the conversion. + + + + Implicit conversion of a real long to a Complex32. + + The long value to convert. + The result of the conversion. + + + + Implicit conversion of a real uint to a Complex32. + + The uint value to convert. + The result of the conversion. + + + + Implicit conversion of a real ulong to a Complex32. + + The ulong value to convert. + The result of the conversion. + + + + Implicit conversion of a real float to a Complex32. + + The float value to convert. + The result of the conversion. + + + + Implicit conversion of a real double to a Complex32. + + The double value to convert. + The result of the conversion. + + + + Converts this Complex32 to a . + + A with the same values as this Complex32. + + + + Returns the additive inverse of a specified complex number. + + The result of the and components of the parameter multiplied by -1. + A complex number. + + + + Computes the conjugate of a complex number and returns the result. + + The conjugate of . + A complex number. + + + + Adds two complex numbers and returns the result. + + The sum of and . + The first complex number to add. + The second complex number to add. + + + + Subtracts one complex number from another and returns the result. + + The result of subtracting from . + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + + + Returns the product of two complex numbers. + + The product of the and parameters. + The first complex number to multiply. + The second complex number to multiply. + + + + Divides one complex number by another and returns the result. + + The quotient of the division. + The complex number to be divided. + The complex number to divide by. + + + + Returns the multiplicative inverse of a complex number. + + The reciprocal of . + A complex number. + + + + Returns the square root of a specified complex number. + + The square root of . + A complex number. + + + + Gets the absolute value (or magnitude) of a complex number. + + The absolute value of . + A complex number. + + + + Returns e raised to the power specified by a complex number. + + The number e raised to the power . + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a complex number. + + The complex number raised to the power . + A complex number to be raised to a power. + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a single-precision floating-point number. + + The complex number raised to the power . + A complex number to be raised to a power. + A single-precision floating-point number that specifies a power. + + + + Returns the natural (base e) logarithm of a specified complex number. + + The natural (base e) logarithm of . + A complex number. + + + + Returns the logarithm of a specified complex number in a specified base. + + The logarithm of in base . + A complex number. + The base of the logarithm. + + + + Returns the base-10 logarithm of a specified complex number. + + The base-10 logarithm of . + A complex number. + + + + Returns the sine of the specified complex number. + + The sine of . + A complex number. + + + + Returns the cosine of the specified complex number. + + The cosine of . + A complex number. + + + + Returns the tangent of the specified complex number. + + The tangent of . + A complex number. + + + + Returns the angle that is the arc sine of the specified complex number. + + The angle which is the arc sine of . + A complex number. + + + + Returns the angle that is the arc cosine of the specified complex number. + + The angle, measured in radians, which is the arc cosine of . + A complex number that represents a cosine. + + + + Returns the angle that is the arc tangent of the specified complex number. + + The angle that is the arc tangent of . + A complex number. + + + + Returns the hyperbolic sine of the specified complex number. + + The hyperbolic sine of . + A complex number. + + + + Returns the hyperbolic cosine of the specified complex number. + + The hyperbolic cosine of . + A complex number. + + + + Returns the hyperbolic tangent of the specified complex number. + + The hyperbolic tangent of . + A complex number. + + + + Gets the real component of the complex number. + + The real component of the complex number. + + + + Gets the real imaginary component of the complex number. + + The real imaginary component of the complex number. + + + + Gets the phase or argument of this Complex32. + + + Phase always returns a value bigger than negative Pi and + smaller or equal to Pi. If this Complex32 is zero, the Complex32 + is assumed to be positive real with an argument of zero. + + The phase or argument of this Complex32 + + + + Gets the magnitude (or absolute value) of a complex number. + + The magnitude of the current instance. + + + + Gets the squared magnitude (or squared absolute value) of a complex number. + + The squared magnitude of the current instance. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex32. + + + + Compound Monthly Return or Geometric Return or Annualized Return + + + + + + + Average Gain or Gain Mean + This is a simple average (arithmetic mean) of the periods with a gain. It is calculated by summing the returns for gain periods (return 0) + and then dividing the total by the number of gain periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Average Loss or LossMean + This is a simple average (arithmetic mean) of the periods with a loss. It is calculated by summing the returns for loss periods (return < 0) + and then dividing the total by the number of loss periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Calculation is similar to Standard Deviation , except it calculates an average (mean) return only for periods with a gain + and measures the variation of only the gain periods around the gain mean. Measures the volatility of upside performance. + © Copyright 1996, 1999 Gary L.Gastineau. First Edition. © 1992 Swiss Bank Corporation. + + + + + + + Similar to standard deviation, except this statistic calculates an average (mean) return for only the periods with a loss and then + measures the variation of only the losing periods around this loss mean. This statistic measures the volatility of downside performance. + + + + http://www.offshore-library.com/kb/statistics.php + + + + This measure is similar to the loss standard deviation except the downside deviation + considers only returns that fall below a defined minimum acceptable return (MAR) rather than the arithmetic mean. + For example, if the MAR is 7%, the downside deviation would measure the variation of each period that falls below + 7%. (The loss standard deviation, on the other hand, would take only losing periods, calculate an average return for + the losing periods, and then measure the variation between each losing return and the losing return average). + + + + + + + + A measure of volatility in returns below the mean. It's similar to standard deviation, but it only + looks at periods where the investment return was less than average return. + + + + + + + Measures a fund’s average gain in a gain period divided by the fund’s average loss in a losing + period. Periods can be monthly or quarterly depending on the data frequency. + + + + + + + Defines the base class for Matrix classes. + + + Defines the base class for Matrix classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns a that describes the type, dimensions and shape of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that summarizes this matrix. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + The value of 1.0. + + + + + The value of 0.0. + + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of this matrix with a scalar. + + The scalar to multiply with. + The result of the multiplication. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Divides each element of this matrix with a scalar. + + The scalar to divide with. + The result of the division. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.ColumnCount != rightSide.Count. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ). + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.ColumnCount. + If the result matrix's dimensions are not the this.RowCount x other.RowCount. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.ColumnCount. + If the other matrix is . + The result of the multiplication. + + + + Multiplies the transpose of this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != rightSide.Count. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Rows != other.RowCount. + If the result matrix's dimensions are not the this.ColumnCount x other.ColumnCount. + + + + Multiplies the transpose of this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Rows != other.RowCount. + If the other matrix is . + The result of the multiplication. + + + + Negate each element of this matrix. + + A matrix containing the negated values. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Complex conjugate each element of this matrix. + + A matrix containing the conjugated values. + + + + Complex conjugate each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Pointwise multiplies this matrix with another matrix. + + The matrix to pointwise multiply with this one. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise multiplication of this matrix and . + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Pointwise divide this matrix by another matrix. + + The matrix to pointwise subtract this one by. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise division of this matrix and . + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + A matrix containing the results. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Calculates the rank of the matrix + + effective numerical rank, obtained from SVD + + + Calculates the condition number of this matrix. + The condition number of the matrix. + The condition number is calculated using singular value decomposition. + + + Computes the determinant of this matrix. + The determinant of this matrix. + + + Computes the inverse of this matrix. + The inverse of this matrix. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + If other is . + The kronecker product of the two matrices. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + The kronecker product of the two matrices. + If other is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows * lower.rows) x (this.Columns * lower.Columns). + + + + Normalizes the columns of a matrix. + + The norm under which to normalize the columns under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Normalizes the rows of a matrix. + + The norm under which to normalize the rows under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Initializes a new instance of the Matrix class. + + + + + Constructs matrix from a list of column vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of column vectors. + Creates a matrix of size Max([i].Count) x .Count + + + + Constructs matrix from a list of row vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of row vectors. + Creates a matrix of size Max(.Count) x [i].Count + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + + + + Sets the value of the given element without range checking. + + + The row of the element. + + + The column of the element. + + + The value to set the element to. + + + + + Sets all values to zero. + + + + + Sets all values of a column to zero. + + + + + Sets all values of a row to zero. + + + + + Sets all values of a submatrix to zero. + + + + + Creates a clone of this instance. + + + A clone of the instance. + + + + + Copies the elements of this matrix to the given matrix. + + + The matrix to copy values into. + + + If target is . + + + If this and the target matrix do not have the same dimensions.. + + + + + Creates a Matrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A Matrix with the given dimensions. + + + Creates a matrix of the same matrix type as the current matrix. + + + + + Creates a Vector with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A Vector with the given dimension. + + + Creates a vector of the same type as the current matrix. + + + + + Copies a row into an Vector. + + The row to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of rows. + + + + Copies a row into to the given Vector. + + The row to copy. + The Vector to copy the row into. + If the result vector is . + If is negative, + or greater than or equal to the number of rows. + If this.Columns != result.Count. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of rows. + is negative, + or greater than or equal to the number of columns. + (columnIndex + length) >= Columns. + If is not positive. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Copies a column into a new Vector>. + + The column to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of columns. + + + + Copies a column into to the given Vector. + + The column to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If this.Rows != result.Count. + + + + Copies the requested column elements into a new Vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of columns. + is negative, + or greater than or equal to the number of rows. + (rowIndex + length) >= Rows. + + If is not positive. + + + + Copies the requested column elements into the given vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Returns the elements of the diagonal in a Vector. + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a new matrix and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Copies the values of the given Vector to the specified column. + + The column to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + + + + Copies the values of the given array to the specified column. + + The column to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + If the size of does not + equal the number of rows of this Matrix. + + + + Creates a new matrix and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Copies the values of the given Vector to the specified row. + + The row to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of the given array to the specified row. + + The row to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of a given matrix into a region in this matrix. + + The row to start copying to. + The number of rows to copy. Must be positive. + The column to start copying to. + The number of columns to copy. Must be positive. + The sub-matrix to copy from. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If is + the size of is not at least x . + If or + is not positive. + + + + Copies the values of the given Vector to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + + + + Concatenates this matrix with the given matrix. + + The matrix to concatenate. + The combined matrix. + + + + Concatenates this matrix with the given matrix and places the result into the result matrix. + + The matrix to concatenate. + The combined matrix. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Diagonally stacks his matrix on top of the given matrix. The new matrix is a M-by-N matrix, + where M = this.Rows + lower.Rows and N = this.Columns + lower.Columns. + The values of off the off diagonal matrices/blocks are set to zero. + + The lower, right matrix. + If lower is . + the combined matrix + + + + Diagonally stacks his matrix on top of the given matrix and places the combined matrix into the result matrix. + + The lower, right matrix. + The combined matrix + If lower is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows + lower.rows) x (this.Columns + lower.Columns). + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + For sparse matrices, the L2 norm is computed using a dense implementation of singular value decomposition. + In a later release, it will be replaced with a sparse implementation. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Returns an that enumerates over the matrix columns. + + An that enumerates over the matrix columns + + + + + Returns an that enumerates the requested matrix columns. + + The column to start enumerating over. + The number of columns to enumerating over. + An that enumerates over requested matrix columns. + + If: + is negative, + or greater than or equal to the number of columns. + (index + length) >= Columns. + + If is not positive. + + + + Returns an that enumerates the requested matrix rows. + + The row to start enumerating over. + The number of rows to enumerating over. + An that enumerates over requested matrix rows. + + If: + is negative, + or greater than or equal to the number of rows. + (index + length) >= Rows. + If is not positive. + + + + Returns an that enumerates over the matrix rows. + + An that enumerates over the matrix rows + + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Returns this matrix as a multidimensional array. + + A multidimensional containing the values of this matrix. + + + + Returns the matrix's elements as an array with the data laid out column-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 4, 7, 2, 5, 8, 3, 6, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Returns the matrix's elements as an array with the data laid row-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 2, 3, 4, 5, 6, 7, 8, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Applies a function to each value of this matrix and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Applies a function to each value of this matrix and replaces the value with its result. + The row and column indices of each value (zero-based) are passed as first arguments to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Gets the raw matrix data storage. + + + + + Gets the number of columns. + + The number of columns. + + + + Gets the number of rows. + + The number of rows. + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Defines the generic class for Vector classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a that describes the type, dimensions and shape of this vector. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that summarizes this vector. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + Returns a that summarizes this vector. + + + + + The zero value for type T. + + + + + The value of 1.0 for type T. + + + + + Initializes a new instance of the Vector class. + + + + Gets the value at the given without range checking.. + The index of the value to get or set. + The value of the vector at the given . + + + Sets the at the given without range checking.. + The index of the value to get or set. + The value to set. + + + + Resets all values to zero. + + + + + Sets all values of a subvector to zero. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + The number of rows. + The number of columns. + A matrix with the given dimensions. + + + + Creates a Vector of the given size using the same storage type + as this vector. + + The size of the Vector to create. + The new Vector. + + + + Negates vector and save result to + + Target vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The result of the division. + + + + Adds a scalar to each element of the vector. + + The scalar to add. + A copy of the vector with the scalar added. + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + If the result vector is . + If this vector and are not the same size. + + + + Returns a copy of this vector. + + This vector. + + Added as an alternative to the unary addition operator. + + + + + Adds another vector to this vector. + + The vector to add to this one. + A new vector containing the sum of both vectors. + If the other vector is . + If this vector and are not the same size. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Subtracts a scalar from each element of the vector. + + The scalar to subtract. + A new vector containing the subtraction of this vector and the scalar. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + If the result vector is . + If this vector and are not the same size. + + + + Returns a negated vector. + + The negated vector. + Added as an alternative to the unary negation operator. + + + + Negates vector and save result to + + Target vector + + + + Subtracts another vector from this vector. + + The vector to subtract from this one. + A new vector containing the subtraction of the the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Return vector with complex conjugate values of the source vector + + Conjugated vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Multiplies a scalar to each element of the vector. + + The scalar to multiply. + A new vector that is the multiplication of the vector and the scalar. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + If the result vector is . + If this vector and are not the same size. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + If is not of the same size. + If is . + + + + Divides each element of the vector by a scalar. + + The scalar to divide with. + A new vector that is the division of the vector and the scalar. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + If the result vector is . + If this vector and are not the same size. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector containing the result. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector. + + The vector to pointwise multiply with this one. + A new vector which is the pointwise multiplication of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector. + + The vector to pointwise divide this one by. + A new vector which is the pointwise division of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Returns a Vector containing the same values of . + + This method is included for completeness. + The vector to get the values from. + A vector containing the same values as . + If is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Adds a scalar to each element of a vector. + + The vector to add to. + The scalar value to add. + The result of the addition. + If is . + + + + Adds a scalar to each element of a vector. + + The scalar value to add. + The vector to add to. + The result of the addition. + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of a vector. + + The vector to subtract from. + The scalar value to subtract. + The result of the subtraction. + If is . + + + + Substracts each element of a vector from a scalar. + + The scalar value to subtract from. + The vector to subtract. + The result of the subtraction. + If is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of maximum element. + + The value of maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of the minimum element. + + The value of the minimum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Returns a deep-copy clone of the vector. + + A deep-copy clone of the vector. + + + + Set the values of this vector to the given values. + + The array containing the values to use. + If is . + If is not the same size as this vector. + + + + Copies the values of this vector into the target vector. + + The vector to copy elements into. + If is . + If is not the same size as this vector. + + + + Creates a vector containing specified elements. + + The first element to begin copying from. + The number of elements to copy. + A vector containing a copy of the specified elements. + If is not positive or + greater than or equal to the size of the vector. + If + is greater than or equal to the size of the vector. + + If is not positive. + + + + Copies the values of a given vector into a region in this vector. + + The field to start copying to + The number of fields to cpy. Must be positive. + The sub-vector to copy from. + If is + + + + Copies the requested elements from this vector to another. + + The vector to copy the elements to. + The element to start copying from. + The element to start copying to. + The number of elements to copy. + + + + Returns the data contained in the vector as an array. + + + The vector's data as an array. + + + + + Create a matrix based on this vector in column form (one single column). + + + This vector as a column matrix. + + + + + Create a matrix based on this vector in row form (one single row). + + + This vector as a row matrix. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an that contains the position and value of the element, for all non-zero elements. + + + An over this vector that contains the position and value of each element. + + + The enumerator returns a + with the first value being the element index and the second value + being the value of the element at that index. + The enumerator will exclude all elements with a zero value. + + + + + Applies a function to each value of this vector and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Applies a function to each value of this vector and replaces the value with its result. + The index of each value (zero-based) is passed as first argument to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Gets the raw vector data storage. + + + + + Gets the number of items. + + + + Gets or sets the value at the given . + The index of the value to get or set. + The value of the vector at the given . + If is negative or + greater than the size of the vector. + + + + Evaluation functions, useful for function approximation. + + + + + Evaluate polynomials. + + The coefficients of the polynomial. + The location where to evaluate the polynomial at. + the evaluation of the polynomial. + + + + Numerically stable series summation + + provides the summands sequentially + Sum + + + Evaluates the series of Chebyshev polynomials Ti at argument x/2. + The series is given by +
+                  N-1
+                   - '
+            y  =   >   coef[i] T (x/2)
+                   -            i
+                  i=0
+            
+ Coefficients are stored in reverse order, i.e. the zero + order term is last in the array. Note N is the number of + coefficients, not the order. +

+ If coefficients are for the interval a to b, x must + have been transformed to x -> 2(2x - b - a)/(b-a) before + entering the routine. This maps x from (a, b) to (-1, 1), + over which the Chebyshev polynomials are defined. +

+ If the coefficients are for the inverted interval, in + which (a, b) is mapped to (1/b, 1/a), the transformation + required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity, + this becomes x -> 4a/x - 1. +

+ SPEED: +

+ Taking advantage of the recurrence properties of the + Chebyshev polynomials, the routine requires one more + addition per loop than evaluating a nested polynomial of + the same degree. +

+ The coefficients of the polynomial. + Argument to the polynomial. + + Reference: https://bpm2.svn.codeplex.com/svn/Common.Numeric/Arithmetic.cs +

+ Marked as Deprecated in + http://people.apache.org/~isabel/mahout_site/mahout-matrix/apidocs/org/apache/mahout/jet/math/Arithmetic.html + + + +

+ Summation of Chebyshev polynomials, using the Clenshaw method with Reinsch modification. + + The no. of terms in the sequence. + The coefficients of the Chebyshev series, length n+1. + The value at which the series is to be evaluated. + + ORIGINAL AUTHOR: + Dr. Allan J. MacLeod; Dept. of Mathematics and Statistics, University of Paisley; High St., PAISLEY, SCOTLAND + REFERENCES: + "An error analysis of the modified Clenshaw method for evaluating Chebyshev and Fourier series" + J. Oliver, J.I.M.A., vol. 20, 1977, pp379-391 + +
+ + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the logistic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the harmonic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the error function. + + + + + The order of the approximation. + + + + + Auxiliary variable when evaluating the function. + + + + + Returns the modified Struve function of order 0. + + The value to compute the function of. + + + + + Returns the modified Struve function of order 1. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I0 and Struve L0 functions. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I1 and Struve L1 functions. + + The value to compute the function of. + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi0 * + ************************************** + + Chebyshev coefficients for exp(-x) I0(x) + in the interval [0, 8]. + + lim(x->0){ exp(-x) I0(x) } = 1. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I0(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi1 * + ************************************** + + Chebyshev coefficients for exp(-x) I1(x) / x + in the interval [0, 8]. + + lim(x->0){ exp(-x) I1(x) / x } = 1/2. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I1(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk0, bessk0e * + ************************************** + + Chebyshev coefficients for K0(x) + log(x/2) I0(x) + in the interval [0, 2]. The odd order coefficients are all + zero; only the even order coefficients are listed. + + lim(x->0){ K0(x) + log(x/2) I0(x) } = -EUL. + + + + Chebyshev coefficients for exp(x) sqrt(x) K0(x) + in the inverted interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K0(x) } = sqrt(pi/2). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk1, bessk1e * + ************************************** + + Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) + in the interval [0, 2]. + + lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. + + + + Chebyshev coefficients for exp(x) sqrt(x) K1(x) + in the interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). + + + + Returns the modified Bessel function of first kind, order 0 of the argument. +

+ The function is defined as i0(x) = j0( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of first kind, + order 1 of the argument. +

+ The function is defined as i1(x) = -i j1( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of the second kind + of order 0 of the argument. +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 0 of the argument. + + The value to compute the bessel function of. + + + + Returns the modified Bessel function of the second kind + of order 1 of the argument. +

+ The range is partitioned into the two intervals [0, 2] and + (2, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 1 of the argument. +

+ k1e(x) = exp(x) * k1(x). +

+ The value to compute the bessel function of. + +
+ + + Computes the logistic function. see: http://en.wikipedia.org/wiki/Logistic + + The parameter for which to compute the logistic function. + The logistic function of . + + + + Computes the logit function, the inverse of the sigmoid logistic function. see: http://en.wikipedia.org/wiki/Logit + + The parameter for which to compute the logit function. This number should be + between 0 and 1. + The logarithm of divided by 1.0 - . + + + + Computes the 'th Harmonic number. + + The Harmonic number which needs to be computed. + The t'th Harmonic number. + + + + Compute the generalized harmonic number of order n of m. (1 + 1/2^m + 1/3^m + ... + 1/n^m) + + The order parameter. + The power parameter. + General Harmonic number. + + + + Computes the logarithm of the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The logarithm of the Euler Beta function evaluated at z,w. + If or are not positive. + + + + Computes the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The Euler Beta function evaluated at z,w. + If or are not positive. + + + + Returns the lower incomplete (unregularized) beta function + I_x(a,b) = int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The lower incomplete (unregularized) beta function. + + + + Returns the regularized lower incomplete beta function + I_x(a,b) = 1/Beta(a,b) * int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The regularized lower incomplete beta function. + + + Calculates the error function. + The value to evaluate. + the error function evaluated at given value. + + + returns 1 if x == Double.PositiveInfinity. + returns -1 if x == Double.NegativeInfinity. + + + + + Calculates the complementary error function. + The value to evaluate. + the complementary error function evaluated at given value. + + + returns 0 if x == Double.PositiveInfinity. + returns 2 if x == Double.NegativeInfinity. + + + + + Calculates the inverse error function evaluated at z. + The inverse error function evaluated at given value. + + + returns Double.PositiveInfinity if z >= 1.0. + returns Double.NegativeInfinity if z <= -1.0. + + + Calculates the inverse error function evaluated at z. + value to evaluate. + the inverse error function evaluated at Z. + + + + Implementation of the error function. + + Where to evaluate the error function. + Whether to compute 1 - the error function. + the error function. + + + Calculates the complementary inverse error function evaluated at z. + The complementary inverse error function evaluated at given value. + We have tested this implementation against the arbitrary precision mpmath library + and found cases where we can only guarantee 9 significant figures correct. + + returns Double.PositiveInfinity if z <= 0.0. + returns Double.NegativeInfinity if z >= 2.0. + + + calculates the complementary inverse error function evaluated at z. + value to evaluate. + the complementary inverse error function evaluated at Z. + + + + The implementation of the inverse error function. + + First intermediate parameter. + Second intermediate parameter. + Third intermediate parameter. + the inverse error function. + + + + Initializes static members of the SpecialFunctions class. + + + + + Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up + to 22! exactly, all numbers up to 170! using a double representation. All larger values will overflow. + + A value value! for value > 0 + + If you need to multiply or divide various such factorials, consider using the logarithmic version + instead so you can add instead of multiply and subtract instead of divide, and + then exponentiate the result using . This will also circumvent the problem that + factorials become very large even for small parameters. + + + + + + Computes the logarithmic factorial function x -> ln(x!) of an integer number > 0. + + A value value! for value > 0 + + + + Computes the binomial coefficient: n choose k. + + A nonnegative value n. + A nonnegative value h. + The binomial coefficient: n choose k. + + + + Computes the natural logarithm of the binomial coefficient: ln(n choose k). + + A nonnegative value n. + A nonnegative value h. + The logarithmic binomial coefficient: ln(n choose k). + + + + Computes the multinomial coefficient: n choose n1, n2, n3, ... + + A nonnegative value n. + An array of nonnegative values that sum to . + The multinomial coefficient. + if is . + If or any of the are negative. + If the sum of all is not equal to . + + + + Polynomial coefficients for the approximation. + + + + + Computes the logarithm of the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which achieves an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + Our unit tests suggest that the accuracy of the Gamma function is correct up to 14 floating point digits. + + + + + Computes the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which should achieve an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + + Our unit tests suggest that the accuracy of the Gamma function is correct up to 13 floating point digits. + + + + + Returns the upper incomplete regularized gamma function + Q(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete regularized gamma function. + + + + Returns the upper incomplete gamma function + Gamma(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete gamma function. + + + + Returns the lower incomplete gamma function + gamma(a,x) = int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Returns the lower incomplete regularized gamma function + P(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Computes the Digamma function which is mathematically defined as the derivative of the logarithm of the gamma function. + This implementation is based on + Jose Bernardo + Algorithm AS 103: + Psi ( Digamma ) Function, + Applied Statistics, + Volume 25, Number 3, 1976, pages 315-317. + Using the modifications as in Tom Minka's lightspeed toolbox. + + The argument of the digamma function. + The value of the DiGamma function at . + + + + Computes the inverse Digamma function: this is the inverse of the logarithm of the gamma function. This function will + only return solutions that are positive. + This implementation is based on the bisection method. + + The argument of the inverse digamma function. + The positive solution to the inverse DiGamma function at . + + + + Numerically stable exponential minus one, i.e. x -> exp(x)-1 + + A number specifying a power. + Returns exp(power)-1. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Statistics operating on arrays assumed to be unsorted. + WARNING: Methods with the Inplace-suffix may modify the data array by reordering its entries. + + + + + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the order statistic (order 1..N) from the unsorted data array. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the p-Percentile value from the unsorted data array. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the third quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the inter-quartile range from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + Quantile definition, to choose what product/definition it should be consistent with + + + + Statistics operating on an IEnumerable in a single pass, without keeping the full data in memory. + Can be used in a streaming way, e.g. on large datasets not fitting into memory. + + + + + + + + Returns the smallest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Returns the largest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Statistics operating on an array already sorted ascendingly. + + + + + + + + Returns the smallest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the largest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the order statistic (order 1..N) from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the p-Percentile value from the sorted data array (ascending). + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the third quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the inter-quartile range from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + The Cauchy distribution is a symmetric continuous probability distribution. For details about this distribution, see + Wikipedia - Cauchy distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for continuous univariate distributions. + + + + + The interface for univariate distributions. + + + + + Computes the cumulative distribution function (cdf) for this probability distribution. + + The location at which to compute the cumulative distribution function. + the cumulative distribution at location . + + + + Gets or sets the random number generator which is used to generate random samples from the distribution. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + The probability density of the distribution. + + The location at which to compute the density. + the density at . + + + + The log probability density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by a double. + + + + + Gets the largest element in the domain of the distributions which can be represented by a double. + + + + + The scale of the Cauchy distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class with the location parameter set to 0 and the scale parameter set to 1 + + + + + Initializes a new instance of the class. + + + The location parameter for the distribution. + + + The scale parameter for the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + Location parameter. + Scale parameter. Must be greater than 0. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Location parameter. + Scale parameter. Must be greater than 0. + True when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Chi distribution. This distribution is + a continuous probability distribution. The distribution usually arises when a k-dimensional vector's orthogonal + components are independent and each follow a standard normal distribution. The length of the vector will + then have a chi distribution. + Wikipedia - Chi distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the degrees of freedom for the Chi distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Chi distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Chi distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Chi distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + Degrees of Freedom + a random number from the distribution. + + + + Generates a sample from the Chi distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Chi distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + Degrees of Freedom + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + Degrees of Freedom + a sequence of samples from the distribution. + + + + Gets or sets the degrees of freedom of the Chi distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the ChiSquare distribution. This distribution is + a sum of the squares of k independent standard normal random variables. + Wikipedia - ChiSquare distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the ChiSquare distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the ChiSquare distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the ChiSquare distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The degrees of freedom. + a random number from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ChiSquare distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Gets or sets the degrees of freedom of the ChiSquare distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Erlang distribution. This distribution is + is a continuous probability distribution with wide applicability primarily due to its + relation to the exponential and Gamma distributions. + Wikipedia - Erlang distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Erlang shape parameter. + + + + + Erlang inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape of the Erlang distribution. + + + The inverse scale of the Erlang distribution. + + + + + Constructs a Erlang distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The scale of the Erlang distribution. + a normal distribution. + + + + Constructs a Erlang distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + a normal distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the Erlang distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the density. + the density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Erlang Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Erlang distributed random variable. + + + + Generates a sample from the Erlang distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Erlang distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Erlang distribution. + + + + + Gets or sets the scale of the Erlang distribution. + + + + + Gets or sets the inverse scale of the Erlang distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum value. + + + + + Gets the Maximum value. + + + + + The exponential distribution is a distribution over the real numbers parameterized by one non-negative parameter. + Wikipedia - exponential distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The lambda parameter of the Exponential distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter of the Exponential distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + Lambda parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Lambda parameter. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + a sequence of samples from the distribution. + + + + Draws a random sample from the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a sequence of samples from the distribution. + + + + Gets or sets the lambda parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the FisherSnedecor distribution. For details about this distribution, see + Wikipedia - FisherSnedecor distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The first parameter - degree of freedom. + + + + + The second parameter - degree of freedom. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The first parameter - degree of freedom. + + + The second parameter - degree of freedom. + + + + + Sets the parameters of the distribution after checking their validity. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + + + + Checks whether the parameters of the distribution are valid. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates one sample from the FisherSnedecor distribution without parameter checking. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a FisherSnedecor distributed random number. + + + + Generates a sample from the FisherSnedecor distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the FisherSnedecor distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sequence of samples from the distribution. + + + + Gets or sets the first parameter - degree of freedom. + + + + + Gets or sets the second parameter - degree of freedom. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The inverse Gamma distribution is a distribution over the positive real numbers parameterized by + two positive parameters. + Wikipedia - InverseGamma distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Inverse Gamma shape parameter. + + + + + Inverse Gamma scale parameter scale. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape (alpha) parameter. + + + + + Gets or sets The scale (beta) parameter. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Throws . + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Laplace distribution is a distribution over the real numbers parameterized by a mean and + scale parameter. The PDF is: + p(x) = \frac{1}{2 * scale} \exp{- |x - mean| / scale}. + Wikipedia - Laplace distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale of the Laplace distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class (location = 0, scale = 1). + + + + + Initializes a new instance of the class. + + + The location for the Laplace distribution. + + + The scale for the Laplace distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Samples a Laplace distributed random variable. + + a sample from the distribution. + + + + Generates a sample from the Laplace distribution. + + a sample from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Laplace distribution. + + + + + Gets or sets the scale of the Laplace distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Pareto distribution is a power law probability distribution that coincides with social, + scientific, geophysical, actuarial, and many other types of observable phenomena. + For details about this distribution, see + Wikipedia - Pareto distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The shape parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + The shape parameter of the distribution. + + + If or are negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + The shape parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + The shape parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Pareto distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + The shape parameter. + a random number from the Pareto distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Pareto distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the shape parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Rayleigh distribution (pronounced /ˈreɪli/) is a continuous probability distribution. As an + example of how it arises, the wind speed will have a Rayleigh distribution if the components of + the two-dimensional wind velocity vector are uncorrelated and normally distributed with equal variance. + For details about this distribution, see + Wikipedia - Rayleigh distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Rayleigh distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + a random number from the Rayleigh distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Rayleigh distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + A random variable is said to be stable (or to have a stable distribution) if it has + the property that a linear combination of two independent copies of the variable has + the same distribution, up to location and scale parameters. + For details about this distribution, see + Wikipedia - Stable distribution. + + The distribution will use the by default.` + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The stability parameter of the distribution. + + + + + The skewness parameter of the distribution. + + + + + The scale parameter of the distribution. + + + + + The location parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The stability parameter of the distribution. + + + The skewness parameter of the distribution. + + + The scale parameter of the distribution. + + + The location parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + Throws a not supported exception if Alpha != 2, (Alpha != 1 and Beta !=0), or (Alpha != 0.5 and Beta != 1) + + + + Computes the cumulative distribution function of the Levy distribution. + + The scale parameter. + The location parameter. + The location at which to compute the cumulative density. + + the cumulative density at . + + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the density of the Levy distribution. + + The scale parameter of the distribution. + The location parameter of the distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Stable distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the stability parameter of the distribution. + + + + + Gets or sets The skewness parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets he entropy of the distribution. + + Always throws a not supported exception. + + + + Gets the skewness of the distribution. + + Throws a not supported exception of Alpha != 2. + + + + Gets the mode of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the median of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Conway-Maxwell-Poisson distribution is a generalization of the Poisson, Geometric and Bernoulli + distributions. It is parameterized by two real numbers "lambda" and "nu". For + + nu = 0 the distribution reverts to a Geometric distribution + nu = 1 the distribution reverts to the Poisson distribution + nu -> infinity the distribution converges to a Bernoulli distribution + + This implementation will cache the value of the normalization constant. + Wikipedia - ConwayMaxwellPoisson distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for discrete univariate distributions. + + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Since many properties of the distribution can only be computed approximately, the tolerance + level specifies how much error we accept. + + + + + The mean of the distribution. + + + + + The variance of the distribution. + + + + + Caches the value of the normalization constant. + + + + + The lambda parameter. + + + + + The nu parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter. + + + The nu parameter. + + + + + Sets the parameters of the distribution after checking their validity. + + The lambda parameter. + The nu parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The lambda parameter. + The nu parameter. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the ConwayMaxwellPoisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the log probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Computes an approximate normalization constant for the CMP distribution. + + The lambda parameter for the CMP distribution. + The nu parameter for the CMP distribution. + + an approximate normalization constant for the CMP distribution. + + + + + Returns one trials from the distribution. + + The random number generator to use. + The lambda parameter + The nu parameter. + The z parameter. + + One sample from the distribution implied by , , and . + + + + + Samples a Conway-Maxwell-Poisson distributed random variable. + + a sample from the distribution. + + + + Samples a sequence of a Conway-Maxwell-Poisson distributed random variables. + + + a sequence of samples from a Conway-Maxwell-Poisson distribution. + + + + + Samples a random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Gets or sets the lambda parameter. + + The value of the lambda parameter. + + + + Gets or sets the Nu parameter. + + The value of the Nu parameter. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the normalization constant of the Conway-Maxwell-Poisson distribution. + + + + + The Geometric distribution is a distribution over positive integers parameterized by one positive real number. + This implementation of the Geometric distribution will never generate 0's. + Wikipedia - geometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The geometric distribution parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Geometric class. + + The probability of generating one. + If the Geometric parameter is not in the range [0,1]. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Returns one sample from the distribution. + + The random number generator to use. + The p parameter + + One sample from the distribution implied by . + + + + + Samples a Geometric distributed random variable. + + A sample from the Geometric distribution. + + + + Samples an array of Geometric distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The p parameter + + + + Samples a sequence of this random variable. + + The random number generator to use. + The p parameter + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a not supported exception. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the Hypergeometric distribution. This distribution is + a discrete probability distribution that describes the number of successes in a sequence + of n draws from a finite population without replacement, just as the binomial distribution + describes the number of successes for draws with replacement + Wikipedia - Hypergeometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The size of the population. + + + + + The m parameter of the distribution. + + + + + The n parameter (number to draw) of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Hypergeometric class. + + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Hypergeometric distribution without doing parameter checking. + + The random number generator to use. + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + a random number from the Hypergeometric distribution. + + + + Samples a Hypergeometric distributed random variable. + + The number of successes in n trials. + + + + Samples an array of Hypergeometric distributed random variables. + + a sequence of successes in n trials. + + + + Samples a random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the population size. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the m parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The negative binomial is a distribution over the natural numbers with two parameters r,p. For the special + case that r is an integer one can interpret the distribution as the number of tails before the r'th head + when the probability of head is p. + Wikipedia - NegativeBinomial distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The r parameter of the distribution. + + + + + The p parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The number of trials. + The probability of a trial resulting in success. + + + + Sets the parameters of the distribution after checking their validity. + + The number of trials. + The probability of a trial resulting in success. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The number of trials. + The probability of a trial resulting in success. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the NegativeBinomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Samples a negative binomial distributed random variable. + + The random number generator to use. + The r parameter. + The p parameter. + a sample from the distribution. + + + + Samples a NegativeBinomial distributed random variable. + + a sample from the distribution. + + + + Samples an array of NegativeBinomial distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Gets or sets the number of trials. + + + + + Gets or sets the probability of success. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Pseudo-random generation of poisson distributed deviates. + + + Distribution is described at Wikipedia - Poisson distribution. + Knuth's method is used to generate Poisson distributed random variables. + f(x) = exp(-λ)*λ^x/x!; + + + + + The Poisson distribution parameter λ. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The Poisson distribution parameter λ. + If is equal or less then 0.0. + + + + Sets the parameters of the distribution after checking their validity. + + The mean (λ) of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean (λ) of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Poisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Poisson distribution. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by Knuth's method. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by "Rejection method PA". + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + "Rejection method PA" from "The Computer Generation of Poisson Random Variables" by A. C. Atkinson, + Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28, No. 1. (1979) + The article is on pages 29-35. The algorithm given here is on page 32. + + + + Samples a Poisson distributed random variable. + + A sample from the Poisson distribution. + + + + Samples an array of Poisson distributed random variables. + + a sequence of successes in N trials. + + + + Samples a Poisson distributed random variable. + + The random number generator to use. + The Poisson distribution parameter λ. + A sample from the Poisson distribution. + + + + Samples a sequence of Poisson distributed random variables. + + The random number generator to use. + The Poisson distribution parameter λ. + a sequence of samples from the distribution. + + + + Gets or sets the Poisson distribution parameter λ. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Zipf's law, an empirical law formulated using mathematical statistics, refers to the fact + that many types of data studied in the physical and social sciences can be approximated with + a Zipfian distribution, one of a family of related discrete power law probability distributions. + For details about this distribution, see + Wikipedia - Zipf distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The s parameter of the distribution. + + + + + The n parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The s parameter of the distribution. + + + The n parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The s parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The s parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The integer location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Zipf distribution without doing parameter checking. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + a random number from the Zipf distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of zipf distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the s parameter of the distribution. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the inverse Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The inverse Wishart distribution + is the conjugate prior for the covariance matrix of a multivariate normal distribution. + Wikipedia - Inverse-Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the inverse Wishart distribution. + + + + + The scale matrix for the inverse Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the inverse Wishart distribution. + + + The scale matrix for the inverse Wishart distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the inverse Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + a sample from the distribution. + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sample from the distribution. + + + + Gets or sets the degrees of freedom for the inverse Wishart distribution. + + + + + Gets or sets the scale matrix for the inverse Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + A. O'Hagan, and J. J. Forster (2004). Kendall's Advanced Theory of Statistics: Bayesian Inference. 2B (2 ed.). Arnold. ISBN 0-340-80752-0. + + + + Gets the variance of the distribution. + + The variance of the distribution. + Kanti V. Mardia, J. T. Kent and J. M. Bibby (1979). Multivariate Analysis. + + + + This class implements functionality for matrix valued normal distributions. The distribution + is parameterized by a mean matrix (M), a covariance matrix for the rows (V) and a covariance matrix + for the columns (K). If the dimension of M is d-by-m then V is d-by-d and K is m-by-m. + Wikipedia - MatrixNormal distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The mean of the matrix normal distribution. + + + + + The covariance matrix for the rows. + + + + + The covariance matrix for the columns. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The mean of the matrix normal. + + + The covariance matrix for the rows. + + + The covariance matrix for the columns. + + + If the dimensions of the mean and two covariance matrices don't match. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the matrix normal distribution. + + The matrix at which to evaluate the density at. + the density at + If the argument does not have the correct dimensions. + + + + Samples a matrix normal distributed random variable. + + A random number from this distribution. + + + + Samples a matrix normal distributed random variable. + + The random number generator to use. + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + If the dimensions of the mean and two covariance matrices don't match. + a sequence of samples from the distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The covariance matrix of the vector normal distribution. + a sequence of samples from defined distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The Cholesky factorization of the covariance matrix. + a sequence of samples from defined distribution. + + + + Gets or sets the mean. (M) + + The mean of the distribution. + + + + Gets or sets the row covariance. (V) + + The row covariance. + + + + Gets or sets the column covariance. (K) + + The column covariance. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + This class implements functionality for the Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The Wishart distribution + is the conjugate prior for the precision (inverse covariance) matrix of the multivariate + normal distribution. + Wikipedia - Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the Wishart distribution. + + + + + The scale matrix for the Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Wishart distribution. + + + The scale matrix for the Wishart distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Evaluates the probability density function for the Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + A random number from this distribution. + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sequence of samples from the distribution. + + + + Samples the distribution. + + The random number generator to use. + The nu parameter to use. + The S parameter to use. + The cholesky decomposition to use. + a random number from the distribution. + + + + Gets or sets the degrees of freedom for the Wishart distribution. + + + + + Gets or sets the scale matrix for the Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + + + + Gets the variance of the distribution. + + The variance of the distribution. + + + + Retrieves the requested element without range checking. + + The index of the element. + The requested element. + Not range-checked. + + + + Sets the element without range checking. + + The index of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given index, with range checking. + + + The index of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this vector can be set to any value. + False if some fields are fixed. + + + + + Array that contains the indices of the non-zero values. + + + + + Array that contains the non-zero elements of the vector. + + + + + Gets the number of non-zero elements in the vector. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed, like an off-diagonal field on a diagonal matrix. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this matrix can be set to any value. + False if some fields are fixed, like on a diagonal matrix. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + Supported data types are double, single, , and . + + + + Classes that solves a system of linear equations, AX = B. + + Supported data types are double, single, , and . + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, Ax = b + + The right hand side vector, b. + The left hand side Vector, x. + + + + Solves a system of linear equations, Ax = b. + + The right hand side vector, b. + The left hand side Matrix>, x. + + + + Internal method which routes the call to perform the Cholesky factorization to the appropriate class. + + The matrix to factor. + A cholesky factorization object. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets the lower triangular form of the Cholesky matrix + + + + + Gets the lower triangular form of the Cholesky matrix. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + An EVD object. + + + Returns the eigen values as a . + The eigen values. + + + Returns the right eigen vectors as a . + The eigen vectors. + + + Returns the block diagonal eigenvalue matrix . + The block diagonal eigenvalue matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether matrix is symmetric or not + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Gets or sets the eigen values (λ) of matrix in ascending value. + + + + + Gets or sets eigenvectors. + + + + + Gets or sets the block diagonal eigenvalue matrix. + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + Supported data types are double, single, , and . + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + The type of QR factorization to perform. + A QR factorization object. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets orthogonal Q matrix + + + + + Gets or sets upper triangular factor R + + + + + The QR factorization method. + + + + + Gets orthogonal Q matrix + + + + + Gets the upper triangular factor R. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + A QR factorization object. + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + Supported data types are double, single, , and . + + + + Value of one for T. + + + + + Internal method which routes the call to perform the LU factorization to the appropriate class. + + The matrix to factor. + An LU factorization object. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + Gets or sets both the L and U factors in the same matrix. + + + + + Gets or sets the pivot indices of the LU factorization. + + + + + Gets the lower triangular factor. + + + + + Gets the upper triangular factor. + + + + + Gets the permutation applied to LU factorization. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + Compute the singular U and VT vectors or not. + An SVD object. + + + Returns the left singular vectors as a . + The left singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + + + Returns the right singular vectors as a . + The right singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + This is the transpose of the V matrix. + + + Returns the singular values as a diagonal . + The singular values as a diagonal . + + + Returns the singular values as a . + the singular values as a . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether to compute U and VT matrices during SVD factorization or not + + + + + Gets or sets the singular values (Σ) of matrix in ascending value. + + + + + Gets or sets left singular vectors (U - m-by-m unitary matrix) + + + + + Gets or sets transpose right singular vectors (transpose of V, an n-by-n unitary matrix + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Complex32 version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + Complex version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A Complex dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + double version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + double version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + A setup functions to help simplify the generic code. + + + + + Sets the value of 1.0 for type T. + + The type to return the value of 1.0 of. + The value of 1.0 for type T. + + + + Sets the value of 0.0 for type T. + + The type to return the value of 0.0 of. + The value of 0.0 for type T. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex32 value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex32 value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex32 value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A Complex32 dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex32 dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex32 value z1 + Complex32 value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex value z1 + Complex value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A vector using dense storage. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + float version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + float version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + The type of QR factorization go perform. + + + + + Compute the full QR factorization of a matrix. + + + + + Compute the thin QR factorixation of a matrix. + + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + It may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + The collection of iterative solver setups. Stored based on the + ratio between the relative speed and relative accuracy. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + + + + Loads the available objects from the assembly specified by the file location. + + The fully qualified path to the assembly. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was canceled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Indicates that a calculation was cancelled by the user. + + + + + Defines the base interface for calculation status objects. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has converged to the desired convergence levels. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation diverged. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has failed for some reason. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the state of the calculation is indetermined, not started or stopped. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation is running and no results are yet known. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation has been stopped due to reaching the stopping + limits, but that convergence was not achieved. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clone this object + + Object clone + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Clones the current and its settings. + + A new instance of the object. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Iteration stop criteria. + + + + + Monitor calculation failures in the iterative calculation. + + + + + Monitor the calculation for signs of divergence. + + + + + Guard the calculation against unlimited continuation + by monitoring user specified limits, e.g. the maximum number of iterations. + + + + + Monitor the calculation for convergence, usually + based on the residuals of the calculation. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + The array containing the row indices of the existing rows. Element "j" of the array gives the index of the + element in the array that is first non-zero element in a row "j" + + + + + An array containing the column indices of the non-zero values. Element "I" of the array + is the number of the column in matrix that contains the I-th value in the array. + + + + + Array that contains the non-zero elements of matrix. Values of the non-zero elements of matrix are mapped into the values + array using the row-major storage mapping described in a compressed sparse row (CSR) format. + + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + Delete value from internal storage + + Index of value in nonZeroValues array + Row number of matrix + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Find item Index in nonZeroValues array + + Matrix row index + Matrix column index + Item index + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Class to represent a permutation for a subset of the natural numbers. + + + + + Entry _indices[i] represents the location to which i is permuted to. + + + + + Initializes a new instance of the Permutation class. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + + + + Computes the inverse of the permutation. + + The inverse of the permutation. + + + + Construct an array from a sequence of inversions. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + The set of inversions to construct the permutation from. + A permutation generated from a sequence of inversions. + + + + Construct a sequence of inversions from the permutation. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + A sequence of inversions. + + + + Checks whether the array represents a proper permutation. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + True if represents a proper permutation, false otherwise. + + + + Gets the number of elements this permutation is over. + + + + + Computes where permutes too. + + The index to permute from. + The index which is permuted to. + + + + Implements the Beta distribution. For details about this distribution, see + Wikipedia - Beta distribution. + + + There are a few special cases for the parameterization of the Beta distribution. When both + shape parameters are positive infinity, the Beta distribution degenerates to a point distribution + at 0.5. When one of the shape parameters is positive infinity, the distribution degenerates to a point + distribution at the positive infinity. When both shape parameters are 0.0, the Beta distribution + degenerates to a Bernoulli distribution with parameter 0.5. When one shape parameter is 0.0, the + distribution degenerates to a point distribution at the non-zero shape parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Beta shape parameter a. + + + + + Beta shape parameter b. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Beta class. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + If any of the Beta parameters are negative. + + + + A string representation of the distribution. + + A string representation of the Beta distribution. + + + + Checks whether the parameters of the distribution are valid. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + When the parameters don't pass the function. + + + + Computes the density of the Beta distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Beta distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Beta distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples Beta distributed random variables by sampling two Gamma variables and normalizing. + + The random number generator to use. + The A shape parameter. + The B shape parameter. + a random number from the Beta distribution. + + + + Generates a sample from the Beta distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Beta distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sequence of samples from the distribution. + + + + Gets or sets the A shape parameter of the Beta distribution. + + + + + Gets or sets the B shape parameter of the Beta distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Beta distribution. + + + + + Gets the variance of the Beta distribution. + + + + + Gets the standard deviation of the Beta distribution. + + + + + Gets the entropy of the Beta distribution. + + + + + Gets the skewness of the Beta distribution. + + + + + Gets the mode of the Beta distribution; when there are multiple answers, this routine will return 0.5. + + + + + Gets the median of the Beta distribution. + + + + + Gets the minimum of the Beta distribution. + + + + + Gets the maximum of the Beta distribution. + + + + + The continuous uniform distribution is a distribution over real numbers. For details about this distribution, see + Wikipedia - Continuous uniform distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the ContinuousUniform class with lower bound 0 and upper bound 1. + + + + + Initializes a new instance of the ContinuousUniform class with given lower and upper bounds. + + Lower bound. + Upper bound; must be at least as large as . + If the upper bound is smaller than the lower bound. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the ContinuousUniform distribution without parameter checking. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed random number. + + + + Generates a sample from the ContinuousUniform distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed sample. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of uniformly distributed samples. + + + + Gets or sets the lower bound of the distribution. + + + + + Gets or sets the upper bound of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + + Gets the median of the distribution. + + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Log-Normal distribution. For details about this distribution, see + Wikipedia - Log-Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mu of the logarithm of the log-log-normal distribution. + + + + + Keeps track of the standard deviation of the logarithm of the log-log-normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + The distribution will be initialized with the default + random number generator. + + + The mu of the logarithm of the distribution. + + + The standard deviation of the logarithm of the distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + When the parameters don't pass the function. + + + + Computes the density of the log-normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the log-normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the log-normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the mean of the logarithm of the log-normal. + + + + + Gets or sets the standard deviation of the logarithm of the log-normal. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mu of the log-normal distribution. + + + + + Gets the variance of the log-normal distribution. + + + + + Gets the standard deviation of the log-normal distribution. + + + + + Gets the entropy of the log-normal distribution. + + + + + Gets the skewness of the log-normal distribution. + + + + + Gets the mode of the log-normal distribution. + + + + + Gets the median of the log-normal distribution. + + + + + Gets the minimum of the log-normal distribution. + + + + + Gets the maximum of the log-normal distribution. + + + + + Implements the Weibull distribution. For details about this distribution, see + Wikipedia - Weibull distribution. + + + The Weibull distribution is parametrized by a shape and scale parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Weibull shape parameter. + + + + + Weibull inverse scale parameter. + + + + + Reusable intermediate result 1 / ( ^ ) + + + By caching this parameter we can get slightly better numerics precision + in certain constellations without any additional computations. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Weibull class. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Weibull distribution. + The scale of the Weibull distribution. + true when the parameters positive valid floating point numbers, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + When the parameters don't pass the function. + + + + Computes the density of the Weibull distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Weibull distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Weibull distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the Weibull distribution. This method doesn't perform + any parameter checks. + + The random number generator to use. + The shape of the Weibull distribution. + The scale of the Weibull distribution. + A sample from a Weibull distributed random variable. + + + + Generates a sample from the Weibull distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Weibull distribution. + + + + + Gets or sets the scale of the Weibull distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Weibull distribution. + + + + + Gets the variance of the Weibull distribution. + + + + + Gets the standard deviation of the Weibull distribution. + + + + + Gets the entropy of the Weibull distribution. + + + + + Gets the skewness of the Weibull distribution. + + + + + Gets the mode of the Weibull distribution. + + + + + Gets the median of the Weibull distribution. + + + + + Gets the minimum of the Weibull distribution. + + + + + Gets the maximum of the Weibull distribution. + + + + + Implements the univariate Gamma distribution. For details about this distribution, see + Wikipedia - Gamma distribution. + + + The Gamma distribution is parametrized by a shape and inverse scale parameter. When we want + to specify a Gamma distribution which is a point distribution we set the shape parameter to be the + location of the point distribution and the inverse scale as positive infinity. The distribution + with shape and inverse scale both zero is undefined. + Random number generation for the Gamma distribution is based on the algorithm in: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Gamma shape parameter. + + + + + Gamma inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Gamma class. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + + + + Constructs a Gamma distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The scale of the Gamma distribution. + a normal distribution. + + + + Constructs a Gamma distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + When the parameters don't pass the function. + + + + Computes the density of the Gamma distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Gamma distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Gamma distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Gamma distributed random variable. + + + + Generates a sample from the Gamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Gamma distribution. + + + + + Gets or sets the scale of the Gamma distribution. + + + + + Gets or sets the inverse scale of the Gamma distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Gamma distribution. + + + + + Gets the variance of the Gamma distribution. + + + + + Gets the standard deviation of the Gamma distribution. + + + + + Gets the entropy of the Gamma distribution. + + + + + Gets the skewness of the Gamma distribution. + + + + + Gets the mode of the Gamma distribution. + + + + + Gets the median of the Gamma distribution. + + + + + Gets the minimum of the Gamma distribution. + + + + + Gets the maximum of the Gamma distribution. + + + + + Implements the univariate Normal (or Gaussian) distribution. For details about this distribution, see + Wikipedia - Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mean of the normal distribution. + + + + + Keeps track of the standard deviation of the normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Normal class. This is a normal distribution with mean 0.0 + and standard deviation 1.0. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the Normal class with a particular mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + + + + Constructs a normal distribution from a mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and variance. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The variance of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and precision. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The precision of the normal distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + When the parameters don't pass the function. + + + + Computes the density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the log density at . + + + + Computes the density of the normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the inverse cumulative distribution function of the normal distribution. + + The location at which to compute the inverse cumulative density. + the inverse cumulative density at . + + + + Samples a pair of standard normal distributed random variables using the Box-Muller algorithm. + + The random number generator to use. + a pair of random numbers from the standard normal distribution. + + + + Samples the distribution. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a random number from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the precision of the normal distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets or sets the mean of the normal distribution. + + + + + Gets or sets the variance of the normal distribution. + + + + + Gets or sets the standard deviation of the normal distribution. + + + + + Gets the entropy of the normal distribution. + + + + + Gets the skewness of the normal distribution. + + + + + Gets the mode of the normal distribution. + + + + + Gets the median of the normal distribution. + + + + + Gets the minimum of the normal distribution. + + + + + Gets the maximum of the normal distribution. + + + + + The Bernoulli distribution is a distribution over bits. The parameter + p specifies the probability that a 1 is generated. + Wikipedia - Bernoulli distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The probability of generating a one. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Bernoulli class. + + The probability of generating one. + If the Bernoulli parameter is not in the range [0,1]. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Bernoulli distribution. + + The random source to use. + The probability of generating a one. + A random sample from the Bernoulli distribution. + + + + Samples a Bernoulli distributed random variable. + + A sample from the Bernoulli distribution. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a Bernoulli distributed random variable. + + The random number generator to use. + The probability of generating a 1. + A sample from the Bernoulli distribution. + + + + Samples a sequence of Bernoulli distributed random variables. + + The random number generator to use. + The probability of generating a 1. + a sequence of samples from the distribution. + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the binomial distribution. For details about this distribution, see + Wikipedia - Binomial distribution. + + The distribution is parameterized by a probability (between 0.0 and 1.0). + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized binomial probability. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Binomial class. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The success probability of a trial. + The number of trials. + false is not in the interval [0.0,1.0] or is negative, true otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates a sample from the Binomial distribution without doing parameter checking. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successful trials. + + + + Samples a Binomially distributed random variable. + + The number of successes in N trials. + + + + Samples an array of Binomially distributed random variables. + + a sequence of successes in N trials. + + + + Samples a binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successes in trials. + + + + Samples a sequence of binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + a sequence of successes in trials. + + + + Gets or sets the success probability. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the categorical distribution. For details about this distribution, see + Wikipedia - Categorical distribution. This + distribution is sometimes called the Discrete distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the unnormalized categorical probabilities. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Categorical class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative or do not sum to one. + + + + Initializes a new instance of the Categorical class from a . The distribution + will not be automatically updated when the histogram changes. The categorical distribution will have + one value for each bucket and a probability for that value proportional to the bucket count. + + The histogram from which to create the categorical variable. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative returns false, or if the sum of parameters is 0.0; otherwise true + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Computes the unnormalized cumulative distribution function. This method performs no + parameter checking. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + An array representing the unnormalized cumulative distribution function. + + + + Returns one trials from the categorical distribution. + + The random number generator to use. + The cumulative distribution of the probability distribution. + One sample from the categorical distribution implied by . + + + + Samples a Binomially distributed random variable. + + The number of successful trials. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of successful trial counts. + + + + Samples one categorical distributed random variable; also known as the Discrete distribution. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + One random integer between 0 and the size of the categorical (exclusive). + + + + Samples a categorically distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + random integers between 0 and the size of the categorical (exclusive). + + + + Gets or sets the normalized probability vector of the multinomial. + + Sometimes the normalized probability vector cannot be represented + exactly in a floating point representation. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a . + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets he mode of the distribution. + + Throws a . + + + + Gets the median of the distribution. + + + + + The discrete uniform distribution is a distribution over integers. The distribution + is parameterized by a lower and upper bound (both inclusive). + Wikipedia - Discrete uniform distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the DiscreteUniform class. + + Lower bound. + Upper bound; must be at least as large as . + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates one sample from the discrete uniform distribution. This method does not do any parameter checking. + + The random source to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A random sample from the discrete uniform distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of uniformly distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a uniformly distributed random variable. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A sample from the discrete uniform distribution. + + + + Samples a sequence of uniformly distributed random variables. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of samples from the discrete uniform distribution. + + + + Gets or sets the lower bound of the probability distribution. + + + + + Gets or sets the upper bound of the probability distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution; since every element in the domain has the same probability this method returns the middle one. + + + + + Gets the median of the distribution. + + + + + Implements the multivariate Dirichlet distribution. For details about this distribution, see + Wikipedia - Dirichlet distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The Dirichlet distribution parameters. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Dirichlet class. The distribution will + be initialized with the default random number generator. + + An array with the Dirichlet parameters. + + + + Initializes a new instance of the class. + + random number generator. + + + The value of each parameter of the Dirichlet distribution. + + + The dimension of the Dirichlet distribution. + + + + + Checks whether the parameters of the distribution are valid: no + parameter can be less than zero and at least one parameter should be + larger than zero. + + The parameters of the Dirichlet distribution. + + true when the parameters are valid, false + otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The parameters of the Dirichlet distribution. + When the parameters don't pass the function. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the density of the distribution. + + The locations at which to compute the density. + the density at . + The Dirichlet distribution requires that the sum of the components of x equals 1. + You can also leave out the last component, and it will be computed from the others. + + + + Computes the log density of the distribution. + + The locations at which to compute the density. + the density at . + + + + Samples a Dirichlet distributed random vector. + + A sample from this distribution. + + + + Samples a Dirichlet distributed random vector. + + The random number generator to use. + The Dirichlet distribution parameter. + a sample from the distribution. + + + + Gets the dimension of the Dirichlet distribution. + + + + + Gets or sets the parameters of the Dirichlet distribution. + + + + + Gets the sum of the Dirichlet parameters. + + + + + Gets the mean of the Dirichlet distribution. + + + + + Gets the variance of the Dirichlet distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Implements the multinomial distribution. For details about this distribution, see + Wikipedia - Multinomial distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized multinomial probabilities. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Multinomial class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + Initializes a new instance of the Multinomial class from histogram . The distribution will + not be automatically updated when the histogram changes. + + Histogram instance + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative returns false, + if the sum of parameters is 0.0, or if the number of trials is negative; otherwise true. + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + When the parameters don't pass the function. + + + + Computes values of the probability mass function. + + Non-negative integers x1, ..., xk + The probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Computes values of the log probability mass function. + + Non-negative integers x1, ..., xk + The log probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Samples one multinomial distributed random variable. + + the counts for each of the different possible values. + + + + Samples a sequence multinomially distributed random variables. + + a sequence of counts for each of the different possible values. + + + + Samples one multinomial distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + the counts for each of the different possible values. + + + + Samples a multinomially distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of variables needed. + a sequence of counts for each of the different possible values. + + + + Gets or sets the proportion of ratios. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + + + Naive generic DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Corresponding frequency-space vector. + + + + Naive forward DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Hartley Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DHT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Hartley Transform Convention Options. + Corresponding time-space vector. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Hartley Transform Convention + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling. + + + + + Globalized String Handling Helpers + + + + + Tries to get a from the format provider, + returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format + provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Globalized Parsing: Tokenize a node by splitting it into several nodes. + + Node that contains the trimmed string to be tokenized. + List of keywords to tokenize by. + keywords to skip looking for (because they've already been handled). + + + + Globalized Parsing: Parse a double number + + First token of the number. + Culture Info. + The parsed double number using the given culture information. + + + + + Globalized Parsing: Parse a float number + + First token of the number. + Culture Info. + The parsed float number using the given culture information. + + + + + Barycentric Polynomial Interpolation where the given sample points are equidistant. + + + This algorithm neither supports differentiation nor integration. + + + + + Interpolation within the range of a discrete set of known data points. + + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t is equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sampls in the interval [leftBound,rightBound]. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Count of Sample Values x(t). + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + + + Extract the exponent sign to be used in forward transforms according to the + provided convention options. + + Fourier Transform Convention Options. + Fourier series exponent sign. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Generate the bluestein sequence for the provided problem size. + + Number of samples. + Bluestein sequence exp(I*Pi*k^2/N) + + + + Convolution with the bluestein sequence (Parallel Version). + + Sample Vector. + + + + Swap the real and imaginary parts of each sample. + + Sample Vector. + + + + Bluestein generic FFT for arbitrary sized sample vectors. + + Time-space sample vector. + Fourier series exponent sign. + + + + Bluestein forward FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Bluestein inverse FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Naive generic DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier series exponent sign. + Corresponding frequency-space vector. + + + + Naive forward DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DFT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Fourier Transform Convention Options. + Corresponding time-space vector. + + + + Radix-2 Reorder Helper Method + + Sample type + Sample vector + + + + Radix-2 Step Helper Method + + Sample vector. + Fourier series exponent sign. + Level Group Size. + Index inside of the level. + + + + Radix-2 generic FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 generic FFT for power-of-two sample vectors (Parallel Version). + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 forward FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Radix-2 inverse FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Integral Transforms (including FFT). + + + + + Shared internal DET algorithm. + + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Fourier Transform Convention + + + + + Inverse integrand exponent (forward: positive sign; inverse: negative sign). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling and common exponent (used in Maple). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction (used in Matlab). [= AsymmetricScaling] + + + + + Inverse integrand exponent; No scaling at all (used in all Numerical Recipes based implementations). [= InverseExponent | NoScaling] + + + + + Analytic integration algorithm for smooth functions with no discontinuities + or derivative discontinuities and no poles inside the interval. + + + + + Maximum number of iterations, until the asked + maximum error is (likely to be) satisfied. + + + + + Precomputed abscissa vector per level. + + + + + Precomputed weight vector per level. + + + + + Abscissa vector per level provider. + + + + + Weight vector per level provider. + + + + + Approximate the integral by the double exponential transformation + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Abscissa vector per level provider. + + Level Enumerator. + + + + Weight vector per level provider. + + Level Enumerator. + + + + Compute the abscissa vector for a single level. + + The level to evaluate the abscissa vector for. + Abscissa Vector. + + + + Compute the weight vector for a single level. + + The level to evaluate the weight vector for. + Weight Vector. + + + + Approximation algorithm for definite integrals by Simpson's rule. + + + + + Direct 3-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Even number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Approximation algorithm for definite integrals by the Trapezium rule of the Newton-Cotes family. + + + Wikipedia - Trapezium Rule + + + + + Direct 2-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Abscissa vector per level provider. + Weight vector per level provider. + First Level Step + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Numeric Integration (Quadrature). + + + + + Shared internal DET algorithm. + + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Akima Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Three-Point Differentiation Helper. + + Sample Points t. + Sample Values x(t). + Index of the point of the differentiation. + Index of the first sample. + Index of the second sample. + Index of the third sample. + The derivative approximation. + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Interpolation Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Sample Points t. + + + + + Sample Values x(t). + + + + + Barycentric Weights w(t). + + + + + Initializes a new instance of the BarycentricInterpolation class. + + + + + Initializes a new instance of the BarycentricInterpolation class. + + Sample Points t (no sorting assumed) + Sample Values x(t) + Barycentric weights w(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + Barycentric weights w(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Rational Interpolation (with poles) using Roland Bulirsch and Josef Stoer's Algorithm. + + + + This algorithm supports neither differentiation nor integration. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Spline Interpolation Algorithm with continuous first and second derivatives. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Coefficient Vector + + + + Tridiagonal Solve Helper. + + The a-vector[n]. + The b-vector[n], will be modified by this function. + The c-vector[n]. + The d-vector[n], will be modified by this function. + The x-vector[n] + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Hermite Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Rational Interpolation without poles, using Mike Floater and Kai Hormann's Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Initialize the interpolation method with the given sample set. + + + The interpolation scheme order will be set to 3. + + Sample Points t (no sorting assumed) + Sample Values x(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Linear Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Lagrange Polynomial Interpolation using Neville's Algorithm. + + + + This algorithm supports differentiation, but doesn't support integration. + + + When working with equidistant or Chebyshev sample points it is + recommended to use the barycentric algorithms specialized for + these cases instead of this arbitrary Neville algorithm. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Third-Degree Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Sample Points t. + + + + + Spline Coefficients c(t). + + + + + Number of samples. + + + + + Initializes a new instance of the SplineInterpolation class. + + + + + Initializes a new instance of the SplineInterpolation class. + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Find the index of the greatest sample point smaller than t. + + The value to look for. + The sample point index. + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Interpolation Factory. + + + + + Creates an interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a linear spline interpolation based on arbitrary points (sorted ascending). + + The sample points t, sorted ascending. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a floater hormann rational pole-free interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a burlish stoer rational interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Left and right boundary conditions. + + + + + Natural Boundary (Zero second derivative). + + + + + Parabolically Terminated boundary. + + + + + Fixed first derivative at the boundary. + + + + + Fixed second derivative at the boundary. + + + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + + + Returns the greatest common divisor (gcd) of two big integers. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of big integers. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two big integers. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of big integers. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Find out whether the provided 32 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 64 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 32 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 64 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 32 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find out whether the provided 64 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find the closest perfect power of two that is larger or equal to the provided + 32 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Find the closest perfect power of two that is larger or equal to the provided + 64 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 31). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 63). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Find out whether the provided 32 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Find out whether the provided 64 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Returns the greatest common divisor (gcd) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's + algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Utilities for working with floating point numbers. + + + + Useful links: + + + http://docs.sun.com/source/806-3568/ncg_goldberg.html#689 - What every computer scientist should know about floating-point arithmetic + + + http://en.wikipedia.org/wiki/Machine_epsilon - Gives the definition of machine epsilon + + + + + + + + The base number for binary values + + + + + The number of binary digits used to represent the binary number for a double precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The number of binary digits used to represent the binary number for a single precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The maximum relative precision of a double + + + + + The maximum relative precision of a single + + + + + The number of significant figures that a double-precision floating point has. + + + + + The number of significant figures that a single-precision floating point has. + + + + Value representing 10 * 2^(-52) + + + Value representing 10 * 2^(-52) + + + + Initializes static members of the Precision class. + + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the number divided by it's magnitude, effectively returning a number between -10 and 10. + + The value. + The value of the number. + + + + Gets the equivalent long value for the given double value. + + The double value which should be turned into a long value. + + The resulting long value. + + + + + Returns a 'directional' long value. This is a long value which acts the same as a double, + e.g. a negative double value will return a negative double value starting at 0 and going + more negative as the double value gets more negative. + + The input double value. + A long value which is roughly the equivalent of the double value. + + + + Returns a 'directional' int value. This is a int value which acts the same as a float, + e.g. a negative float value will return a negative int value starting at 0 and going + more negative as the float value gets more negative. + + The input float value. + An int value which is roughly the equivalent of the double value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + How many times the number should be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + How many times the number should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The absolute threshold for to consider it as zero. + Zero if || is smaller than , otherwise. + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero. + + The real number to coerce to zero, if it is almost zero. + Zero if || is smaller than 2^(-53) = 1.11e-16, otherwise. + + + + Determines the range of floating point numbers that will match the specified value with the given tolerance. + + The value. + The ulps difference. + The bottom range end. + The top range end. + + Thrown if is smaller than zero. + + + + + Returns the floating point number that will match the value with the tolerance on the maximum size (i.e. the result is + always bigger than the value) + + The value. + The ulps difference. + The maximum floating point number which is larger than the given . + + + + Returns the floating point number that will match the value with the tolerance on the minimum size (i.e. the result is + always smaller than the value) + + The value. + The ulps difference. + The minimum floating point number which is smaller than the given . + + + + Determines the range of ulps that will match the specified value with the given tolerance. + + The value. + The relative difference. + The number of ULPS between the value and the value - relativeDifference. + The number of ULPS between the value and the value + relativeDifference. + + Thrown if is smaller than zero. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Evaluates the count of numbers between two double numbers + + The first parameter. + The second parameter. + The second number is included in the number, thus two equal numbers evaluate to zero and two neighbor numbers evaluate to one. Therefore, what is returned is actually the count of numbers between plus 1. + The number of floating point values between and . + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two structures with precision support are almost equal. + + The type of the structures. Must implement . + The first structure + The second structure + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both doubles are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two structure with precision support and determines if they are equal + within the specified maximum relative error. + + + The type of the structures. Must implement . + + The first structure. + The second structure. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two lists of structures with precision support and determines if they + are equal within the specified maximum error. + + + The type of the structures. Must implement . + + The first structure list. + The second structure list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum absolute error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The absolute accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum absolute error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum relative error. + + The first value. + The second value. + The difference of the two values (according to some norm). + + The relative accuracy required for being + almost equal. + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + + + Determines the 'number' of floating point numbers between two values (i.e. the number of discrete steps + between the two numbers) and then checks if that is within the specified tolerance. So if a tolerance + of 1 is passed then the result will be true only if the two numbers have the same binary representation + OR if they are two adjacent numbers that only differ by one step. + + + The comparison method used is explained in http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm . The article + at http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx explains how to transform the C code to + .NET enabled code without using pointers and unsafe code. + + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both doubles are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two floats and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both floats are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two doubles and determines if the first value is larger than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is larger than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The maximum error in terms of Units in Last Place (ulps), i.e. the maximum number of decimals that may be different. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than the tolerance. + + + 0 + is equal to within the tolerance. + + + 1 + is bigger than by more than the tolerance. + + + + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The number of decimal places on which the values must be compared. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than a magnitude equal to . + + + 0 + is equal to within a magnitude equal to . + + + 1 + is bigger than by more than a magnitude equal to . + + + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + + Relative Epsilon (positive double or NaN). + + Evaluates the negative epsilon. The more common positive epsilon is equal to two times this negative epsilon. + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + Relative Epsilon (positive double or NaN) + Evaluates the positive epsilon. See also + + + + + Converts a float valut to a bit array stored in an int. + + The value to convert. + The bit array. + + + + Gets the maximum relative precision of a double. + + The maximum relative precision of a double. + + + + Gets the maximum relative precision of a single. + + The maximum relative precision of a single. + + + + Gets the number of decimal places for floats. + + The number of decimal places for floats. + + + + Gets the number of decimal places for doubles. + + The number of decimal places for doubles. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The array arguments must have the same length.. + + + + + Looks up a localized string similar to The given array is the wrong length. Should be {0}.. + + + + + Looks up a localized string similar to The argument must be between 0 and 1.. + + + + + Looks up a localized string similar to Value cannot be in the range -1 < x < 1.. + + + + + Looks up a localized string similar to Value must be even.. + + + + + Looks up a localized string similar to The histogram does not contains the value.. + + + + + Looks up a localized string similar to Value is expected to be between {0} and {1} (including {0} and {1}).. + + + + + Looks up a localized string similar to At least one item of {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be greater than or equal to one.. + + + + + Looks up a localized string similar to han the given upper bound.. + + + + + Looks up a localized string similar to Matrix dimensions must agree.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: {0}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}, op3 is {2}.. + + + + + Looks up a localized string similar to The requested matrix does not exist.. + + + + + Looks up a localized string similar to The matrix indices must not be out of range of the given matrix.. + + + + + Looks up a localized string similar to Matrix must not be rank deficient.. + + + + + Looks up a localized string similar to Matrix must not be singular.. + + + + + Looks up a localized string similar to Matrix must be positive definite.. + + + + + Looks up a localized string similar to Matrix column dimensions must agree.. + + + + + Looks up a localized string similar to Matrix row dimensions must agree.. + + + + + Looks up a localized string similar to Matrix must have exactly one column.. + + + + + Looks up a localized string similar to Matrix must have exactly one column and row, thus have only one cell.. + + + + + Looks up a localized string similar to Matrix must have exactly one row.. + + + + + Looks up a localized string similar to Matrix must be square.. + + + + + Looks up a localized string similar to Matrix must be symmetric.. + + + + + Looks up a localized string similar to Matrix must be symmetric positive definite.. + + + + + Looks up a localized string similar to In the specified range, the minimum is greater than maximum.. + + + + + Looks up a localized string similar to Value must be positive.. + + + + + Looks up a localized string similar to Value must neither be infinite nor NaN.. + + + + + Looks up a localized string similar to Value must not be negative (zero is ok).. + + + + + Looks up a localized string similar to {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be odd.. + + + + + Looks up a localized string similar to {0} must be greater than {1}.. + + + + + Looks up a localized string similar to {0} must be greater than or equal to {1}.. + + + + + Looks up a localized string similar to The chosen parameter set is invalid (probably some value is out of range).. + + + + + Looks up a localized string similar to The given expression does not represent a complex number.. + + + + + Looks up a localized string similar to Value must be positive (and not zero).. + + + + + Looks up a localized string similar to Size must be a Power of Two.. + + + + + Looks up a localized string similar to Size must be a Power of Two in every dimension.. + + + + + Looks up a localized string similar to The range between {0} and {1} must be less than or equal to {2}.. + + + + + Looks up a localized string similar to Arguments must be different objects.. + + + + + Looks up a localized string similar to Array must have exactly one dimension (and not be null).. + + + + + Looks up a localized string similar to Value is too large.. + + + + + Looks up a localized string similar to Value is too large for the current iteration limit.. + + + + + Looks up a localized string similar to Type mismatch.. + + + + + Looks up a localized string similar to Array length must be a multiple of {0}.. + + + + + Looks up a localized string similar to All vectors must have the same dimensionality.. + + + + + Looks up a localized string similar to The vector must have 3 dimensions.. + + + + + Looks up a localized string similar to The given array is too small. It must be at least {0} long.. + + + + + Looks up a localized string similar to Big endian files are not supported.. + + + + + Looks up a localized string similar to The supplied collection is empty.. + + + + + Looks up a localized string similar to Complex matrices are not supported.. + + + + + Looks up a localized string similar to An algorithm failed to converge.. + + + + + Looks up a localized string similar to This feature is not implemented yet (but is planned).. + + + + + Looks up a localized string similar to The given file doesn't exist.. + + + + + Looks up a localized string similar to Sample points should be sorted in strictly ascending order. + + + + + Looks up a localized string similar to All sample points should be unique.. + + + + + Looks up a localized string similar to Invalid parameterization for the distribution.. + + + + + Looks up a localized string similar to Invalid Left Boundary Condition.. + + + + + Looks up a localized string similar to The operation could not be performed because the accumulator is empty.. + + + + + Looks up a localized string similar to The operation could not be performed because the histogram is empty.. + + + + + Looks up a localized string similar to Not enough points in the distribution.. + + + + + Looks up a localized string similar to No Samples Provided. Preparation Required.. + + + + + Looks up a localized string similar to Invalid Right Boundary Condition.. + + + + + Looks up a localized string similar to ddd MMM dd HH:mm:ss yyyy. + + + + + Looks up a localized string similar to The number of columns of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows or columns of a matrix must be positive.. + + + + + Looks up a localized string similar to Only 1 and 2 dimensional arrays are supported.. + + + + + Looks up a localized string similar to Data must contain at least {0} values.. + + + + + Looks up a localized string similar to Name cannot contain a space. name: {0}. + + + + + Looks up a localized string similar to {0} is not a supported type.. + + + + + Looks up a localized string similar to The two arguments can't be compared (maybe they are part of a partial ordering?). + + + + + Looks up a localized string similar to The integer array does not represent a valid permutation.. + + + + + Looks up a localized string similar to The sampler's proposal distribution is not upper bounding the target density.. + + + + + Looks up a localized string similar to The number of rows must greater than or equal to the number of columns.. + + + + + Looks up a localized string similar to The singular vectors were not computed.. + + + + + Looks up a localized string similar to This special case is not supported yet (but is planned).. + + + + + Looks up a localized string similar to The given stop criterium already exist in the collection.. + + + + + Looks up a localized string similar to There is no stop criterium in the collection.. + + + + + Looks up a localized string similar to String parameter cannot be empty or null.. + + + + + Looks up a localized string similar to We only support sparse matrix with less than int.MaxValue elements.. + + + + + Looks up a localized string similar to The moment of the distribution is undefined.. + + + + + Looks up a localized string similar to A user defined provider has not been specified.. + + + + + Looks up a localized string similar to The given work array is too small. Check work[0] for the corret size.. + + + + + Abstract class for random number generators. This class introduces a layer between + and the Math.Net Numerics random number generators to provide thread safety. + + + + + The method that actually generates samples. + + + + + The object that will be locked for thread safety. + + + + + Initializes a new instance of the class using + the value of to set whether + the instance is thread safe or not. + + + + + Initializes a new instance of the class. + + if set to true , the class is thread safe. + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns an array of uniformly distributed random doubles in the interval [0.0,1.0]. + + The size of the array. + + An array of uniformly distributed random doubles in the interval [0.0,1.0]. + + if n is not greater than 0. + + + + Returns a nonnegative random number. + + + A 32-bit signed integer greater than or equal to zero and less than . + + + + + Returns a random number less then a specified maximum. + + The exclusive upper bound of the random number returned. + A 32-bit signed integer less than . + is negative. + + + + Returns a random number within a specified range. + + The inclusive lower bound of the random number returned. + The exclusive upper bound of the random number returned. must be greater than or equal to . + + A 32-bit signed integer greater than or equal to and less than ; that is, the range of return values includes but not . If equals , is returned. + + is greater than . + + + + Fills the elements of a specified array of bytes with random numbers. + + An array of bytes to contain random numbers. + is null. + + + + Returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + Thread safe version of which returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0 + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + A delegate type that represents a method that generates random numbers. + + Randomly distributed numbers. + + + + Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Random number generator using Mersenne Twister 19937 algorithm. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + Uses the value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + A 32-bit combined multiple recursive generator with 2 components of order 3. + + Based off of P. L'Ecuyer, "Combined Multiple Recursive Random Number Generators," Operations Research, 44, 5 (1996), 816--822. + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Represents a Parallel Additive Lagged Fibonacci pseudo-random number generator. + + + The type bases upon the implementation in the + Boost Random Number Library. + It uses the modulus 232 and by default the "lags" 418 and 1279. Some popular pairs are presented on + Wikipedia - Lagged Fibonacci generator. + + + + + Default value for the ShortLag + + + + + Default value for the LongLag + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The ShortLag value + TheLongLag value + + + + Stores an array of random numbers + + + + + Stores an index for the random number array element that will be accessed next. + + + + + Fills the array with new unsigned random numbers. + + + Generated random numbers are 32-bit unsigned integers greater than or equal to 0 + and less than or equal to . + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Gets the short lag of the Lagged Fibonacci pseudo-random number generator. + + + + + Gets the long lag of the Lagged Fibonacci pseudo-random number generator. + + + + + A random number generator based on the class in the .NET library. + + + + + Construct a new random number generator with a random seed. + + Uses and uses the value of + to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + Uses the value of to set whether the instance is thread safe. + + + + Construct a new random number generator with random seed. + + Uses + if set to true , the class is thread safe. + + + + Construct a new random number generator with random seed. + + The to use. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + This class implements extension methods for the System.Random class. The extension methods generate + pseudo-random distributed numbers for types other than double and int32. + + + + + Returns a nonnegative random number less than . + + + The random object to extend. + + + A 64-bit signed integer greater than or equal to 0, and less than ; that is, + the range of return values includes 0 but not . + + + + + + Returns a random number of the full Int32 range. + + + The random object to extend. + + + A 32-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a random number of the full Int64 range. + + + The random object to extend. + + + A 64-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a nonnegative decimal floating point random number less than 1.0. + + + The random object to extend. + + + A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, + the range of return values includes 0.0 but not 1.0. + + + + + Wichmann-Hill’s 1982 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (1982), "Algorithm AS 183: + An efficient and portable pseudo-random number generator". Applied Statistics 31 (1982) 188-190 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Wichmann-Hill’s 2006 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (2006), "Generating good pseudo-random numbers". + Computational Statistics & Data Analysis 51:3 (2006) 1614-1622 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Implements a multiply-with-carry Xorshift pseudo random number generator (RNG) specified in Marsaglia, George. (2003). Xorshift RNGs. + Xn = a * Xn−3 + c mod 2^32 + http://www.jstatsoft.org/v08/i14/paper + + + + + The default value for X1. + + + + + The default value for X2. + + + + + The default value for the multiplier. + + + + + The default value for the carry over. + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Note: must be less than . + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Seed or last but three unsigned random number. + + + + + Last but two unsigned random number. + + + + + Last but one unsigned random number. + + + + + The value of the carry over. + + + + + The multiplier. + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a two-domain function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function at the roots of the Chebyshev polynomial of the first kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*(2i-1)/(2n)) + + + + + + Samples a function at the roots of the Chebyshev polynomial of the second kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*i/(n-1)) + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant continuously starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated sample enumerator. + + + + + Samples a function equidistant with the provided start and step length to an integer-domain function + + The real-domain function to sample. + The real domain location where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated samples integer-domain function. + + + + + Sorting algorithms for single, tuple and triple lists. + + + + + Sort a list of keys, in place using the quick sort algorithm. + + The type of elements stored in the list. + List to sort. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the item list. + List to sort. + List to permute the same way as the key list. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the first item list. + The type of elements stored in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + + + + Sort a list of keys, in place using the quick sort algorithm using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + Comparison, defining the sort order. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the item list. + List to sort. + List to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the first item list. + The type of elements in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of element in the list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + Comparison, defining the sort order. + + + + Recursive implementation for an in place quick sort on a list. + + The type of the list on which the quick sort is performed. + The list which is sorted using quick sort. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on a list while reordering one other list accordingly. + + The type of the list on which the quick sort is performed. + The type of the list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on one list while reordering two other lists accordingly. + + The type of the list on which the quick sort is performed. + The type of the first list which is automatically reordered accordingly. + The type of the second list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The first list which is automatically reordered accordingly. + The second list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Performs an in place swap of two elements in a list. + + The type of elements stored in the list. + The list in which the elements are stored. + The index of the first element of the swap. + The index of the second element of the swap. + + + + A class with correlation measures between two datasets. + + + + + Computes the Pearson product-moment correlation coefficient. + + Sample data A. + Sample data B. + The Pearson product-moment correlation coefficient. + + + + Computes the basic statistics of data set. The class meets the + NIST standard of accuracy for mean, variance, and standard deviation + (the only statistics they provide exact values for) and exceeds them + in increased accuracy mode. + + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Computes descriptive statistics from a stream of data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of data values using high accuracy. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values using high accuracy. + + A sequence of datapoints. + + + + Internal use. Method use for setting the statistics. + + For setting Mean. + For setting Variance. + For setting Skewness. + For setting Kurtosis. + For setting Minimum. + For setting Maximum. + For setting Count. + + + + Gets the size of the sample. + + The size of the sample. + + + + Gets the sample mean. + + The sample mean. + + + + Gets the unbiased population variance estimator (on a dataset of size N will use an N-1 normalizer). + + The sample variance. + + + + Gets the unbiased population standard deviation (on a dataset of size N will use an N-1 normalizer). + + The sample standard deviation. + + + + Gets the sample skewness. + + The sample skewness. + Returns zero if is less than three. + + + + Gets the sample median. + + The sample median. + + + + Gets the sample kurtosis. + + The sample kurtosis. + Returns zero if is less than four. + + + + Gets the maximum sample value. + + The maximum sample value. + + + + Gets the minimum sample value. + + The minimum sample value. + + + + A consists of a series of s, + each representing a region limited by a lower bound (exclusive) and an upper bound (inclusive). + + + + + Initializes a new instance of the Bucket class. + + + + + Initializes a new instance of the Bucket class. + + + + + Creates a copy of the Bucket with the lowerbound, upperbound and counts exactly equal. + + A cloned Bucket object. + + + + This method check whether a point is contained within this bucket. + + The point to check. + 0 if the point falls within the bucket boundaries; -1 if the point is + smaller than the bucket, +1 if the point is larger than the bucket. + + + + Comparison of two disjoint buckets. The buckets cannot be overlapping. + + + + + Checks whether two Buckets are equal; this method tolerates a difference in lowerbound, upperbound + and count given by . + + + + + Provides a hash code for this bucket. + + + + + Formats a human-readable string for this bucket. + + + + + + Lower Bound of the Bucket. + + + + + Upper Bound of the Bucket. + + + + + The number of datapoints in the bucket. + + + + + Width of the Bucket. + + + + + Default comparer. + + + + + This IComparer performs comparisons between a point and a bucket. + + + + + Compares a point and a bucket. The point will be encapsulated in a bucket with width 0. + + The first bucket to compare. + The second bucket to compare. + -1 when the point is less than this bucket, 0 when it is in this bucket and 1 otherwise. + + + + A class which computes histograms of data. + + + + + Contains all the Buckets of the Histogram. + + + + + Indicates whether the elements of buckets are currently sorted. + + + + + Initializes a new instance of the Histogram class. + + + + + Constructs a Histogram with a specific number of equally sized buckets. The upper and lower bound of the histogram + will be set to the smallest and largest datapoint. + + The datasequence to build a histogram on. + The number of buckets to use. + + + + Constructs a Histogram with a specific number of equally sized buckets. + + The datasequence to build a histogram on. + The number of buckets to use. + The histogram lower bound. + The histogram upper bound. + + + + Add one data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The datapoint which we want to add. + + + + Add a sequence of data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The sequence of datapoints which we want to add. + + + + Adds a Bucket to the Histogram. + + + + + Sort the buckets if needed. + + + + + Returns the Bucket that contains the value v. + + The point to search the bucket for. + A copy of the bucket containing point . + + + + Returns the index in the Histogram of the Bucket + that contains the value v. + + The point to search the bucket index for. + The index of the bucket containing the point. + + + + Prints the buckets contained in the . + + + + + Returns the lower bound of the histogram. + + + + + Returns the upper bound of the histogram. + + + + + Gets the n'th bucket. + + The index of the bucket to be returned. + A copy of the n'th bucket. + + + + Gets the number of buckets. + + + + + Gets the total number of datapoints in the histogram. + + + + + A hybrid Monte Carlo sampler for multivariate distributions. + + + + + The Hybrid (also called Hamiltonian) Monte Carlo produces samples from distribition P using a set + of Hamiltonian equations to guide the sampling process. It uses the negative of the log density as + a potential energy, and a randomly generated momentum to set up a Hamiltonian system, which is then used + to sample the distribution. This can result in a faster convergence than the random walk Metropolis sampler + (). + + The type of samples this sampler produces. + + + + The interface which every sampler must implement. + + The type of samples this sampler produces. + + + + The random number generator for this class. + + + + + Keeps track of the number of accepted samples. + + + + + Keeps track of the number of calls to the proposal sampler. + + + + + Initializes a new instance of the class. + + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns one sample. + + + + + Returns a number of samples. + + The number of samples we want. + An array of samples. + + + + Gets or sets the random number generator. + + When the random number generator is null. + + + + Gets the acceptance rate of the sampler. + + + + + Evaluates the energy function of the target distribution. + + + + + The current location of the sampler. + + + + + The number of burn iterations between two samples. + + + + + The size of each step in the Hamiltonian equation. + + + + + The number of iterations in the Hamiltonian equation. + + + + + The algorithm used for differentiation. + + + + + Constructs a new Hybrid Monte Carlo sampler. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + Random number generator used for sampling the momentum. + The method used for differentiation. + When the number of burnInterval iteration is negative. + When either x0, pdfLnP or diff is null. + + + + Returns a sample from the distribution P. + + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Method used to update the sample location. Used in the end of the loop. + + The old energy. + The old gradient/derivative of the energy. + The new sample. + The new gradient/derivative of the energy. + The new energy. + The difference between the old Hamiltonian and new Hamiltonian. Use to determine + if an update should take place. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Method for doing dot product. + + First vector/scalar in the product. + Second vector/scalar in the product. + + + + + Method for adding, multiply the second vector/scalar by factor and then + add it to the first vector/scalar. + + First vector/scalar. + Scalar factor multiplying by the second vector/scalar. + Second vector/scalar. + + + + Multiplying the second vector/scalar by factor and then subtract it from + the first vector/scalar. + + First vector/scalar. + Scalar factor to be multiplied to the second vector/scalar. + Second vector/scalar. + + + + Method for sampling a random momentum. + + Momentum to be randomized. + + + + The Hamiltonian equations that is used to produce the new sample. + + + + + Method to compute the Hamiltonian used in the method. + + The momentum. + The energy. + Hamiltonian=E+p.p/2 + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than or equal to zero. + Throws when value is negative. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than to zero. + Throws when value is negative or zero. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than zero. + Throws when value is negative or zero. + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the number of iterations in the Hamiltonian equation. + + When frogleap steps is negative or zero. + + + + Gets or sets the size of each step in the Hamiltonian equation. + + When step size is negative or zero. + + + + The delegate type that defines a derivative evaluated at a certain point. + + Function to be differentiated. + Value where the derivative is computed. + + + + + Number of parameters in the density function. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of different components of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The burn interval will be set to 0. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the a random number generator provided by the user. + A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviations + given by pSdv. This constructor will set the burn interval, the method used for + numerical differentiation and the random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + The method used for numerical differentiation. + When the number of burnInterval iteration is negative. + When the length of pSdv is not the same as x0. + + + + Initialize parameters. + + The current location of the sampler. + + + + Checking that the location and the momentum are of the same dimension and that each component is positive. + + The standard deviations used for sampling the momentum. + When the length of pSdv is not the same as Length or if any + component is negative. + When pSdv is null. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the gradient. Uses a simple three point estimation. + + Function which the gradient is to be evaluated. + The location where the gradient is to be evaluated. + The gradient of the function at the point x. + + + + Gets or sets the standard deviations used in the sampling of different components of the + momentum. + + When the length of pSdv is not the same as Length. + + + + Provides utilities to analysis the convergence of a set of samples from + a . + + + + + Computes the auto correlations of a series evaluated by a function f. + + The series for computing the auto correlation. + The lag in the series + The function used to evaluate the series. + The auto correlation. + Throws if lag is zero or if lag is + greater than or equal to the length of Series. + + + + Computes the effective size of the sample when evaluated by a function f. + + The samples. + The function use for evaluating the series. + The effective size when auto correlation is taken into account. + + + + A method which samples datapoints from a proposal distribution. The implementation of this sampler + is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it doesn't take any parameters; it samples random + variables from the whole domain. + + The type of the datapoints. + A sample from the proposal distribution. + + + + A method which samples datapoints from a proposal distribution given an initial sample. The implementation + of this sampler is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it samples locally around an initial point. In other words, it + makes a small local move rather than producing a global sample from the proposal. + + The type of the datapoints. + The initial sample. + A sample from the proposal distribution. + + + + A function which evaluates a density. + + The type of data the distribution is over. + The sample we want to evaluate the density for. + + + + A function which evaluates a log density. + + The type of data the distribution is over. + The sample we want to evaluate the log density for. + + + + A function which evaluates the log of a transition kernel probability. + + The type for the space over which this transition kernel is defined. + The new state in the transition. + The previous state in the transition. + The log probability of the transition. + + + + Metropolis-Hastings sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis-Hastings sampling doesn't require that the + proposal distribution Q is symmetric in comparison to . It does need to + be able to evaluate the proposal sampler's log density though. All densities are required to be in log space. + + The Metropolis-Hastings sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the target distribution. + + + + + Evaluates the log transition probability for the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis-Hastings sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + + + + Constructs a new Metropolis-Hastings sampler using the default random number generator. This + constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Metropolis sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis sampling requires that the proposal + distribution Q is symmetric. All densities are required to be in log space. + + The Metropolis sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the sampling distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis sampler using the default random + number generator. The burnInterval interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + + + + Constructs a new Metropolis sampler using the default random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Rejection sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P and Q. The density of P and Q don't need to + to be normalized, but we do need that for each x, P(x) < Q(x). + + The type of samples this sampler produces. + + + + Evaluates the density function of the sampling distribution. + + + + + Evaluates the density function of the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + Constructs a new rejection sampler using the default random number generator. + + The density of the distribution we want to sample from. + The density of the proposal distribution. + A method that samples from the proposal distribution. + + + + Returns a sample from the distribution P. + + When the algorithms detects that the proposal + distribution doesn't upper bound the target distribution. + + + + A hybrid Monte Carlo sampler for univariate distributions. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The burn interval will be set to 0. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using a random + number generator provided by the user. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + Random number generator used to sample the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + given by pSdv using a random + number generator provided by the user. This constructor will set both the burn interval and the method used for + numerical differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + The method used for numerical differentiation. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the derivative. Uses a simple three point estimation. + + Function for which the derivative is to be evaluated. + The location where the derivative is to be evaluated. + The derivative of the function at the point x. + + + + Gets or sets the standard deviation used in the sampling of the + momentum. + + When standard deviation is negative. + + + + Methods to calculate the percentiles. + + + + + Using the method recommened my NIST, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Using the nearest rank, http://en.wikipedia.org/wiki/Percentile#Nearest_Rank + + + + + Using the same method as Excel does, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Use linear interpolation between the two nearest ranks, + http://en.wikipedia.org/wiki/Percentile#Linear_Interpolation_Between_Closest_Ranks + + + + + Class to calculate percentiles. + + + + + Holds the data. + + + + + Initializes a new instance of the class. + + The data to calculate the percentiles of. + + + + Computes the percentile. + + The percentile, must be between 0.0 and 1.0 (inclusive). + the requested percentile. + + + + Computes the percentiles for the given list. + + The percentiles, must be between 0.0 and 1.0 (inclusive) + the values that correspond to the given percentiles. + + + + Gets or sets the method used to calculate the percentiles. + + The calculation method. + defaults to . + + + + Extension methods to return basic statistics on set of data. + + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The minimum value in the sample data. + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The minimum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The maximum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The maximum value in the sample data. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + + + + Slice sampling produces samples from distribition P by uniformly sampling from under the pdf of P using + a technique described in "Slice Sampling", R. Neal, 2003. All densities are required to be in log space. + + The slice sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + + + + Evaluates the log density function of the target distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + The scale of the slice sampler. + + + + + Constructs a new Slice sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The density of the distribution we want to sample from. + The scale factor of the slice sampler. + When the scale of the slice sampler is not positive. + + + + Constructs a new slice sampler using the default random number generator. It + will set the number of burnInterval iterations and run a burnInterval phase. + + The initial sample. + The density of the distribution we want to sample from. + The number of iterations in between returning samples. + The scale factor of the slice sampler. + When the number of burnInterval iteration is negative. + When the scale of the slice sampler is not positive. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the scale of the slice sampler. + + + + + Used to simplify parallel code, particularly between the .NET 4.0 and Silverlight Code. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The array to iterate over. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes each of the provided actions inside a discrete, asynchronous task. + + An array of actions to execute. + The actions array contains a null element. + At least one invocation of the actions threw an exception. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Double-precision trigonometry toolkit. + + + + + Constant to convert a degree to grad. + + + + + Trigonometric Cosecant of an angle in radian. + + + The angle in radian. + + + Cosecant of an angle in radian. + + + + + Trigonometric Cosecant of a Complex number. + + + The complex value. + + + The cosecant of a complex number. + + + + + Trigonometric Cosine of an angle in radian. + + + The angle in radian. + + + The cosine of an angle in radian. + + + + + Trigonometric Cosine of a Complex number. + + + The complex value. + + + The cosine of a complex number. + + + + + Trigonometric Cotangent of an angle in radian. + + + The angle in radian. + + + The cotangent of an angle in radian. + + + + + Trigonometric Cotangent of a Complex number. + + + The complex value. + + + The cotangent of the complex number. + + + + + Converts a degree (360-periodic) angle to a grad (400-periodic) angle. + + + The degree to convert. + + + The converted grad angle. + + + + + Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + + + The degree to convert. + + + The converted radian angle. + + + + + Converts a grad (400-periodic) angle to a degree (360-periodic) angle. + + + The grad to convert. + + + The converted degree. + + + + + Converts a grad (400-periodic) angle to a radian (2*Pi-periodic) angle. + + + The grad to convert. + + + The converted radian. + + + + + Trigonometric Hyperbolic Cosecant + + + The angle in radian. + + + The hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Cosecant of a Complex number. + + + The complex value. + + + The hyperbolic cosecant of a complex number. + + + + + Trigonometric Hyperbolic Cosine + + + The angle in radian. + + + The hyperbolic Cosine of the radian angle. + + + + + Trigonometric Hyperbolic Cosine of a Complex number. + + + The complex value. + + + The hyperbolic cosine of a complex number. + + + + + Trigonometric Hyperbolic Cotangent + + + The angle in radian angle. + + + The hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Cotangent of a Complex number. + + + The complex value. + + + The hyperbolic cotangent of a complex number. + + + + + Trigonometric Hyperbolic Secant + + + The angle in radian angle. + + + The hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Secant of a Complex number. + + + The complex value. + + + The hyperbolic secant of a complex number. + + + + + Trigonometric Hyperbolic Sine + + + The angle in radian angle. + + + The hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Sine of a Complex number. + + + The complex value. + + + The hyperbolic sine of a complex number. + + + + + Trigonometric Hyperbolic Tangent in radian + + + The angle in radian angle. + + + The hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Tangent of a Complex number. + + + The complex value. + + + The hyperbolic tangent of a complex number. + + + + + Trigonometric Arc Cosecant in radian + + + The angle in radian angle. + + + The inverse cosecant of the radian angle. + + + if -1 < < 1. + + + + + Trigonometric Arc Cosecant of this Complex number. + + + The complex value. + + + The arc cosecant of a complex number. + + + + + Trigonometric Arc Cosine in radian + + + The angle in radian angle. + + + The inverse cosine of the radian angle. + + + if 1 < or < -1. + + + + + Trigonometric Arc Cosine of this Complex number. + + + The complex value. + + + The arc cosine of a complex number. + + + + + Trigonometric Arc Cotangent in radian + + + The angle in radian angle. + + + The inverse cotangent of the radian angle. + + + + + Trigonometric Arc Cotangent of this Complex number. + + + The complex value. + + + The arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Arc Cosecant + + + The angle in radian angle. + + + The inverse hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosecant of this Complex number. + + + The complex value. + + + The hyperbolic arc cosecant of a complex number. + + + + + Trigonometric Hyperbolic Area Cosine + + + The angle in radian angle. + + + The inverse hyperbolic cosine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosine of this Complex number. + + + The complex value. + + + The hyperbolic arc cosine of a complex number. + + + + + Trigonometric Hyperbolic Arc Cotangent + + + The angle in radian angle. + + + The inverse hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cotangent of this Complex number. + + + The complex value. + + + The hyperbolic arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Area Secant + + + The angle in radian angle. + + + The inverse hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Secant of this Complex number. + + + The complex value. + + + The hyperbolic arc secant of a complex number. + + + + + Trigonometric Hyperbolic Area Sine + + + The angle in radian angle. + + + The inverse hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Sine of this Complex number. + + + The complex value. + + + The hyperbolic arc sine of a complex number. + + + + + Trigonometric Hyperbolic Area Tangent + + + The angle in radian angle. + + + The inverse hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Tangent of this Complex number. + + + The complex value. + + + The hyperbolic arc tangent of a complex number. + + + + + Trigonometric Arc Secant in radian + + + The angle in radian angle. + + + The inverse secant of the radian angle. + + + + + Trigonometric Arc Secant of this Complex number. + + + The complex value. + + + The arc secant of a complex number. + + + + + Trigonometric Arc Sine in radian + + + The angle in radian angle. + + + The inverse sine of the radian angle. + + + + + Trigonometric Arc Sine of this Complex number. + + + The complex value. + + + The arc sine of a complex number. + + + + + Trigonometric Arc Tangent in radian + + + The angle in radian angle. + + + The inverse tangent of the radian angle. + + + + + Trigonometric Arc Tangent of this Complex number. + + + The complex value. + + + The arc tangent of a complex number. + + + + + Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + + + The radian to convert. + + + The converted degree. + + + + + Converts a radian (2*Pi-periodic) angle to a grad (400-periodic) angle. + + + The radian to convert. + + + The converted grad. + + + + + Trigonometric Secant of an angle in radian + + + The angle in radian. + + + The secant of the radian angle. + + + + + Trigonometric Secant of a Complex number. + + + The complex value. + + + The secant of the complex number. + + + + + Trigonometric Sine of an angle in radian + + + The angle in radian. + + + The sine of the radian angle. + + + + + Trigonometric Sine of a Complex number. + + + The complex value. + + + The sine of the complex number. + + + + + Trigonometric Tangent of an angle in radian + + + The angle in radian. + + + The tangent of the radian angle. + + + + + Trigonometric Tangent of a Complex number. + + + The complex value. + + + The tangent of the complex number. + + + + + Implements the univariate Student t-distribution. For details about this + distribution, see + + Wikipedia - Student's t-distribution. + + We use a slightly generalized version (compared to + Wikipedia) of the Student t-distribution. Namely, one which also + parameterizes the location and scale. See the book "Bayesian Data + Analysis" by Gelman et al. for more details. + The density of the Student t-distribution p(x|mu,scale,dof) = + Gamma((dof+1)/2) (1 + (x - mu)^2 / (scale * scale * dof))^(-(dof+1)/2) / + (Gamma(dof/2)*Sqrt(dof*pi*scale)). + The distribution will use the by + default. Users can get/set the random number generator by using the + property. + The statistics classes will check all the incoming parameters + whether they are in the allowed range. This might involve heavy + computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the location of the Student t-distribution. + + + + + Keeps track of the degrees of freedom for the Student t-distribution. + + + + + Keeps track of the scale for the Student t-distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the StudentT class. This is a Student t-distribution with location 0.0 + scale 1.0 and degrees of freedom 1. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the StudentT class with a particular location, scale and degrees of + freedom. The distribution will + be initialized with the default random number generator. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + When the parameters don't pass the function. + + + + Computes the density of the Student t-distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Student t-distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Student t-distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples student-t distributed random variables. + + The algorithm is method 2 in section 5, chapter 9 + in L. Devroye's "Non-Uniform Random Variate Generation" + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the standard student-t distribution. + a random number from the standard student-t distribution. + + + + Generates a sample from the Student t-distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Student t-distribution. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution using the Box-Muller algorithm. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Student t-distribution. + + + + + Gets or sets the scale of the Student t-distribution. + + + + + Gets or sets the degrees of freedom of the Student t-distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Student t-distribution. + + + + + Gets the variance of the Student t-distribution. + + + + + Gets the standard deviation of the Student t-distribution. + + + + + Gets the entropy of the Student t-distribution. + + + + + Gets the skewness of the Student t-distribution. + + + + + Gets the mode of the Student t-distribution. + + + + + Gets the median of the Student t-distribution. + + + + + Gets the minimum of the Student t-distribution. + + + + + Gets the maximum of the Student t-distribution. + + + + + This structure represents the type over which the distribution + is defined. + + + + + The mean value. + + + + + The precision value. + + + + + Initializes a new instance of the struct. + + + The mean of the pair. + + + The precision of the pair. + + + + + Gets or sets the mean of the pair. + + + + + Gets or sets the precision of the pair. + + + + + The distribution is the conjugate prior distribution for the + distribution. It specifies a prior over the mean and precision of the distribution. + It is parameterized by four numbers: the mean location, the mean scale, the precision shape and the + precision inverse scale. + The distribution NG(mu, tau | mloc,mscale,psscale,pinvscale) = Normal(mu | mloc, 1/(mscale*tau)) * Gamma(tau | psscale,pinvscale). + The following degenerate cases are special: when the precision is known, + the precision shape will encode the value of the precision while the precision inverse scale is positive + infinity. When the mean is known, the mean location will encode the value of the mean while the scale + will be positive infinity. A completely degenerate NormalGamma distribution with known mean and precision is possible as well. + Wikipedia - Normal-Gamma distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The location of the mean. + + + + + The scale of the mean. + + + + + The shape of the precision. + + + + + The inverse scale of the precision. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The location of the mean. + + + The scale of the mean. + + + The shape of the precision. + + + The inverse scale of the precision. + + + + + Checks whether the parameters of the distribution are valid. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + When the parameters don't pass the function. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Returns the marginal distribution for the mean of the NormalGamma distribution. + + the marginal distribution for the mean of the NormalGamma distribution. + + + + Returns the marginal distribution for the precision of the distribution. + + The marginal distribution for the precision of the distribution/ + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + Density value + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + Density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + The log of the density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + The log of the density value + + + + Generates a sample from the NormalGamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + a sequence of samples from the distribution. + + + + Generates a sample from the NormalGamma distribution. + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sequence of samples from the distribution. + + + + Gets or sets the location of the mean. + + + + + Gets or sets the scale of the mean. + + + + + Gets or sets the shape of the precision. + + + + + Gets or sets the inverse scale of the precision. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the variance of the distribution. + + The mean of the distribution. + +
+
diff --git a/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.dll b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.dll new file mode 100644 index 0000000..3b57317 Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.dll differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.pdb b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.pdb new file mode 100644 index 0000000..f087c2e Binary files /dev/null and b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.pdb differ diff --git a/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.xml b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.xml new file mode 100644 index 0000000..09b78d8 --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/lib/portable-net40+windows8+wp8+sl5/MathNet.Numerics.xml @@ -0,0 +1,44636 @@ + + + + MathNet.Numerics + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + + + + Interface to linear algebra algorithms that work off 1-D arrays. + + Supported data types are double, single, , and . + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiply elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the full QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + Rows must be greater or equal to columns. + The type of QR factorization to perform. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. On exit, work[0] contains the optimal work size value. + + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix + The number of columns of B. + On exit, the solution matrix. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + How to transpose a matrix. + + + + + Don't transpose a matrix. + + + + + Transpose a matrix. + + + + + Conjugate transpose a complex matrix. + + If a conjugate transpose is used with a real matrix, then the matrix is just transposed. + + + + Types of matrix norms. + + + + + The 1-norm. + + + + + The Frobenius norm. + + + + + The infinity norm. + + + + + The largest absolute value norm. + + + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + The managed linear algebra provider. + + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + The B matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Not used in the managed provider. + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the thin QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + This is equivalent to the GESVD LAPACK routine. + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Adds a scaled vector to another: result = y + alpha*x. + + The vector to update. + The value to scale by. + The vector to add to . + The result of the addition. + This is similar to the AXPY BLAS routine. + + + + Scales an array. Can be used to scale a vector and a matrix. + + The scalar. + The values to scale. + This result of the scaling. + This is similar to the SCAL BLAS routine. + + + + Computes the dot product of x and y. + + The vector x. + The vector y. + The dot product of x and y. + This is equivalent to the DOT BLAS routine. + + + + Does a point wise add of two arrays z = x + y. This can be used + to add vectors or matrices. + + The array x. + The array y. + The result of the addition. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise subtraction of two arrays z = x - y. This can be used + to subtract vectors or matrices. + + The array x. + The array y. + The result of the subtraction. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise multiplication of two arrays z = x * y. This can be used + to multiple elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise multiplication. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Does a point wise division of two arrays z = x / y. This can be used + to divide elements of vectors or matrices. + + The array x. + The array y. + The result of the point wise division. + There is no equivalent BLAS routine, but many libraries + provide optimized (parallel and/or vectorized) versions of this + routine. + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + + The requested of the matrix. + + + + + Computes the requested of the matrix. + + The type of norm to compute. + The number of rows. + The number of columns. + The matrix to compute the norm from. + The work array. Only used when + and needs to be have a length of at least M (number of rows of . + + The requested of the matrix. + + + + + Multiples two matrices. result = x * y + + The x matrix. + The number of rows in the x matrix. + The number of columns in the x matrix. + The y matrix. + The number of rows in the y matrix. + The number of columns in the y matrix. + Where to store the result of the multiplication. + This is a simplified version of the BLAS GEMM routine with alpha + set to 1.0 and beta set to 0.0, and x and y are not transposed. + + + + Multiplies two matrices and updates another with the result. c = alpha*op(a)*op(b) + beta*c + + How to transpose the matrix. + How to transpose the matrix. + The value to scale matrix. + The a matrix. + The number of rows in the matrix. + The number of columns in the matrix. + The b matrix + The number of rows in the matrix. + The number of columns in the matrix. + The value to scale the matrix. + The c matrix. + + + + Cache-Oblivious Matrix Multiplication + + if set to true transpose matrix A. + if set to true transpose matrix B. + The value to scale the matrix A with. + The matrix A. + Row-shift of the left matrix + Column-shift of the left matrix + The matrix B. + Row-shift of the right matrix + Column-shift of the right matrix + The matrix C. + Row-shift of the result matrix + Column-shift of the result matrix + The number of rows of matrix op(A) and of the matrix C. + The number of columns of matrix op(B) and of the matrix C. + The number of columns of matrix op(A) and the rows of the matrix op(B). + The constant number of rows of matrix op(A) and of the matrix C. + The constant number of columns of matrix op(B) and of the matrix C. + The constant number of columns of matrix op(A) and the rows of the matrix op(B). + Indicates if this is the first recursion. + + + + Computes the LUP factorization of A. P*A = L*U. + + An by matrix. The matrix is overwritten with the + the LU factorization on exit. The lower triangular factor L is stored in under the diagonal of (the diagonal is always 1.0 + for the L factor). The upper triangular factor U is stored on and above the diagonal of . + The order of the square matrix . + On exit, it contains the pivot indices. The size of the array must be . + This is equivalent to the GETRF LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + This is equivalent to the GETRI LAPACK routine. + + + + Computes the inverse of matrix using LU factorization. + + The N by N matrix to invert. Contains the inverse On exit. + The order of the square matrix . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRF and GETRI LAPACK routines. + + + + Computes the inverse of a previously factored matrix. + + The LU factored N by N matrix. Contains the inverse On exit. + The order of the square matrix . + The pivot indices of . + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is equivalent to the GETRI LAPACK routine. + + + + Solves A*X=B for X using LU factorization. + + The number of columns of B. + The square matrix A. + The order of the square matrix . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRF and GETRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The number of columns of B. + The factored A matrix. + The order of the square matrix . + The pivot indices of . + On entry the B matrix; on exit the X matrix. + This is equivalent to the GETRS LAPACK routine. + + + + Computes the Cholesky factorization of A. + + On entry, a square, positive definite matrix. On exit, the matrix is overwritten with the + the Cholesky factorization. + The number of rows or columns in the matrix. + This is equivalent to the POTRF LAPACK routine. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves A*X=B for X using Cholesky factorization. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRF add POTRS LAPACK routines. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The number of columns in the B matrix. + This is equivalent to the POTRS LAPACK routine. + + + + Solves A*X=B for X using a previously factored A matrix. + + The square, positive definite matrix A. Has to be different than . + The number of rows and columns in A. + On entry the B matrix; on exit the X matrix. + The column to solve for. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the R matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A M by M matrix that holds the Q matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Computes the QR factorization of A where M > N. + + On entry, it is the M by N A matrix to factor. On exit, + it is overwritten with the Q matrix of the QR factorization. + The number of rows in the A matrix. + The number of columns in the A matrix. + On exit, A N by N matrix that holds the R matrix of the + QR factorization. + A min(m,n) vector. On exit, contains additional information + to be used by the QR solve routine. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + This is similar to the GEQRF and ORGQR LAPACK routines. + + + + Perform calculation of Q or R + + Work array + Index of column in work array + Q or R matrices + The first row in + The last row + The first column + The last column + Number of available CPUs + + + + Generate column from initial matrix to work array + + Work array + Initial matrix + The number of rows in matrix + The first row + Column index + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using QR factorization of A. + + The A matrix. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The work array. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by QR factor. This is only used for the managed provider and can be + null for the native provider. The native provider uses the Q portion stored in the R matrix. + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + On entry the B matrix; on exit the X matrix. + The number of columns of B. + On exit, the solution matrix. + The work array - only used in the native provider. The array must have a length of at least N, + but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal + work size value. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Solves A*X=B for X using a previously QR factored matrix. + + The Q matrix obtained by calling . + The R matrix obtained by calling . + The number of rows in the A matrix. + The number of columns in the A matrix. + Contains additional information on Q. Only used for the native solver + and can be null for the managed provider. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + The type of QR factorization to perform. + Rows must be greater or equal to columns. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + This is equivalent to the GESVD LAPACK routine. + + + + Computes the singular value decomposition of A. + + Compute the singular U and VT vectors or not. + On entry, the M by N matrix to decompose. On exit, A may be overwritten. + The number of rows in the A matrix. + The number of columns in the A matrix. + The singular values of A in ascending value. + If is true, on exit U contains the left + singular vectors. + If is true, on exit VT contains the transposed + right singular vectors. + The work array. Length should be at least . + + + + Given the Cartesian coordinates (da, db) of a point p, these function return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Solves A*X=B for X using the singular value decomposition of A. + + On entry, the M by N matrix to decompose. + The number of rows in the A matrix. + The number of columns in the A matrix. + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Solves A*X=B for X using a previously SVD decomposed matrix. + + The number of rows in the A matrix. + The number of columns in the A matrix. + The s values returned by . + The left singular vectors returned by . + The right singular vectors returned by . + The B matrix. + The number of columns of B. + On exit, the solution matrix. + + + + Useful extension methods for Arrays. + + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Copies the values from on array to another. + + The source array. + The destination array. + + + + Enumerative Combinatorics and Counting. + + + + + Counts the number of possible variations without repetition. + The order matters and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of distinct variations. + + + + Counts the number of possible variations with repetition. + The order matters and each object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of distinct variations with repetition. + + + + Counts the number of possible combinations without repetition. + The order does not matter and each object can be chosen only once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen at most once. + Maximum number of combinations. + + + + Counts the number of possible combinations with repetition. + The order does not matter and an object can be chosen more than once. + + Number of elements in the set. + Number of elements to choose from the set. Each element is chosen 0, 1 or multiple times. + Maximum number of combinations with repetition. + + + + Counts the number of possible permutations (without repetition). + + Number of (distinguishable) elements in the set. + Maximum number of permutations without repetition. + + + + 32-bit single precision complex numbers class. + + + + The class Complex32 provides all elementary operations + on complex numbers. All the operators +, -, + *, /, ==, != are defined in the + canonical way. Additional complex trigonometric functions + are also provided. Note that the Complex32 structures + has two special constant values and + . + + + + Complex32 x = new Complex32(1f,2f); + Complex32 y = Complex32.FromPolarCoordinates(1f, Math.Pi); + Complex32 z = (x + y) / (x - y); + + + + For mathematical details about complex numbers, please + have a look at the + Wikipedia + + + + + + Support Interface for Precision Operations (like AlmostEquals). + + Type of the implementing class. + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The value to compare with. + A norm of the difference between this and the other value. + + + + The real component of the complex number. + + + + + The imaginary component of the complex number. + + + + + Initializes a new instance of the Complex32 structure with the given real + and imaginary parts. + + The value for the real component. + The value for the imaginary component. + + + + Creates a complex number from a point's polar coordinates. + + A complex number. + The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number. + The phase, which is the angle from the line to the horizontal axis, measured in radians. + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to one and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to one. + + + + + Returns a new instance + with real and imaginary numbers positive infinite. + + + + + Returns a new instance + with real and imaginary numbers not a number. + + + + + Gets a value indicating whether the Complex32 is zero. + + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + + true if this instance is ; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + + true if this instance is real nonnegative number; otherwise, false. + + + + + Exponential of this Complex32 (exp(x), E^x). + + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex32 (Base E). + + The natural logarithm of this complex number. + + + + Common Logarithm of this Complex32 (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex32 with custom base. + + The logarithm of this complex number. + + + + Raise this Complex32 to the given value. + + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex32 to the inverse of the given value. + + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex32 + + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex32 + + + The square root of this complex number. + + + + + Equality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real and imaginary components of the two complex numbers are equal; false otherwise. + + + + Inequality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real or imaginary components of the two complex numbers are not equal; false otherwise. + + + + Unary addition. + + The complex number to operate on. + Returns the same complex number. + + + + Unary minus. + + The complex number to operate on. + The negated value of the . + + + Addition operator. Adds two complex numbers together. + The result of the addition. + One of the complex numbers to add. + The other complex numbers to add. + + + Subtraction operator. Subtracts two complex numbers. + The result of the subtraction. + The complex number to subtract from. + The complex number to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The complex numbers to add. + The float value to add. + + + Subtraction operator. Subtracts float value from a complex value. + The result of the subtraction. + The complex number to subtract from. + The float value to subtract. + + + Addition operator. Adds a complex number and float together. + The result of the addition. + The float value to add. + The complex numbers to add. + + + Subtraction operator. Subtracts complex value from a float value. + The result of the subtraction. + The float vale to subtract from. + The complex value to subtract. + + + Multiplication operator. Multiplies two complex numbers. + The result of the multiplication. + One of the complex numbers to multiply. + The other complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The float value to multiply. + The complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a float value. + The result of the multiplication. + The complex number to multiply. + The float value to multiply. + + + Division operator. Divides a complex number by another. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a float value by a complex number. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a complex number by a float value. + The result of the division. + The dividend. + The divisor. + + + + Computes the conjugate of a complex number and returns the result. + + + + + Returns the multiplicative inverse of a complex number. + + + + + Converts the value of the current complex number to its equivalent string representation in Cartesian form. + + The string representation of the current instance in Cartesian form. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format for its real and imaginary parts. + + The string representation of the current instance in Cartesian form. + A standard or custom numeric format string. + + is not a valid format string. + + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified culture-specific formatting information. + + The string representation of the current instance in Cartesian form, as specified by . + An object that supplies culture-specific formatting information. + + + Converts the value of the current complex number to its equivalent string representation + in Cartesian form by using the specified format and culture-specific format information for its real and imaginary parts. + The string representation of the current instance in Cartesian form, as specified by and . + A standard or custom numeric format string. + An object that supplies culture-specific formatting information. + + is not a valid format string. + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + The hash code for the complex number. + + + The hash code of the complex number. + + + The hash code is calculated as + System.Math.Exp(ComplexMath.Absolute(complexNumber)). + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + + A norm of this value. + + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + + The value to compare with. + + + A norm of the difference between this and the other value. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a float. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as float. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Explicit conversion of a real decimal to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Explicit conversion of a Complex to a Complex32. + + The decimal value to convert. + The result of the conversion. + + + + Implicit conversion of a real byte to a Complex32. + + The byte value to convert. + The result of the conversion. + + + + Implicit conversion of a real short to a Complex32. + + The short value to convert. + The result of the conversion. + + + + Implicit conversion of a signed byte to a Complex32. + + The signed byte value to convert. + The result of the conversion. + + + + Implicit conversion of a unsgined real short to a Complex32. + + The unsgined short value to convert. + The result of the conversion. + + + + Implicit conversion of a real int to a Complex32. + + The int value to convert. + The result of the conversion. + + + + Implicit conversion of a real long to a Complex32. + + The long value to convert. + The result of the conversion. + + + + Implicit conversion of a real uint to a Complex32. + + The uint value to convert. + The result of the conversion. + + + + Implicit conversion of a real ulong to a Complex32. + + The ulong value to convert. + The result of the conversion. + + + + Implicit conversion of a real float to a Complex32. + + The float value to convert. + The result of the conversion. + + + + Implicit conversion of a real double to a Complex32. + + The double value to convert. + The result of the conversion. + + + + Converts this Complex32 to a . + + A with the same values as this Complex32. + + + + Returns the additive inverse of a specified complex number. + + The result of the and components of the parameter multiplied by -1. + A complex number. + + + + Computes the conjugate of a complex number and returns the result. + + The conjugate of . + A complex number. + + + + Adds two complex numbers and returns the result. + + The sum of and . + The first complex number to add. + The second complex number to add. + + + + Subtracts one complex number from another and returns the result. + + The result of subtracting from . + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + + + Returns the product of two complex numbers. + + The product of the and parameters. + The first complex number to multiply. + The second complex number to multiply. + + + + Divides one complex number by another and returns the result. + + The quotient of the division. + The complex number to be divided. + The complex number to divide by. + + + + Returns the multiplicative inverse of a complex number. + + The reciprocal of . + A complex number. + + + + Returns the square root of a specified complex number. + + The square root of . + A complex number. + + + + Gets the absolute value (or magnitude) of a complex number. + + The absolute value of . + A complex number. + + + + Returns e raised to the power specified by a complex number. + + The number e raised to the power . + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a complex number. + + The complex number raised to the power . + A complex number to be raised to a power. + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a single-precision floating-point number. + + The complex number raised to the power . + A complex number to be raised to a power. + A single-precision floating-point number that specifies a power. + + + + Returns the natural (base e) logarithm of a specified complex number. + + The natural (base e) logarithm of . + A complex number. + + + + Returns the logarithm of a specified complex number in a specified base. + + The logarithm of in base . + A complex number. + The base of the logarithm. + + + + Returns the base-10 logarithm of a specified complex number. + + The base-10 logarithm of . + A complex number. + + + + Returns the sine of the specified complex number. + + The sine of . + A complex number. + + + + Returns the cosine of the specified complex number. + + The cosine of . + A complex number. + + + + Returns the tangent of the specified complex number. + + The tangent of . + A complex number. + + + + Returns the angle that is the arc sine of the specified complex number. + + The angle which is the arc sine of . + A complex number. + + + + Returns the angle that is the arc cosine of the specified complex number. + + The angle, measured in radians, which is the arc cosine of . + A complex number that represents a cosine. + + + + Returns the angle that is the arc tangent of the specified complex number. + + The angle that is the arc tangent of . + A complex number. + + + + Returns the hyperbolic sine of the specified complex number. + + The hyperbolic sine of . + A complex number. + + + + Returns the hyperbolic cosine of the specified complex number. + + The hyperbolic cosine of . + A complex number. + + + + Returns the hyperbolic tangent of the specified complex number. + + The hyperbolic tangent of . + A complex number. + + + + Gets the real component of the complex number. + + The real component of the complex number. + + + + Gets the real imaginary component of the complex number. + + The real imaginary component of the complex number. + + + + Gets the phase or argument of this Complex32. + + + Phase always returns a value bigger than negative Pi and + smaller or equal to Pi. If this Complex32 is zero, the Complex32 + is assumed to be positive real with an argument of zero. + + The phase or argument of this Complex32 + + + + Gets the magnitude (or absolute value) of a complex number. + + The magnitude of the current instance. + + + + Gets the squared magnitude (or squared absolute value) of a complex number. + + The squared magnitude of the current instance. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex32. + + + + 64-bit double precision complex numbers class. + + + + The class Complex provides all elementary operations + on complex numbers. All the operators +, -, + *, /, ==, != are defined in the + canonical way. Additional complex trigonometric functions + are also provided. Note that the Complex structures + has two special constant values and + . + + + + Complex x = new Complex(1d, 2d); + Complex y = Complex.FromPolarCoordinates(1d, Math.Pi); + Complex z = (x + y) / (x - y); + + + + For mathematical details about complex numbers, please + have a look at the + Wikipedia + + + + + + The real component of the complex number. + + + + + The imaginary component of the complex number. + + + + + Initializes a new instance of the Complex structure with the given real + and imaginary parts. + + The value for the real component. + The value for the imaginary component. + + + + Creates a complex number from a point's polar coordinates. + + A complex number. + The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number. + The phase, which is the angle from the line to the horizontal axis, measured in radians. + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to one and an imaginary number equal to zero. + + + + + Returns a new instance + with a real number equal to zero and an imaginary number equal to one. + + + + + Returns a new instance + with real and imaginary numbers positive infinite. + + + + + Returns a new instance + with real and imaginary numbers not a number. + + + + + Equality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real and imaginary components of the two complex numbers are equal; false otherwise. + + + + Inequality test. + + One of complex numbers to compare. + The other complex numbers to compare. + true if the real or imaginary components of the two complex numbers are not equal; false otherwise. + + + + Unary addition. + + The complex number to operate on. + Returns the same complex number. + + + + Unary minus. + + The complex number to operate on. + The negated value of the . + + + Addition operator. Adds two complex numbers together. + The result of the addition. + One of the complex numbers to add. + The other complex numbers to add. + + + Subtraction operator. Subtracts two complex numbers. + The result of the subtraction. + The complex number to subtract from. + The complex number to subtract. + + + Addition operator. Adds a complex number and double together. + The result of the addition. + The complex numbers to add. + The double value to add. + + + Subtraction operator. Subtracts double value from a complex value. + The result of the subtraction. + The complex number to subtract from. + The double value to subtract. + + + Addition operator. Adds a complex number and double together. + The result of the addition. + The double value to add. + The complex numbers to add. + + + Subtraction operator. Subtracts complex value from a double value. + The result of the subtraction. + The double vale to subtract from. + The complex value to subtract. + + + Multiplication operator. Multiplies two complex numbers. + The result of the multiplication. + One of the complex numbers to multiply. + The other complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a double value. + The result of the multiplication. + The double value to multiply. + The complex number to multiply. + + + Multiplication operator. Multiplies a complex number with a double value. + The result of the multiplication. + The complex number to multiply. + The double value to multiply. + + + Division operator. Divides a complex number by another. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a double value by a complex number. + The result of the division. + The dividend. + The divisor. + + + Division operator. Divides a complex number by a double value. + The result of the division. + The dividend. + The divisor. + + + + A string representation of this complex number. + + + The string representation of this complex number. + + + + + A string representation of this complex number. + + + The string representation of this complex number formatted as specified by the + format string. + + + A format specification. + + + + + A string representation of this complex number. + + + The string representation of this complex number formatted as specified by the + format provider. + + + An that supplies culture-specific formatting information. + + + + + A string representation of this complex number. + + + The string representation of this complex number formatted as specified by the + format string and format provider. + + + if the n, is not a number. + + + if s, is . + + + A format specification. + + + An that supplies culture-specific formatting information. + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + The hash code for the complex number. + + + The hash code of the complex number. + + + The hash code is calculated as + System.Math.Exp(ComplexMath.Absolute(complexNumber)). + + + + + Checks if two complex numbers are equal. Two complex numbers are equal if their + corresponding real and imaginary components are equal. + + + Returns true if the two objects are the same object, or if their corresponding + real and imaginary components are equal, false otherwise. + + + The complex number to compare to with. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + + A norm of this value. + + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + + The value to compare with. + + + A norm of the difference between this and the other value. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as double. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Explicit conversion of a real decimal to a Complex. + + The decimal value to convert. + The result of the conversion. + + + + Explicit conversion of a Complex to a Complex. + + The decimal value to convert. + The result of the conversion. + + + + Implicit conversion of a real byte to a Complex. + + The byte value to convert. + The result of the conversion. + + + + Implicit conversion of a real short to a Complex. + + The short value to convert. + The result of the conversion. + + + + Implicit conversion of a signed byte to a Complex. + + The signed byte value to convert. + The result of the conversion. + + + + Implicit conversion of a unsgined real short to a Complex. + + The unsgined short value to convert. + The result of the conversion. + + + + Implicit conversion of a real int to a Complex. + + The int value to convert. + The result of the conversion. + + + + Implicit conversion of a real long to a Complex. + + The long value to convert. + The result of the conversion. + + + + Implicit conversion of a real uint to a Complex. + + The uint value to convert. + The result of the conversion. + + + + Implicit conversion of a real ulong to a Complex. + + The ulong value to convert. + The result of the conversion. + + + + Implicit conversion of a real double to a Complex. + + The double value to convert. + The result of the conversion. + + + + Implicit conversion of a real float to a Complex. + + The double value to convert. + The result of the conversion. + + + + Converts this Complex to a . + + A with the same values as this Complex. + + + + Returns the additive inverse of a specified complex number. + + The result of the and components of the parameter multiplied by -1. + A complex number. + + + + Computes the conjugate of a complex number and returns the result. + + The conjugate of . + A complex number. + + + + Adds two complex numbers and returns the result. + + The sum of and . + The first complex number to add. + The second complex number to add. + + + + Subtracts one complex number from another and returns the result. + + The result of subtracting from . + The value to subtract from (the minuend). + The value to subtract (the subtrahend). + + + + Returns the product of two complex numbers. + + The product of the and parameters. + The first complex number to multiply. + The second complex number to multiply. + + + + Divides one complex number by another and returns the result. + + The quotient of the division. + The complex number to be divided. + The complex number to divide by. + + + + Returns the multiplicative inverse of a complex number. + + The reciprocal of . + A complex number. + + + + Returns the square root of a specified complex number. + + The square root of . + A complex number. + + + + Gets the absolute value (or magnitude) of a complex number. + + A complex number. + The absolute value (or magnitude) of a complex number. + + + + Returns e raised to the power specified by a complex number. + + The number e raised to the power . + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a complex number. + + The complex number raised to the power . + A complex number to be raised to a power. + A complex number that specifies a power. + + + + Returns a specified complex number raised to a power specified by a double-precision floating-point number. + + The complex number raised to the power . + A complex number to be raised to a power. + A double-precision floating-point number that specifies a power. + + + + Returns the natural (base e) logarithm of a specified complex number. + + The natural (base e) logarithm of . + A complex number. + + + + Returns the logarithm of a specified complex number in a specified base. + + The logarithm of in base . + A complex number. + The base of the logarithm. + + + + Returns the base-10 logarithm of a specified complex number. + + The base-10 logarithm of . + A complex number. + + + + Returns the sine of the specified complex number. + + The sine of . + A complex number. + + + + Returns the cosine of the specified complex number. + + The cosine of . + A complex number. + + + + Returns the tangent of the specified complex number. + + The tangent of . + A complex number. + + + + Returns the angle that is the arc sine of the specified complex number. + + The angle which is the arc sine of . + A complex number. + + + + Returns the angle that is the arc cosine of the specified complex number. + + The angle, measured in radians, which is the arc cosine of . + A complex number that represents a cosine. + + + + Returns the angle that is the arc tangent of the specified complex number. + + The angle that is the arc tangent of . + A complex number. + + + + Returns the hyperbolic sine of the specified complex number. + + The hyperbolic sine of . + A complex number. + + + + Returns the hyperbolic cosine of the specified complex number. + + The hyperbolic cosine of . + A complex number. + + + + Returns the hyperbolic tangent of the specified complex number. + + The hyperbolic tangent of . + A complex number. + + + + Gets the real component of the complex number. + + The real component of the complex number. + + + + Gets the real imaginary component of the complex number. + + The real imaginary component of the complex number. + + + + Gets the phase or argument of this Complex. + + + Phase always returns a value bigger than negative Pi and + smaller or equal to Pi. If this Complex is zero, the Complex + is assumed to be positive real with an argument of zero. + + The phase or argument of this Complex + + + + Gets the magnitude (or absolute value) of a complex number. + + The magnitude of the current instance. + + + + Extension methods for the Complex type provided by System.Numerics + + + + + Gets the squared magnitude of the Complex number. + + The number to perfom this operation on. + The squared magnitude of the Complex number. + + + + Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg)) + + The unity of this Complex. + + + + Gets the conjugate of the Complex number. + + The number to perfom this operation on. + + The semantic of setting the conjugate is such that + + // a, b of type Complex32 + a.Conjugate = b; + + is equivalent to + + // a, b of type Complex32 + a = b.Conjugate + + + The conjugate of the number. + + + + Returns the multiplicative inverse of a complex number. + + + + + Exponential of this Complex (exp(x), E^x). + + The number to perfom this operation on. + + The exponential of this complex number. + + + + + Natural Logarithm of this Complex (Base E). + + The number to perfom this operation on. + + The natural logarithm of this complex number. + + + + + Common Logarithm of this Complex (Base 10). + + The common logarithm of this complex number. + + + + Logarithm of this Complex with custom base. + + The logarithm of this complex number. + + + + Raise this Complex to the given value. + + The number to perfom this operation on. + + The exponent. + + + The complex number raised to the given exponent. + + + + + Raise this Complex to the inverse of the given value. + + The number to perfom this operation on. + + The root exponent. + + + The complex raised to the inverse of the given exponent. + + + + + The Square (power 2) of this Complex + + The number to perfom this operation on. + + The square of this complex number. + + + + + The Square Root (power 1/2) of this Complex + + The number to perfom this operation on. + + The square root of this complex number. + + + + + Gets a value indicating whether the Complex32 is zero. + + The number to perfom this operation on. + true if this instance is zero; otherwise, false. + + + + Gets a value indicating whether the Complex32 is one. + + The number to perfom this operation on. + true if this instance is one; otherwise, false. + + + + Gets a value indicating whether the Complex32 is the imaginary unit. + + true if this instance is ImaginaryOne; otherwise, false. + The number to perfom this operation on. + + + + Gets a value indicating whether the provided Complex32evaluates + to a value that is not a number. + + The number to perfom this operation on. + + true if this instance is NaN; otherwise, + false. + + + + + Gets a value indicating whether the provided Complex32 evaluates to an + infinite value. + + The number to perfom this operation on. + + true if this instance is infinite; otherwise, false. + + + True if it either evaluates to a complex infinity + or to a directed infinity. + + + + + Gets a value indicating whether the provided Complex32 is real. + + The number to perfom this operation on. + true if this instance is a real number; otherwise, false. + + + + Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0. + + The number to perfom this operation on. + + true if this instance is real nonnegative number; otherwise, false. + + + + + Returns a Norm of a value of this type, which is appropriate for measuring how + close this value is to zero. + + The number to perfom this operation on. + A norm of this value. + + + + Returns a Norm of the difference of two values of this type, which is + appropriate for measuring how close together these two values are. + + The number to perfom this operation on. + The value to compare with. + A norm of the difference between this and the other value. + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + The string to parse. + + + + + Creates a complex number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Parse a part (real or complex) from a complex number. + + Start Token. + Is set to true if the part identified itself as being imaginary. + + An that supplies culture-specific + formatting information. + + Resulting part as double. + + + + + Converts the string representation of a complex number to a double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to double-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + + + Creates a Complex32 number based on a string. The string can be in the + following formats (without the quotes): 'n', 'ni', 'n +/- ni', + 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. + + + A complex number containing the value specified by the given string. + + + the string to parse. + + + An that supplies culture-specific + formatting information. + + + + + Converts the string representation of a complex number to a single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain complex32.Zero. This parameter is passed uninitialized. + + + + + Converts the string representation of a complex number to single-precision complex number equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex number to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will contain Complex.Zero. This parameter is passed uninitialized. + + + + + A collection of frequently used mathematical constants. + + + + The number e + + + The number log[2](e) + + + The number log[10](e) + + + The number log[e](2) + + + The number log[e](10) + + + The number log[e](pi) + + + The number log[e](2*pi)/2 + + + The number 1/e + + + The number sqrt(e) + + + The number sqrt(2) + + + The number sqrt(1/2) = 1/sqrt(2) = sqrt(2)/2 + + + The number sqrt(3)/2 + + + The number pi + + + The number 2*pi + + + The number 1/pi + + + The number pi/2 + + + The number pi/4 + + + The number sqrt(pi) + + + The number sqrt(2pi) + + + The number sqrt(2*pi*e) + + + The number log(sqrt(2*pi)) + + + The number log(sqrt(2*pi*e)) + + + The number log(2 * sqrt(e / pi)) + + + The number 1/pi + + + The number 2/pi + + + The number 1/sqrt(pi) + + + The number 1/sqrt(2pi) + + + The number 2/sqrt(pi) + + + The number 2 * sqrt(e / pi) + + + The number (pi)/180 - factor to convert from Degree (deg) to Radians (rad). + + + + + The number (pi)/200 - factor to convert from NewGrad (grad) to Radians (rad). + + + + + The number ln(10)/20 - factor to convert from Power Decibel (dB) to Neper (Np). Use this version when the Decibel represent a power gain but the compared values are not powers (e.g. amplitude, current, voltage). + + + The number ln(10)/10 - factor to convert from Neutral Decibel (dB) to Neper (Np). Use this version when either both or neither of the Decibel and the compared values represent powers. + + + The Catalan constant + Sum(k=0 -> inf){ (-1)^k/(2*k + 1)2 } + + + The Euler-Mascheroni constant + lim(n -> inf){ Sum(k=1 -> n) { 1/k - log(n) } } + + + The number (1+sqrt(5))/2, also known as the golden ratio + + + The Glaisher constant + e^(1/12 - Zeta(-1)) + + + The Khinchin constant + prod(k=1 -> inf){1+1/(k*(k+2))^log(k,2)} + + + + The size of a double in bytes. + + + + + The size of an int in bytes. + + + + + The size of a float in bytes. + + + + + The size of a Complex in bytes. + + + + + The size of a Complex in bytes. + + + + Speed of Light in Vacuum: c_0 = 2.99792458e8 [m s^-1] (defined, exact; 2007 CODATA) + + + Magnetic Permeability in Vacuum: mu_0 = 4*Pi * 10^-7 [N A^-2 = kg m A^-2 s^-2] (defined, exact; 2007 CODATA) + + + Electric Permittivity in Vacuum: epsilon_0 = 1/(mu_0*c_0^2) [F m^-1 = A^2 s^4 kg^-1 m^-3] (defined, exact; 2007 CODATA) + + + Characteristic Impedance of Vacuum: Z_0 = mu_0*c_0 [Ohm = m^2 kg s^-3 A^-2] (defined, exact; 2007 CODATA) + + + Newtonian Constant of Gravitation: G = 6.67429e-11 [m^3 kg^-1 s^-2] (2007 CODATA) + + + Planck's constant: h = 6.62606896e-34 [J s = m^2 kg s^-1] (2007 CODATA) + + + Reduced Planck's constant: h_bar = h / (2*Pi) [J s = m^2 kg s^-1] (2007 CODATA) + + + Planck mass: m_p = (h_bar*c_0/G)^(1/2) [kg] (2007 CODATA) + + + Planck temperature: T_p = (h_bar*c_0^5/G)^(1/2)/k [K] (2007 CODATA) + + + Planck length: l_p = h_bar/(m_p*c_0) [m] (2007 CODATA) + + + Planck time: t_p = l_p/c_0 [s] (2007 CODATA) + + + Elementary Electron Charge: e = 1.602176487e-19 [C = A s] (2007 CODATA) + + + Magnetic Flux Quantum: theta_0 = h/(2*e) [Wb = m^2 kg s^-2 A^-1] (2007 CODATA) + + + Conductance Quantum: G_0 = 2*e^2/h [S = m^-2 kg^-1 s^3 A^2] (2007 CODATA) + + + Josephson Constant: K_J = 2*e/h [Hz V^-1] (2007 CODATA) + + + Von Klitzing Constant: R_K = h/e^2 [Ohm = m^2 kg s^-3 A^-2] (2007 CODATA) + + + Bohr Magneton: mu_B = e*h_bar/2*m_e [J T^-1] (2007 CODATA) + + + Nuclear Magneton: mu_N = e*h_bar/2*m_p [J T^-1] (2007 CODATA) + + + Fine Structure Constant: alpha = e^2/4*Pi*e_0*h_bar*c_0 [1] (2007 CODATA) + + + Rydberg Constant: R_infty = alpha^2*m_e*c_0/2*h [m^-1] (2007 CODATA) + + + Bor Radius: a_0 = alpha/4*Pi*R_infty [m] (2007 CODATA) + + + Hartree Energy: E_h = 2*R_infty*h*c_0 [J] (2007 CODATA) + + + Quantum of Circulation: h/2*m_e [m^2 s^-1] (2007 CODATA) + + + Fermi Coupling Constant: G_F/(h_bar*c_0)^3 [GeV^-2] (2007 CODATA) + + + Weak Mixin Angle: sin^2(theta_W) [1] (2007 CODATA) + + + Electron Mass: [kg] (2007 CODATA) + + + Electron Mass Energy Equivalent: [J] (2007 CODATA) + + + Electron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Electron Compton Wavelength: [m] (2007 CODATA) + + + Classical Electron Radius: [m] (2007 CODATA) + + + Tomson Cross Section: [m^2] (2002 CODATA) + + + Electron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Electon G-Factor: [1] (2007 CODATA) + + + Muon Mass: [kg] (2007 CODATA) + + + Muon Mass Energy Equivalent: [J] (2007 CODATA) + + + Muon Molar Mass: [kg mol^-1] (2007 CODATA) + + + Muon Compton Wavelength: [m] (2007 CODATA) + + + Muon Magnetic Moment: [J T^-1] (2007 CODATA) + + + Muon G-Factor: [1] (2007 CODATA) + + + Tau Mass: [kg] (2007 CODATA) + + + Tau Mass Energy Equivalent: [J] (2007 CODATA) + + + Tau Molar Mass: [kg mol^-1] (2007 CODATA) + + + Tau Compton Wavelength: [m] (2007 CODATA) + + + Proton Mass: [kg] (2007 CODATA) + + + Proton Mass Energy Equivalent: [J] (2007 CODATA) + + + Proton Molar Mass: [kg mol^-1] (2007 CODATA) + + + Proton Compton Wavelength: [m] (2007 CODATA) + + + Proton Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton G-Factor: [1] (2007 CODATA) + + + Proton Shielded Magnetic Moment: [J T^-1] (2007 CODATA) + + + Proton Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Proton Shielded Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Neutron Mass: [kg] (2007 CODATA) + + + Neutron Mass Energy Equivalent: [J] (2007 CODATA) + + + Neutron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Neuron Compton Wavelength: [m] (2007 CODATA) + + + Neutron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Neutron G-Factor: [1] (2007 CODATA) + + + Neutron Gyro-Magnetic Ratio: [s^-1 T^-1] (2007 CODATA) + + + Deuteron Mass: [kg] (2007 CODATA) + + + Deuteron Mass Energy Equivalent: [J] (2007 CODATA) + + + Deuteron Molar Mass: [kg mol^-1] (2007 CODATA) + + + Deuteron Magnetic Moment: [J T^-1] (2007 CODATA) + + + Helion Mass: [kg] (2007 CODATA) + + + Helion Mass Energy Equivalent: [J] (2007 CODATA) + + + Helion Molar Mass: [kg mol^-1] (2007 CODATA) + + + Avogadro constant: [mol^-1] (2010 CODATA) + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 000 + + + The SI prefix factor corresponding to 1 000 000 + + + The SI prefix factor corresponding to 1 000 + + + The SI prefix factor corresponding to 100 + + + The SI prefix factor corresponding to 10 + + + The SI prefix factor corresponding to 0.1 + + + The SI prefix factor corresponding to 0.01 + + + The SI prefix factor corresponding to 0.001 + + + The SI prefix factor corresponding to 0.000 001 + + + The SI prefix factor corresponding to 0.000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 001 + + + The SI prefix factor corresponding to 0.000 000 000 000 000 000 000 001 + + + + Sets parameters for the library. + + + + + Given the number elements, should the operation be parallelized. + + The number elements to check. + true if the operation should be parallelized; false otherwise. + + + + Gets or sets a value indicating whether the distribution classes check validate each parameter. + For the multivariate distributions this could involve an expensive matrix factorization. + The default setting of this property is true. + + + + + Gets or sets a value indicating whether to use thread safe random number generators (RNG). + Thread safe RNG about two and half time slower than non-thread safe RNG. + + + true to use thread safe random number generators ; otherwise, false. + + + + + Gets or sets a value indicating whether parallelization shall be disabled globally. + + + + + Gets or sets the linear algebra provider. + + The linear algebra provider. + + + + Gets or sets a value indicating how many parallel worker threads shall be used + when parallelization is applicable. + + Default to the number of processor cores, must be between 1 and 1024 (inclusive). + + + + Gets or sets the the block size to use for + the native linear algebra provider. + + The block size. Default 512, must be at least 32. + + + + Gets or sets the order of the matrix when linear algebra provider + must calculate multiply in parallel threads. + + The order. Default 64, must be at least 3. + + + + Gets or sets the number of elements a vector or matrix + must contain before we multiply threads. + + Number of elements. Default 300, must be at least 3. + + + + Maximum number of columns to print in ToString methods by default. + + + + + Maximum number of rows to print in ToString methods by default. + + + + + Implements the Beta distribution. For details about this distribution, see + Wikipedia - Beta distribution. + + + There are a few special cases for the parameterization of the Beta distribution. When both + shape parameters are positive infinity, the Beta distribution degenerates to a point distribution + at 0.5. When one of the shape parameters is positive infinity, the distribution degenerates to a point + distribution at the positive infinity. When both shape parameters are 0.0, the Beta distribution + degenerates to a Bernoulli distribution with parameter 0.5. When one shape parameter is 0.0, the + distribution degenerates to a point distribution at the non-zero shape parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for continuous univariate distributions. + + + + + The interface for univariate distributions. + + + + + Computes the cumulative distribution function (cdf) for this probability distribution. + + The location at which to compute the cumulative distribution function. + the cumulative distribution at location . + + + + Gets or sets the random number generator which is used to generate random samples from the distribution. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + The probability density of the distribution. + + The location at which to compute the density. + the density at . + + + + The log probability density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by a double. + + + + + Gets the largest element in the domain of the distributions which can be represented by a double. + + + + + Beta shape parameter a. + + + + + Beta shape parameter b. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Beta class. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + If any of the Beta parameters are negative. + + + + A string representation of the distribution. + + A string representation of the Beta distribution. + + + + Checks whether the parameters of the distribution are valid. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + When the parameters don't pass the function. + + + + Computes the density of the Beta distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Beta distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Beta distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples Beta distributed random variables by sampling two Gamma variables and normalizing. + + The random number generator to use. + The A shape parameter. + The B shape parameter. + a random number from the Beta distribution. + + + + Generates a sample from the Beta distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Beta distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The a shape parameter of the Beta distribution. + The b shape parameter of the Beta distribution. + a sequence of samples from the distribution. + + + + Gets or sets the A shape parameter of the Beta distribution. + + + + + Gets or sets the B shape parameter of the Beta distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Beta distribution. + + + + + Gets the variance of the Beta distribution. + + + + + Gets the standard deviation of the Beta distribution. + + + + + Gets the entropy of the Beta distribution. + + + + + Gets the skewness of the Beta distribution. + + + + + Gets the mode of the Beta distribution; when there are multiple answers, this routine will return 0.5. + + + + + Gets the median of the Beta distribution. + + + + + Gets the minimum of the Beta distribution. + + + + + Gets the maximum of the Beta distribution. + + + + + The Cauchy distribution is a symmetric continuous probability distribution. For details about this distribution, see + Wikipedia - Cauchy distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale of the Cauchy distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class with the location parameter set to 0 and the scale parameter set to 1 + + + + + Initializes a new instance of the class. + + + The location parameter for the distribution. + + + The scale parameter for the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + Location parameter. + Scale parameter. Must be greater than 0. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Location parameter. + Scale parameter. Must be greater than 0. + True when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Chi distribution. This distribution is + a continuous probability distribution. The distribution usually arises when a k-dimensional vector's orthogonal + components are independent and each follow a standard normal distribution. The length of the vector will + then have a chi distribution. + Wikipedia - Chi distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the degrees of freedom for the Chi distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Chi distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Chi distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Chi distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + Degrees of Freedom + a random number from the distribution. + + + + Generates a sample from the Chi distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Chi distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + Degrees of Freedom + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + Degrees of Freedom + a sequence of samples from the distribution. + + + + Gets or sets the degrees of freedom of the Chi distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the ChiSquare distribution. This distribution is + a sum of the squares of k independent standard normal random variables. + Wikipedia - ChiSquare distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the ChiSquare distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the ChiSquare distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the ChiSquare distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The degrees of freedom. + a random number from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ChiSquare distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ChiSquare distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The degrees of freedom. + a sample from the distribution. + + + + Gets or sets the degrees of freedom of the ChiSquare distribution. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The continuous uniform distribution is a distribution over real numbers. For details about this distribution, see + Wikipedia - Continuous uniform distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the ContinuousUniform class with lower bound 0 and upper bound 1. + + + + + Initializes a new instance of the ContinuousUniform class with given lower and upper bounds. + + Lower bound. + Upper bound; must be at least as large as . + If the upper bound is smaller than the lower bound. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the ContinuousUniform distribution without parameter checking. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed random number. + + + + Generates a sample from the ContinuousUniform distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a uniformly distributed sample. + + + + Generates a sequence of samples from the ContinuousUniform distribution. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of uniformly distributed samples. + + + + Gets or sets the lower bound of the distribution. + + + + + Gets or sets the upper bound of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + + Gets the median of the distribution. + + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + This class implements functionality for the Erlang distribution. This distribution is + is a continuous probability distribution with wide applicability primarily due to its + relation to the exponential and Gamma distributions. + Wikipedia - Erlang distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Erlang shape parameter. + + + + + Erlang inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape of the Erlang distribution. + + + The inverse scale of the Erlang distribution. + + + + + Constructs a Erlang distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The scale of the Erlang distribution. + a normal distribution. + + + + Constructs a Erlang distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + a normal distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Erlang distribution. + The inverse scale of the Erlang distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the Erlang distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the density. + the density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Erlang Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Erlang distributed random variable. + + + + Generates a sample from the Erlang distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Erlang distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Erlang distribution. + + + + + Gets or sets the scale of the Erlang distribution. + + + + + Gets or sets the inverse scale of the Erlang distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum value. + + + + + Gets the Maximum value. + + + + + The exponential distribution is a distribution over the real numbers parameterized by one non-negative parameter. + Wikipedia - exponential distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The lambda parameter of the Exponential distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter of the Exponential distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + Lambda parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + Lambda parameter. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + a sequence of samples from the distribution. + + + + Draws a random sample from the distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + A random number from this distribution. + + + + Generates a sequence of samples from the Exponential distribution. + + The random number generator to use. + The lambda parameter of the Exponential distribution. + a sequence of samples from the distribution. + + + + Gets or sets the lambda parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the FisherSnedecor distribution. For details about this distribution, see + Wikipedia - FisherSnedecor distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The first parameter - degree of freedom. + + + + + The second parameter - degree of freedom. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The first parameter - degree of freedom. + + + The second parameter - degree of freedom. + + + + + Sets the parameters of the distribution after checking their validity. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + + + + Checks whether the parameters of the distribution are valid. + + The first parameter - degree of freedom. + The second parameter - degree of freedom. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates one sample from the FisherSnedecor distribution without parameter checking. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a FisherSnedecor distributed random number. + + + + Generates a sample from the FisherSnedecor distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the FisherSnedecor distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The first parameter - degree of freedom. + The second parameter - degree of freedom. + a sequence of samples from the distribution. + + + + Gets or sets the first parameter - degree of freedom. + + + + + Gets or sets the second parameter - degree of freedom. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Gamma distribution. For details about this distribution, see + Wikipedia - Gamma distribution. + + + The Gamma distribution is parametrized by a shape and inverse scale parameter. When we want + to specify a Gamma distribution which is a point distribution we set the shape parameter to be the + location of the point distribution and the inverse scale as positive infinity. The distribution + with shape and inverse scale both zero is undefined. + Random number generation for the Gamma distribution is based on the algorithm in: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Gamma shape parameter. + + + + + Gamma inverse scale parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Gamma class. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + + + + Constructs a Gamma distribution from a shape and scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The scale of the Gamma distribution. + a normal distribution. + + + + Constructs a Gamma distribution from a shape and inverse scale parameter. The distribution will + be initialized with the default random number generator. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + When the parameters don't pass the function. + + + + Computes the density of the Gamma distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Gamma distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Gamma distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Sampling implementation based on: + "A Simple Method for Generating Gamma Variables" - Marsaglia & Tsang + ACM Transactions on Mathematical Software, Vol. 26, No. 3, September 2000, Pages 363–372. + This method performs no parameter checks. + + The random number generator to use. + The shape of the Gamma distribution. + The inverse scale of the Gamma distribution. + A sample from a Gamma distributed random variable. + + + + Generates a sample from the Gamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Gamma distribution. + + The random number generator to use. + The shape of the Gamma distribution from which to generate samples. + The inverse scale of the Gamma distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Gamma distribution. + + + + + Gets or sets the scale of the Gamma distribution. + + + + + Gets or sets the inverse scale of the Gamma distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Gamma distribution. + + + + + Gets the variance of the Gamma distribution. + + + + + Gets the standard deviation of the Gamma distribution. + + + + + Gets the entropy of the Gamma distribution. + + + + + Gets the skewness of the Gamma distribution. + + + + + Gets the mode of the Gamma distribution. + + + + + Gets the median of the Gamma distribution. + + + + + Gets the minimum of the Gamma distribution. + + + + + Gets the maximum of the Gamma distribution. + + + + + The inverse Gamma distribution is a distribution over the positive real numbers parameterized by + two positive parameters. + Wikipedia - InverseGamma distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Inverse Gamma shape parameter. + + + + + Inverse Gamma scale parameter scale. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + + The shape (alpha) parameter of the inverse Gamma distribution. + + + The scale (beta) parameter of the inverse Gamma distribution. + + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Cauchy distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The shape (alpha) parameter of the inverse Gamma distribution. + The scale (beta) parameter of the inverse Gamma distribution. + a sequence of samples from the distribution. + + + + Gets or sets the shape (alpha) parameter. + + + + + Gets or sets The scale (beta) parameter. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Throws . + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Laplace distribution is a distribution over the real numbers parameterized by a mean and + scale parameter. The PDF is: + p(x) = \frac{1}{2 * scale} \exp{- |x - mean| / scale}. + Wikipedia - Laplace distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale of the Laplace distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class (location = 0, scale = 1). + + + + + Initializes a new instance of the class. + + + The location for the Laplace distribution. + + + The scale for the Laplace distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The location for the Laplace distribution. + The scale for the Laplace distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a random number from the distribution. + + + + Samples a Laplace distributed random variable. + + a sample from the distribution. + + + + Generates a sample from the Laplace distribution. + + a sample from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The location shape parameter. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Laplace distribution. + + + + + Gets or sets the scale of the Laplace distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Log-Normal distribution. For details about this distribution, see + Wikipedia - Log-Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mu of the logarithm of the log-log-normal distribution. + + + + + Keeps track of the standard deviation of the logarithm of the log-log-normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + The distribution will be initialized with the default + random number generator. + + + The mu of the logarithm of the distribution. + + + The standard deviation of the logarithm of the distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + When the parameters don't pass the function. + + + + Computes the density of the log-normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the log-normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the log-normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the log-normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mu of the logarithm of the distribution. + The standard deviation of the logarithm of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the mean of the logarithm of the log-normal. + + + + + Gets or sets the standard deviation of the logarithm of the log-normal. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mu of the log-normal distribution. + + + + + Gets the variance of the log-normal distribution. + + + + + Gets the standard deviation of the log-normal distribution. + + + + + Gets the entropy of the log-normal distribution. + + + + + Gets the skewness of the log-normal distribution. + + + + + Gets the mode of the log-normal distribution. + + + + + Gets the median of the log-normal distribution. + + + + + Gets the minimum of the log-normal distribution. + + + + + Gets the maximum of the log-normal distribution. + + + + + Implements the univariate Normal (or Gaussian) distribution. For details about this distribution, see + Wikipedia - Normal distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the mean of the normal distribution. + + + + + Keeps track of the standard deviation of the normal distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Normal class. This is a normal distribution with mean 0.0 + and standard deviation 1.0. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the Normal class with a particular mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + + + + Constructs a normal distribution from a mean and standard deviation. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and variance. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The variance of the normal distribution. + a normal distribution. + + + + Constructs a normal distribution from a mean and precision. The distribution will + be initialized with the default random number generator. + + The mean of the normal distribution. + The precision of the normal distribution. + a normal distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + When the parameters don't pass the function. + + + + Computes the density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the density. + the log density at . + + + + Computes the density of the normal distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the normal distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The mean of the normal distribution. + The standard deviation of the normal distribution. + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the cumulative distribution function of the normal distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the inverse cumulative distribution function of the normal distribution. + + The location at which to compute the inverse cumulative density. + the inverse cumulative density at . + + + + Samples a pair of standard normal distributed random variables using the Box-Muller algorithm. + + The random number generator to use. + a pair of random numbers from the standard normal distribution. + + + + Samples the distribution. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a random number from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + a sequence of samples from the distribution. + + + + Generates a sample from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the normal distribution using the Box-Muller algorithm. + + The random number generator to use. + The mean of the normal distribution from which to generate samples. + The standard deviation of the normal distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the precision of the normal distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets or sets the mean of the normal distribution. + + + + + Gets or sets the variance of the normal distribution. + + + + + Gets or sets the standard deviation of the normal distribution. + + + + + Gets the entropy of the normal distribution. + + + + + Gets the skewness of the normal distribution. + + + + + Gets the mode of the normal distribution. + + + + + Gets the median of the normal distribution. + + + + + Gets the minimum of the normal distribution. + + + + + Gets the maximum of the normal distribution. + + + + + The Pareto distribution is a power law probability distribution that coincides with social, + scientific, geophysical, actuarial, and many other types of observable phenomena. + For details about this distribution, see + Wikipedia - Pareto distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The shape parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + The shape parameter of the distribution. + + + If or are negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + The shape parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + The shape parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Pareto distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + The shape parameter. + a random number from the Pareto distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Pareto distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + The shape parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the shape parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The Rayleigh distribution (pronounced /ˈreɪli/) is a continuous probability distribution. As an + example of how it arises, the wind speed will have a Rayleigh distribution if the components of + the two-dimensional wind velocity vector are uncorrelated and normally distributed with equal variance. + For details about this distribution, see + Wikipedia - Rayleigh distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The scale parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The scale parameter of the distribution. + + + If is negative. + + + + + Sets the parameters of the distribution after checking their validity. + + The scale parameter of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The scale parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Generates a sample from the Rayleigh distribution without doing parameter checking. + + The random number generator to use. + The scale parameter. + a random number from the Rayleigh distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Rayleigh distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The scale parameter. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The scale parameter. + a sequence of samples from the distribution. + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + A random variable is said to be stable (or to have a stable distribution) if it has + the property that a linear combination of two independent copies of the variable has + the same distribution, up to location and scale parameters. + For details about this distribution, see + Wikipedia - Stable distribution. + + The distribution will use the by default.` + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The stability parameter of the distribution. + + + + + The skewness parameter of the distribution. + + + + + The scale parameter of the distribution. + + + + + The location parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The stability parameter of the distribution. + + + The skewness parameter of the distribution. + + + The scale parameter of the distribution. + + + The location parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + Throws a not supported exception if Alpha != 2, (Alpha != 1 and Beta !=0), or (Alpha != 0.5 and Beta != 1) + + + + Computes the cumulative distribution function of the Levy distribution. + + The scale parameter. + The location parameter. + The location at which to compute the cumulative density. + + the cumulative density at . + + + + + Computes the density of the distribution. + + The location at which to compute the density. + the density at . + + + + Computes the density of the Levy distribution. + + The scale parameter of the distribution. + The location parameter of the distribution. + The location at which to compute the density. + the density at . + + + + Computes the log density of the distribution. + + The location at which to compute the log density. + the log density at . + + + + Samples the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a random number from the distribution. + + + + Draws a random sample from the distribution. + + A random number from this distribution. + + + + Generates a sequence of samples from the Stable distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the distribution. + + The random number generator to use. + The stability parameter of the distribution. + The skewness parameter of the distribution. + The scale parameter of the distribution. + The location parameter of the distribution. + a sequence of samples from the distribution. + + + + Gets or sets the stability parameter of the distribution. + + + + + Gets or sets The skewness parameter of the distribution. + + + + + Gets or sets the scale parameter of the distribution. + + + + + Gets or sets the location parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets he entropy of the distribution. + + Always throws a not supported exception. + + + + Gets the skewness of the distribution. + + Throws a not supported exception of Alpha != 2. + + + + Gets the mode of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the median of the distribution. + + Throws a not supported exception if Beta != 0. + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + Implements the univariate Student t-distribution. For details about this + distribution, see + + Wikipedia - Student's t-distribution. + + We use a slightly generalized version (compared to + Wikipedia) of the Student t-distribution. Namely, one which also + parameterizes the location and scale. See the book "Bayesian Data + Analysis" by Gelman et al. for more details. + The density of the Student t-distribution p(x|mu,scale,dof) = + Gamma((dof+1)/2) (1 + (x - mu)^2 / (scale * scale * dof))^(-(dof+1)/2) / + (Gamma(dof/2)*Sqrt(dof*pi*scale)). + The distribution will use the by + default. Users can get/set the random number generator by using the + property. + The statistics classes will check all the incoming parameters + whether they are in the allowed range. This might involve heavy + computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Keeps track of the location of the Student t-distribution. + + + + + Keeps track of the degrees of freedom for the Student t-distribution. + + + + + Keeps track of the scale for the Student t-distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the StudentT class. This is a Student t-distribution with location 0.0 + scale 1.0 and degrees of freedom 1. The distribution will + be initialized with the default random number generator. + + + + + Initializes a new instance of the StudentT class with a particular location, scale and degrees of + freedom. The distribution will + be initialized with the default random number generator. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + When the parameters don't pass the function. + + + + Computes the density of the Student t-distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Student t-distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Student t-distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Samples student-t distributed random variables. + + The algorithm is method 2 in section 5, chapter 9 + in L. Devroye's "Non-Uniform Random Variate Generation" + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the standard student-t distribution. + a random number from the standard student-t distribution. + + + + Generates a sample from the Student t-distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Student t-distribution. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sample from the distribution. + + + + Generates a sequence of samples from the Student t-distribution using the Box-Muller algorithm. + + The random number generator to use. + The location of the Student t-distribution. + The scale of the Student t-distribution. + The degrees of freedom for the Student t-distribution. + a sequence of samples from the distribution. + + + + Gets or sets the location of the Student t-distribution. + + + + + Gets or sets the scale of the Student t-distribution. + + + + + Gets or sets the degrees of freedom of the Student t-distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Student t-distribution. + + + + + Gets the variance of the Student t-distribution. + + + + + Gets the standard deviation of the Student t-distribution. + + + + + Gets the entropy of the Student t-distribution. + + + + + Gets the skewness of the Student t-distribution. + + + + + Gets the mode of the Student t-distribution. + + + + + Gets the median of the Student t-distribution. + + + + + Gets the minimum of the Student t-distribution. + + + + + Gets the maximum of the Student t-distribution. + + + + + Implements the Weibull distribution. For details about this distribution, see + Wikipedia - Weibull distribution. + + + The Weibull distribution is parametrized by a shape and scale parameter. + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Weibull shape parameter. + + + + + Weibull inverse scale parameter. + + + + + Reusable intermediate result 1 / ( ^ ) + + + By caching this parameter we can get slightly better numerics precision + in certain constellations without any additional computations. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Weibull class. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The shape of the Weibull distribution. + The scale of the Weibull distribution. + true when the parameters positive valid floating point numbers, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The shape of the Weibull distribution. + The inverse scale of the Weibull distribution. + When the parameters don't pass the function. + + + + Computes the density of the Weibull distribution. + + The location at which to compute the density. + the density at . + + + + Computes the log density of the Weibull distribution. + + The location at which to compute the log density. + the log density at . + + + + Computes the cumulative distribution function of the Weibull distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Generates one sample from the Weibull distribution. This method doesn't perform + any parameter checks. + + The random number generator to use. + The shape of the Weibull distribution. + The scale of the Weibull distribution. + A sample from a Weibull distributed random variable. + + + + Generates a sample from the Weibull distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + a sequence of samples from the distribution. + + + + Generates a sample from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sample from the distribution. + + + + Generates a sequence of samples from the Weibull distribution. + + The random number generator to use. + The shape of the Weibull distribution from which to generate samples. + The scale of the Weibull distribution from which to generate samples. + a sequence of samples from the distribution. + + + + Gets or sets the shape of the Weibull distribution. + + + + + Gets or sets the scale of the Weibull distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the Weibull distribution. + + + + + Gets the variance of the Weibull distribution. + + + + + Gets the standard deviation of the Weibull distribution. + + + + + Gets the entropy of the Weibull distribution. + + + + + Gets the skewness of the Weibull distribution. + + + + + Gets the mode of the Weibull distribution. + + + + + Gets the median of the Weibull distribution. + + + + + Gets the minimum of the Weibull distribution. + + + + + Gets the maximum of the Weibull distribution. + + + + + The Bernoulli distribution is a distribution over bits. The parameter + p specifies the probability that a 1 is generated. + Wikipedia - Bernoulli distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The interface for discrete univariate distributions. + + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Draws a sequence of random samples from the distribution. + + a sequence of samples from the distribution. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + The probability of generating a one. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Bernoulli class. + + The probability of generating one. + If the Bernoulli parameter is not in the range [0,1]. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Bernoulli distribution. + + The random source to use. + The probability of generating a one. + A random sample from the Bernoulli distribution. + + + + Samples a Bernoulli distributed random variable. + + A sample from the Bernoulli distribution. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a Bernoulli distributed random variable. + + The random number generator to use. + The probability of generating a 1. + A sample from the Bernoulli distribution. + + + + Samples a sequence of Bernoulli distributed random variables. + + The random number generator to use. + The probability of generating a 1. + a sequence of samples from the distribution. + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the binomial distribution. For details about this distribution, see + Wikipedia - Binomial distribution. + + The distribution is parameterized by a probability (between 0.0 and 1.0). + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized binomial probability. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Binomial class. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The success probability of a trial. + The number of trials. + false is not in the interval [0.0,1.0] or is negative, true otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The success probability of a trial. + The number of trials. + If is not in the interval [0.0,1.0]. + If is negative. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates a sample from the Binomial distribution without doing parameter checking. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successful trials. + + + + Samples a Binomially distributed random variable. + + The number of successes in N trials. + + + + Samples an array of Binomially distributed random variables. + + a sequence of successes in N trials. + + + + Samples a binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + The number of successes in trials. + + + + Samples a sequence of binomially distributed random variable. + + The random number generator to use. + The success probability of a trial; must be in the interval [0.0, 1.0]. + The number of trials; must be positive. + a sequence of successes in trials. + + + + Gets or sets the success probability. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Implements the categorical distribution. For details about this distribution, see + Wikipedia - Categorical distribution. This + distribution is sometimes called the Discrete distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the unnormalized categorical probabilities. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Categorical class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative or do not sum to one. + + + + Initializes a new instance of the Categorical class from a . The distribution + will not be automatically updated when the histogram changes. The categorical distribution will have + one value for each bucket and a probability for that value proportional to the bucket count. + + The histogram from which to create the categorical variable. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + If any of the probabilities are negative returns false, or if the sum of parameters is 0.0; otherwise true + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Binomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Computes the unnormalized cumulative distribution function. This method performs no + parameter checking. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + An array representing the unnormalized cumulative distribution function. + + + + Returns one trials from the categorical distribution. + + The random number generator to use. + The cumulative distribution of the probability distribution. + One sample from the categorical distribution implied by . + + + + Samples a Binomially distributed random variable. + + The number of successful trials. + + + + Samples an array of Bernoulli distributed random variables. + + a sequence of successful trial counts. + + + + Samples one categorical distributed random variable; also known as the Discrete distribution. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + One random integer between 0 and the size of the categorical (exclusive). + + + + Samples a categorically distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + random integers between 0 and the size of the categorical (exclusive). + + + + Gets or sets the normalized probability vector of the multinomial. + + Sometimes the normalized probability vector cannot be represented + exactly in a floating point representation. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a . + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets he mode of the distribution. + + Throws a . + + + + Gets the median of the distribution. + + + + + The Conway-Maxwell-Poisson distribution is a generalization of the Poisson, Geometric and Bernoulli + distributions. It is parameterized by two real numbers "lambda" and "nu". For + + nu = 0 the distribution reverts to a Geometric distribution + nu = 1 the distribution reverts to the Poisson distribution + nu -> infinity the distribution converges to a Bernoulli distribution + + This implementation will cache the value of the normalization constant. + Wikipedia - ConwayMaxwellPoisson distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Since many properties of the distribution can only be computed approximately, the tolerance + level specifies how much error we accept. + + + + + The mean of the distribution. + + + + + The variance of the distribution. + + + + + Caches the value of the normalization constant. + + + + + The lambda parameter. + + + + + The nu parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The lambda parameter. + + + The nu parameter. + + + + + Sets the parameters of the distribution after checking their validity. + + The lambda parameter. + The nu parameter. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The lambda parameter. + The nu parameter. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the ConwayMaxwellPoisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the log probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Computes an approximate normalization constant for the CMP distribution. + + The lambda parameter for the CMP distribution. + The nu parameter for the CMP distribution. + + an approximate normalization constant for the CMP distribution. + + + + + Returns one trials from the distribution. + + The random number generator to use. + The lambda parameter + The nu parameter. + The z parameter. + + One sample from the distribution implied by , , and . + + + + + Samples a Conway-Maxwell-Poisson distributed random variable. + + a sample from the distribution. + + + + Samples a sequence of a Conway-Maxwell-Poisson distributed random variables. + + + a sequence of samples from a Conway-Maxwell-Poisson distribution. + + + + + Samples a random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The lambda parameter + The nu parameter. + + + + Gets or sets the lambda parameter. + + The value of the lambda parameter. + + + + Gets or sets the Nu parameter. + + The value of the Nu parameter. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the normalization constant of the Conway-Maxwell-Poisson distribution. + + + + + The discrete uniform distribution is a distribution over integers. The distribution + is parameterized by a lower and upper bound (both inclusive). + Wikipedia - Discrete uniform distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The distribution's lower bound. + + + + + The distribution's upper bound. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the DiscreteUniform class. + + Lower bound. + Upper bound; must be at least as large as . + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Checks whether the parameters of the distribution are valid. + + Lower bound. + Upper bound; must be at least as large as . + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + Lower bound. + Upper bound; must be at least as large as . + When the parameters don't pass the function. + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes the probability of a specific value. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates one sample from the discrete uniform distribution. This method does not do any parameter checking. + + The random source to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A random sample from the discrete uniform distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of uniformly distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a uniformly distributed random variable. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + A sample from the discrete uniform distribution. + + + + Samples a sequence of uniformly distributed random variables. + + The random number generator to use. + The lower bound of the uniform random variable. + The upper bound of the uniform random variable. + a sequence of samples from the discrete uniform distribution. + + + + Gets or sets the lower bound of the probability distribution. + + + + + Gets or sets the upper bound of the probability distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution; since every element in the domain has the same probability this method returns the middle one. + + + + + Gets the median of the distribution. + + + + + The Geometric distribution is a distribution over positive integers parameterized by one positive real number. + This implementation of the Geometric distribution will never generate 0's. + Wikipedia - geometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The geometric distribution parameter. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Geometric class. + + The probability of generating one. + If the Geometric parameter is not in the range [0,1]. + + + + Sets the parameters of the distribution after checking their validity. + + The probability of generating a one. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The probability of generating a one. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Bernoulli distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Returns one sample from the distribution. + + The random number generator to use. + The p parameter + + One sample from the distribution implied by . + + + + + Samples a Geometric distributed random variable. + + A sample from the Geometric distribution. + + + + Samples an array of Geometric distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The p parameter + + + + Samples a sequence of this random variable. + + The random number generator to use. + The p parameter + + + + Gets or sets the probability of generating a one. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + Throws a not supported exception. + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + This class implements functionality for the Hypergeometric distribution. This distribution is + a discrete probability distribution that describes the number of successes in a sequence + of n draws from a finite population without replacement, just as the binomial distribution + describes the number of successes for draws with replacement + Wikipedia - Hypergeometric distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The size of the population. + + + + + The m parameter of the distribution. + + + + + The n parameter (number to draw) of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Hypergeometric class. + + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Hypergeometric distribution without doing parameter checking. + + The random number generator to use. + The Total parameter of the distribution. + The m parameter of the distribution. + The n parameter of the distribution. + a random number from the Hypergeometric distribution. + + + + Samples a Hypergeometric distributed random variable. + + The number of successes in n trials. + + + + Samples an array of Hypergeometric distributed random variables. + + a sequence of successes in n trials. + + + + Samples a random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The population size. + The m parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the population size. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the m parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the minimum of the distribution. + + + + + Gets the maximum of the distribution. + + + + + The negative binomial is a distribution over the natural numbers with two parameters r,p. For the special + case that r is an integer one can interpret the distribution as the number of tails before the r'th head + when the probability of head is p. + Wikipedia - NegativeBinomial distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The r parameter of the distribution. + + + + + The p parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The number of trials. + The probability of a trial resulting in success. + + + + Sets the parameters of the distribution after checking their validity. + + The number of trials. + The probability of a trial resulting in success. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The number of trials. + The probability of a trial resulting in success. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the NegativeBinomial distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Samples a negative binomial distributed random variable. + + The random number generator to use. + The r parameter. + The p parameter. + a sample from the distribution. + + + + Samples a NegativeBinomial distributed random variable. + + a sample from the distribution. + + + + Samples an array of NegativeBinomial distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The r parameter. + The p parameter. + + + + Gets or sets the number of trials. + + + + + Gets or sets the probability of success. + + + + + Gets or sets the distribution's random number generator. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Pseudo-random generation of poisson distributed deviates. + + + Distribution is described at Wikipedia - Poisson distribution. + Knuth's method is used to generate Poisson distributed random variables. + f(x) = exp(-λ)*λ^x/x!; + + + + + The Poisson distribution parameter λ. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + The Poisson distribution parameter λ. + If is equal or less then 0.0. + + + + Sets the parameters of the distribution after checking their validity. + + The mean (λ) of the distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean (λ) of the distribution. + true when the parameters are valid, false otherwise. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the cumulative distribution function of the Poisson distribution. + + The location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + the probability mass at location . + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + the log probability mass at location . + + + + Generates one sample from the Poisson distribution. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by Knuth's method. + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + + + + Generates one sample from the Poisson distribution by "Rejection method PA". + + The random source to use. + The Poisson distribution parameter λ. + A random sample from the Poisson distribution. + "Rejection method PA" from "The Computer Generation of Poisson Random Variables" by A. C. Atkinson, + Journal of the Royal Statistical Society Series C (Applied Statistics) Vol. 28, No. 1. (1979) + The article is on pages 29-35. The algorithm given here is on page 32. + + + + Samples a Poisson distributed random variable. + + A sample from the Poisson distribution. + + + + Samples an array of Poisson distributed random variables. + + a sequence of successes in N trials. + + + + Samples a Poisson distributed random variable. + + The random number generator to use. + The Poisson distribution parameter λ. + A sample from the Poisson distribution. + + + + Samples a sequence of Poisson distributed random variables. + + The random number generator to use. + The Poisson distribution parameter λ. + a sequence of samples from the distribution. + + + + Gets or sets the Poisson distribution parameter λ. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Gets the skewness of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + Approximation, see Wikipedia Poisson distribution + + + + Zipf's law, an empirical law formulated using mathematical statistics, refers to the fact + that many types of data studied in the physical and social sciences can be approximated with + a Zipfian distribution, one of a family of related discrete power law probability distributions. + For details about this distribution, see + Wikipedia - Zipf distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The s parameter of the distribution. + + + + + The n parameter of the distribution. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The s parameter of the distribution. + + + The n parameter of the distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The s parameter of the distribution. + The n parameter of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + The s parameter of the distribution. + The n parameter of the distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Computes the cumulative distribution function of the distribution. + + The integer location at which to compute the cumulative density. + the cumulative density at . + + + + Computes values of the probability mass function. + + The location in the domain where we want to evaluate the probability mass function. + + the probability mass at location . + + + + + Computes values of the log probability mass function. + + The location in the domain where we want to evaluate the log probability mass function. + + the log probability mass at location . + + + + + Generates a sample from the Zipf distribution without doing parameter checking. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + a random number from the Zipf distribution. + + + + Draws a random sample from the distribution. + + a sample from the distribution. + + + + Samples an array of zipf distributed random variables. + + a sequence of samples from the distribution. + + + + Samples a random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Samples a sequence of this random variable. + + The random number generator to use. + The s parameter of the distribution. + The n parameter of the distribution. + + + + Gets or sets the s parameter of the distribution. + + + + + Gets or sets the n parameter of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the standard deviation of the distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets the skewness of the distribution. + + + + + Gets the mode of the distribution. + + + + + Gets the median of the distribution. + + + + + Gets the smallest element in the domain of the distributions which can be represented by an integer. + + + + + Gets the largest element in the domain of the distributions which can be represented by an integer. + + + + + Implements the multivariate Dirichlet distribution. For details about this distribution, see + Wikipedia - Dirichlet distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The Dirichlet distribution parameters. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Dirichlet class. The distribution will + be initialized with the default random number generator. + + An array with the Dirichlet parameters. + + + + Initializes a new instance of the class. + + random number generator. + + + The value of each parameter of the Dirichlet distribution. + + + The dimension of the Dirichlet distribution. + + + + + Checks whether the parameters of the distribution are valid: no + parameter can be less than zero and at least one parameter should be + larger than zero. + + The parameters of the Dirichlet distribution. + + true when the parameters are valid, false + otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The parameters of the Dirichlet distribution. + When the parameters don't pass the function. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Computes the density of the distribution. + + The locations at which to compute the density. + the density at . + The Dirichlet distribution requires that the sum of the components of x equals 1. + You can also leave out the last component, and it will be computed from the others. + + + + Computes the log density of the distribution. + + The locations at which to compute the density. + the density at . + + + + Samples a Dirichlet distributed random vector. + + A sample from this distribution. + + + + Samples a Dirichlet distributed random vector. + + The random number generator to use. + The Dirichlet distribution parameter. + a sample from the distribution. + + + + Gets the dimension of the Dirichlet distribution. + + + + + Gets or sets the parameters of the Dirichlet distribution. + + + + + Gets the sum of the Dirichlet parameters. + + + + + Gets the mean of the Dirichlet distribution. + + + + + Gets the variance of the Dirichlet distribution. + + + + + Gets the entropy of the distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + This class implements functionality for the inverse Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The inverse Wishart distribution + is the conjugate prior for the covariance matrix of a multivariate normal distribution. + Wikipedia - Inverse-Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the inverse Wishart distribution. + + + + + The scale matrix for the inverse Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the inverse Wishart distribution. + + + The scale matrix for the inverse Wishart distribution. + + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the inverse Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + a sample from the distribution. + + + + Samples an inverse Wishart distributed random variable by sampling + a Wishart random variable and inverting the matrix. + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sample from the distribution. + + + + Gets or sets the degrees of freedom for the inverse Wishart distribution. + + + + + Gets or sets the scale matrix for the inverse Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + A. O'Hagan, and J. J. Forster (2004). Kendall's Advanced Theory of Statistics: Bayesian Inference. 2B (2 ed.). Arnold. ISBN 0-340-80752-0. + + + + Gets the variance of the distribution. + + The variance of the distribution. + Kanti V. Mardia, J. T. Kent and J. M. Bibby (1979). Multivariate Analysis. + + + + This class implements functionality for matrix valued normal distributions. The distribution + is parameterized by a mean matrix (M), a covariance matrix for the rows (V) and a covariance matrix + for the columns (K). If the dimension of M is d-by-m then V is d-by-d and K is m-by-m. + Wikipedia - MatrixNormal distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The mean of the matrix normal distribution. + + + + + The covariance matrix for the rows. + + + + + The covariance matrix for the columns. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The mean of the matrix normal. + + + The covariance matrix for the rows. + + + The covariance matrix for the columns. + + + If the dimensions of the mean and two covariance matrices don't match. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Sets the parameters of the distribution after checking their validity. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + true when the parameters are valid, false otherwise. + + + + Evaluates the probability density function for the matrix normal distribution. + + The matrix at which to evaluate the density at. + the density at + If the argument does not have the correct dimensions. + + + + Samples a matrix normal distributed random variable. + + A random number from this distribution. + + + + Samples a matrix normal distributed random variable. + + The random number generator to use. + The mean of the matrix normal. + The covariance matrix for the rows. + The covariance matrix for the columns. + If the dimensions of the mean and two covariance matrices don't match. + a sequence of samples from the distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The covariance matrix of the vector normal distribution. + a sequence of samples from defined distribution. + + + + Samples a vector normal distributed random variable. + + The random number generator to use. + The mean of the vector normal distribution. + The Cholesky factorization of the covariance matrix. + a sequence of samples from defined distribution. + + + + Gets or sets the mean. (M) + + The mean of the distribution. + + + + Gets or sets the row covariance. (V) + + The row covariance. + + + + Gets or sets the column covariance. (K) + + The column covariance. + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Implements the multinomial distribution. For details about this distribution, see + Wikipedia - Multinomial distribution. + + The distribution is parameterized by a vector of ratios: in other words, the parameter + does not have to be normalized and sum to 1. The reason is that some vectors can't be exactly normalized + to sum to 1 in floating point representation. + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + Stores the normalized multinomial probabilities. + + + + + The number of trials. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the Multinomial class. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + Initializes a new instance of the Multinomial class from histogram . The distribution will + not be automatically updated when the histogram changes. + + Histogram instance + The number of trials. + If any of the probabilities are negative or do not sum to one. + If is negative. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Checks whether the parameters of the distribution are valid. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + If any of the probabilities are negative returns false, + if the sum of parameters is 0.0, or if the number of trials is negative; otherwise true. + + + + Sets the parameters of the distribution after checking their validity. + + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + When the parameters don't pass the function. + + + + Computes values of the probability mass function. + + Non-negative integers x1, ..., xk + The probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Computes values of the log probability mass function. + + Non-negative integers x1, ..., xk + The log probability mass at location . + When is null. + When length of is not equal to event probabilities count. + + + + Samples one multinomial distributed random variable. + + the counts for each of the different possible values. + + + + Samples a sequence multinomially distributed random variables. + + a sequence of counts for each of the different possible values. + + + + Samples one multinomial distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of trials. + the counts for each of the different possible values. + + + + Samples a multinomially distributed random variable. + + The random number generator to use. + An array of nonnegative ratios: this array does not need to be normalized + as this is often impossible using floating point arithmetic. + The number of variables needed. + a sequence of counts for each of the different possible values. + + + + Gets or sets the proportion of ratios. + + + + + Gets or sets the number of trials. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + + + + Gets the variance of the distribution. + + + + + Gets the skewness of the distribution. + + + + + This structure represents the type over which the distribution + is defined. + + + + + The mean value. + + + + + The precision value. + + + + + Initializes a new instance of the struct. + + + The mean of the pair. + + + The precision of the pair. + + + + + Gets or sets the mean of the pair. + + + + + Gets or sets the precision of the pair. + + + + + The distribution is the conjugate prior distribution for the + distribution. It specifies a prior over the mean and precision of the distribution. + It is parameterized by four numbers: the mean location, the mean scale, the precision shape and the + precision inverse scale. + The distribution NG(mu, tau | mloc,mscale,psscale,pinvscale) = Normal(mu | mloc, 1/(mscale*tau)) * Gamma(tau | psscale,pinvscale). + The following degenerate cases are special: when the precision is known, + the precision shape will encode the value of the precision while the precision inverse scale is positive + infinity. When the mean is known, the mean location will encode the value of the mean while the scale + will be positive infinity. A completely degenerate NormalGamma distribution with known mean and precision is possible as well. + Wikipedia - Normal-Gamma distribution. + + The distribution will use the by default. + Users can get/set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The location of the mean. + + + + + The scale of the mean. + + + + + The shape of the precision. + + + + + The inverse scale of the precision. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The location of the mean. + + + The scale of the mean. + + + The shape of the precision. + + + The inverse scale of the precision. + + + + + Checks whether the parameters of the distribution are valid. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + true when the parameters are valid, false otherwise. + + + + Sets the parameters of the distribution after checking their validity. + + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + When the parameters don't pass the function. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Returns the marginal distribution for the mean of the NormalGamma distribution. + + the marginal distribution for the mean of the NormalGamma distribution. + + + + Returns the marginal distribution for the precision of the distribution. + + The marginal distribution for the precision of the distribution/ + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + Density value + + + + Evaluates the probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + Density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean/precision pair of the distribution + The log of the density value + + + + Evaluates the log probability density function for a NormalGamma distribution. + + The mean of the distribution + The precision of the distribution + The log of the density value + + + + Generates a sample from the NormalGamma distribution. + + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + a sequence of samples from the distribution. + + + + Generates a sample from the NormalGamma distribution. + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sample from the distribution. + + + + Generates a sequence of samples from the NormalGamma distribution + + The random number generator to use. + The location of the mean. + The scale of the mean. + The shape of the precision. + The inverse scale of the precision. + a sequence of samples from the distribution. + + + + Gets or sets the location of the mean. + + + + + Gets or sets the scale of the mean. + + + + + Gets or sets the shape of the precision. + + + + + Gets or sets the inverse scale of the precision. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the variance of the distribution. + + The mean of the distribution. + + + + This class implements functionality for the Wishart distribution. This distribution is + parameterized by the degrees of freedom nu and the scale matrix S. The Wishart distribution + is the conjugate prior for the precision (inverse covariance) matrix of the multivariate + normal distribution. + Wikipedia - Wishart distribution. + + The distribution will use the by default. + Users can set the random number generator by using the property. + The statistics classes will check all the incoming parameters whether they are in the allowed + range. This might involve heavy computation. Optionally, by setting Control.CheckDistributionParameters + to false, all parameter checks can be turned off. + + + + The degrees of freedom for the Wishart distribution. + + + + + The scale matrix for the Wishart distribution. + + + + + Caches the Cholesky factorization of the scale matrix. + + + + + The distribution's random number generator. + + + + + Initializes a new instance of the class. + + + The degrees of freedom for the Wishart distribution. + + + The scale matrix for the Wishart distribution. + + + + + Sets the parameters of the distribution after checking their validity. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + When the parameters don't pass the function. + + + + Checks whether the parameters of the distribution are valid. + + The degrees of freedom for the Wishart distribution. + The scale matrix for the Wishart distribution. + true when the parameters are valid, false otherwise. + + + + A string representation of the distribution. + + a string representation of the distribution. + + + + Evaluates the probability density function for the Wishart distribution. + + The matrix at which to evaluate the density at. + If the argument does not have the same dimensions as the scale matrix. + the density at . + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + A random number from this distribution. + + + + Samples a Wishart distributed random variable using the method + Algorithm AS 53: Wishart Variate Generator + W. B. Smith and R. R. Hocking + Applied Statistics, Vol. 21, No. 3 (1972), pp. 341-345 + + The random number generator to use. + The degrees of freedom. + The scale matrix. + a sequence of samples from the distribution. + + + + Samples the distribution. + + The random number generator to use. + The nu parameter to use. + The S parameter to use. + The cholesky decomposition to use. + a random number from the distribution. + + + + Gets or sets the degrees of freedom for the Wishart distribution. + + + + + Gets or sets the scale matrix for the Wishart distribution. + + + + + Gets or sets the random number generator which is used to draw random samples. + + + + + Gets the mean of the distribution. + + The mean of the distribution. + + + + Gets the mode of the distribution. + + The mode of the distribution. + + + + Gets the variance of the distribution. + + The variance of the distribution. + + + + Compound Monthly Return or Geometric Return or Annualized Return + + + + + + + Average Gain or Gain Mean + This is a simple average (arithmetic mean) of the periods with a gain. It is calculated by summing the returns for gain periods (return 0) + and then dividing the total by the number of gain periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Average Loss or LossMean + This is a simple average (arithmetic mean) of the periods with a loss. It is calculated by summing the returns for loss periods (return < 0) + and then dividing the total by the number of loss periods. + + + + http://www.offshore-library.com/kb/statistics.php + + + + Calculation is similar to Standard Deviation , except it calculates an average (mean) return only for periods with a gain + and measures the variation of only the gain periods around the gain mean. Measures the volatility of upside performance. + © Copyright 1996, 1999 Gary L.Gastineau. First Edition. © 1992 Swiss Bank Corporation. + + + + + + + Similar to standard deviation, except this statistic calculates an average (mean) return for only the periods with a loss and then + measures the variation of only the losing periods around this loss mean. This statistic measures the volatility of downside performance. + + + + http://www.offshore-library.com/kb/statistics.php + + + + This measure is similar to the loss standard deviation except the downside deviation + considers only returns that fall below a defined minimum acceptable return (MAR) rather than the arithmetic mean. + For example, if the MAR is 7%, the downside deviation would measure the variation of each period that falls below + 7%. (The loss standard deviation, on the other hand, would take only losing periods, calculate an average return for + the losing periods, and then measure the variation between each losing return and the losing return average). + + + + + + + + A measure of volatility in returns below the mean. It's similar to standard deviation, but it only + looks at periods where the investment return was less than average return. + + + + + + + Measures a fund’s average gain in a gain period divided by the fund’s average loss in a losing + period. Periods can be monthly or quarterly depending on the data frequency. + + + + + + + Globalized String Handling Helpers + + + + + Tries to get a from the format provider, + returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format + provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Tries to get a from the format provider, returning the current culture if it fails. + + + An that supplies culture-specific + formatting information. + + A instance. + + + + Globalized Parsing: Tokenize a node by splitting it into several nodes. + + Node that contains the trimmed string to be tokenized. + List of keywords to tokenize by. + keywords to skip looking for (because they've already been handled). + + + + Globalized Parsing: Parse a double number + + First token of the number. + The parsed double number using the current culture information. + + + + + Globalized Parsing: Parse a float number + + First token of the number. + The parsed float number using the current culture information. + + + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT). + + + + + Generate the bluestein sequence for the provided problem size. + + Number of samples. + Bluestein sequence exp(I*Pi*k^2/N) + + + + Convolution with the bluestein sequence (Parallel Version). + + Sample Vector. + + + + Swap the real and imaginary parts of each sample. + + Sample Vector. + + + + Bluestein generic FFT for arbitrary sized sample vectors. + + Time-space sample vector. + Fourier series exponent sign. + + + + Bluestein forward FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Bluestein inverse FFT for arbitrary sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Naive generic DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier series exponent sign. + Corresponding frequency-space vector. + + + + Naive forward DFT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Fourier Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DFT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Fourier Transform Convention Options. + Corresponding time-space vector. + + + + Extract the exponent sign to be used in forward transforms according to the + provided convention options. + + Fourier Transform Convention Options. + Fourier series exponent sign. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Radix-2 Reorder Helper Method + + Sample type + Sample vector + + + + Radix-2 Step Helper Method + + Sample vector. + Fourier series exponent sign. + Level Group Size. + Index inside of the level. + + + + Radix-2 generic FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 generic FFT for power-of-two sample vectors (Parallel Version). + + Sample vector, where the FFT is evaluated in place. + Fourier series exponent sign. + + + + + Radix-2 forward FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Radix-2 inverse FFT for power-of-two sized sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + Fast (FHT) Implementation of the Discrete Hartley Transform (DHT). + + + + + Naive generic DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Corresponding frequency-space vector. + + + + Naive forward DHT, useful e.g. to verify faster algorithms. + + Time-space sample vector. + Hartley Transform Convention Options. + Corresponding frequency-space vector. + + + + Naive inverse DHT, useful e.g. to verify faster algorithms. + + Frequency-space sample vector. + Hartley Transform Convention Options. + Corresponding time-space vector. + + + + Rescale FFT-the resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Rescale the iFFT-resulting vector according to the provided convention options. + + Fourier Transform Convention Options. + Sample Vector. + + + + Fourier Transform Convention + + + + + Inverse integrand exponent (forward: positive sign; inverse: negative sign). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling and common exponent (used in Maple). + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction (used in Matlab). [= AsymmetricScaling] + + + + + Inverse integrand exponent; No scaling at all (used in all Numerical Recipes based implementations). [= InverseExponent | NoScaling] + + + + + Hartley Transform Convention + + + + + Only scale by 1/N in the inverse direction; No scaling in forward direction. + + + + + Don't scale at all (neither on forward nor on inverse transformation). + + + + + Universal; Symmetric scaling. + + + + + Integral Transforms (including FFT). + + + + + Shared internal DET algorithm. + + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the forward Fast Fourier Transform (FFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + + + + Applies the inverse Fast Fourier Transform (iFFT) to arbitrary-length sample vectors. + + Sample vector, where the FFT is evaluated in place. + Fourier Transform Convention Options. + + + + Analytic integration algorithm for smooth functions with no discontinuities + or derivative discontinuities and no poles inside the interval. + + + + + Maximum number of iterations, until the asked + maximum error is (likely to be) satisfied. + + + + + Precomputed abscissa vector per level. + + + + + Precomputed weight vector per level. + + + + + Abscissa vector per level provider. + + + + + Weight vector per level provider. + + + + + Approximate the integral by the double exponential transformation + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Abscissa vector per level provider. + + Level Enumerator. + + + + Weight vector per level provider. + + Level Enumerator. + + + + Compute the abscissa vector for a single level. + + The level to evaluate the abscissa vector for. + Abscissa Vector. + + + + Compute the weight vector for a single level. + + The level to evaluate the weight vector for. + Weight Vector. + + + + Approximation algorithm for definite integrals by the Trapezium rule of the Newton-Cotes family. + + + Wikipedia - Trapezium Rule + + + + + Direct 2-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral in the provided interval by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Adaptive approximation of the definite integral by the trapezium rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Abscissa vector per level provider. + Weight vector per level provider. + First Level Step + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Approximation algorithm for definite integrals by Simpson's rule. + + + + + Direct 3-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Composite N-point approximation of the definite integral in the provided interval by Simpson's rule. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Even number of composite subdivision partitions. + Approximation of the finite integral in the given interval. + + + + Numeric Integration (Quadrature). + + + + + Shared internal DET algorithm. + + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + The expected relative accuracy of the approximation. + Approximation of the finite integral in the given interval. + + + + Approximation of the definite integral of an analytic smooth function on a closed interval. + + The analytic smooth function to integrate. + Where the interval starts, inclusive and finite. + Where the interval stops, inclusive and finite. + Approximation of the finite integral in the given interval. + + + + Akima Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Interpolation within the range of a discrete set of known data points. + + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + + + + Initializes a new instance of the AkimaSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Three-Point Differentiation Helper. + + Sample Points t. + Sample Values x(t). + Index of the point of the differentiation. + Index of the first sample. + Index of the second sample. + Index of the third sample. + The derivative approximation. + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Interpolation Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Sample Points t. + + + + + Sample Values x(t). + + + + + Barycentric Weights w(t). + + + + + Initializes a new instance of the BarycentricInterpolation class. + + + + + Initializes a new instance of the BarycentricInterpolation class. + + Sample Points t (no sorting assumed) + Sample Values x(t) + Barycentric weights w(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + Barycentric weights w(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Rational Interpolation (with poles) using Roland Bulirsch and Josef Stoer's Algorithm. + + + + This algorithm supports neither differentiation nor integration. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + + + + Initializes a new instance of the BulirschStoerRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Hermite Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + + + + Initializes a new instance of the CubicHermiteSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Sample Derivatives x'(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Cubic Spline Interpolation Algorithm with continuous first and second derivatives. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initializes a new instance of the CubicSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + + + + Evaluate the spline derivatives as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Derivative Vector + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Condition of the left boundary. + Left boundary value. Ignored in the parabolic case. + Condition of the right boundary. + Right boundary value. Ignored in the parabolic case. + Spline Coefficient Vector + + + + Tridiagonal Solve Helper. + + The a-vector[n]. + The b-vector[n], will be modified by this function. + The c-vector[n]. + The d-vector[n], will be modified by this function. + The x-vector[n] + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Polynomial Interpolation where the given sample points are equidistant. + + + This algorithm neither supports differentiation nor integration. + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t is equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initializes a new instance of the EquidistantPolynomialInterpolation class. + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sampls in the interval [leftBound,rightBound]. + + Left bound of the sample point interval. + Right bound of the sample point interval. + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Equidistant Sample Points t = a+(b-a)*i/(n-1) + Sample Values x(t) where t are equidistant over [a,b], i.e. x[i] = x(a+(b-a)*i/(n-1)) + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Count of Sample Values x(t). + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Barycentric Rational Interpolation without poles, using Mike Floater and Kai Hormann's Algorithm. + + + This algorithm neither supports differentiation nor integration. + + + + + Internal Barycentric Interpolation + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initializes a new instance of the FloaterHormannRationalInterpolation class. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Initialize the interpolation method with the given sample set. + + + The interpolation scheme order will be set to 3. + + Sample Points t (no sorting assumed) + Sample Values x(t) + + + + Initialize the interpolation method with the given sample set (no sorting assumed). + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + + + + Evaluate the barycentric weights as used + internally by this interpolation algorithm. + + Sample Points t + Sample Values x(t) + + Order of the interpolation scheme, 0 <= order <= N. + In most cases a value between 3 and 8 gives good results. + + Barycentric Weight Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Linear Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Internal Spline Interpolation + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + + + + Initializes a new instance of the LinearSplineInterpolation class. + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t, sorted ascending. + Sample Values x(t) + + + + Evaluate the spline coefficients as used + internally by this interpolation algorithm. + + Sample Points t, sorted ascending. + Sample Values x(t) + Spline Coefficient Vector + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Lagrange Polynomial Interpolation using Neville's Algorithm. + + + + This algorithm supports differentiation, but doesn't support integration. + + + When working with equidistant or Chebyshev sample points it is + recommended to use the barycentric algorithms specialized for + these cases instead of this arbitrary Neville algorithm. + + + + + + Sample Points t. + + + + + Spline Values x(t). + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + + + + Initializes a new instance of the NevillePolynomialInterpolation class. + + Sample Points t + Sample Values x(t) + + + + Initialize the interpolation method with the given sample pairs. + + Sample Points t + Sample Values x(t) + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Third-Degree Spline Interpolation Algorithm. + + + This algorithm supports both differentiation and integration. + + + + + Sample Points t. + + + + + Spline Coefficients c(t). + + + + + Number of samples. + + + + + Initializes a new instance of the SplineInterpolation class. + + + + + Initializes a new instance of the SplineInterpolation class. + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Initialize the interpolation method with the given spline coefficients (sorted by the sample points t). + + Sample Points t (length: N), sorted ascending. + Spline Coefficients (length: 4*(N-1)). + + + + Interpolate at point t. + + Point t to interpolate at. + Interpolated value x(t). + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated first derivative at point t. + + + + + + Differentiate at point t. + + Point t to interpolate at. + Interpolated value x(t) + Interpolated second derivative at point t. + Interpolated first derivative at point t. + + + + + + Integrate up to point t. + + Right bound of the integration interval [a,t]. + Interpolated definite integral over the interval [a,t]. + + + + + Find the index of the greatest sample point smaller than t. + + The value to look for. + The sample point index. + + + + Gets a value indicating whether the algorithm supports differentiation (interpolated derivative). + + + + + + + Gets a value indicating whether the algorithm supports integration (interpolated quadrature). + + + + + + Interpolation Factory. + + + + + Creates an interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a linear spline interpolation based on arbitrary points (sorted ascending). + + The sample points t, sorted ascending. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a floater hormann rational pole-free interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Create a burlish stoer rational interpolation based on arbitrary points. + + The sample points t. Supports both lists and arrays. + The sample point values x(t). Supports both lists and arrays. + + An interpolation scheme optimized for the given sample points and values, + which can then be used to compute interpolations and extrapolations + on arbitrary points. + + + + + Left and right boundary conditions. + + + + + Natural Boundary (Zero second derivative). + + + + + Parabolically Terminated boundary. + + + + + Fixed first derivative at the boundary. + + + + + Fixed second derivative at the boundary. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex32 version of the class. + + + + + Defines the base class for Matrix classes. + + + Defines the base class for Matrix classes. + + Supported data types are double, single, , and . + + + + The value of 1.0. + + + + + The value of 0.0. + + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of this matrix with a scalar. + + The scalar to multiply with. + The result of the multiplication. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Divides each element of this matrix with a scalar. + + The scalar to divide with. + The result of the division. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.ColumnCount != rightSide.Count. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ). + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.ColumnCount. + If the result matrix's dimensions are not the this.RowCount x other.RowCount. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.ColumnCount. + If the other matrix is . + The result of the multiplication. + + + + Multiplies the transpose of this matrix by a vector and returns the result. + + The vector to multiply with. + The result of the multiplication. + If is . + If this.RowCount != rightSide.Count. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Rows != other.RowCount. + If the result matrix's dimensions are not the this.ColumnCount x other.ColumnCount. + + + + Multiplies the transpose of this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Rows != other.RowCount. + If the other matrix is . + The result of the multiplication. + + + + Negate each element of this matrix. + + A matrix containing the negated values. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Complex conjugate each element of this matrix. + + A matrix containing the conjugated values. + + + + Complex conjugate each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + If the result matrix is . + if the result matrix's dimensions are not the same as this matrix. + + + + Pointwise multiplies this matrix with another matrix. + + The matrix to pointwise multiply with this one. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise multiplication of this matrix and . + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Pointwise divide this matrix by another matrix. + + The matrix to pointwise subtract this one by. + If the other matrix is . + If this matrix and are not the same size. + A new matrix that is the pointwise division of this matrix and . + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + If the other matrix is . + If the result matrix is . + If this matrix and are not the same size. + If this matrix and are not the same size. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + A matrix containing the results. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Calculates the rank of the matrix + + effective numerical rank, obtained from SVD + + + Calculates the condition number of this matrix. + The condition number of the matrix. + The condition number is calculated using singular value decomposition. + + + Computes the determinant of this matrix. + The determinant of this matrix. + + + Computes the inverse of this matrix. + The inverse of this matrix. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + If other is . + The kronecker product of the two matrices. + + + + Computes the Kronecker product of this matrix with the given matrix. The new matrix is M-by-N + with M = this.Rows * lower.Rows and N = this.Columns * lower.Columns. + + The other matrix. + The kronecker product of the two matrices. + If other is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows * lower.rows) x (this.Columns * lower.Columns). + + + + Normalizes the columns of a matrix. + + The norm under which to normalize the columns under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Normalizes the rows of a matrix. + + The norm under which to normalize the rows under. + A normalized version of the matrix. + If the parameter p is not positive. + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Returns a that describes the type, dimensions and shape of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that represents the content of this matrix. + + + + + Returns a that summarizes this matrix. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this matrix. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + Initializes a new instance of the Matrix class. + + + + + Constructs matrix from a list of column vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of column vectors. + Creates a matrix of size Max([i].Count) x .Count + + + + Constructs matrix from a list of row vectors. + + The vectors to construct the matrix from. + The matrix constructed from the list of row vectors. + Creates a matrix of size Max(.Count) x [i].Count + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + + + + Sets the value of the given element without range checking. + + + The row of the element. + + + The column of the element. + + + The value to set the element to. + + + + + Sets all values to zero. + + + + + Sets all values of a column to zero. + + + + + Sets all values of a row to zero. + + + + + Sets all values of a submatrix to zero. + + + + + Creates a clone of this instance. + + + A clone of the instance. + + + + + Copies the elements of this matrix to the given matrix. + + + The matrix to copy values into. + + + If target is . + + + If this and the target matrix do not have the same dimensions.. + + + + + Creates a Matrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A Matrix with the given dimensions. + + + Creates a matrix of the same matrix type as the current matrix. + + + + + Creates a Vector with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A Vector with the given dimension. + + + Creates a vector of the same type as the current matrix. + + + + + Copies a row into an Vector. + + The row to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of rows. + + + + Copies a row into to the given Vector. + + The row to copy. + The Vector to copy the row into. + If the result vector is . + If is negative, + or greater than or equal to the number of rows. + If this.Columns != result.Count. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of rows. + is negative, + or greater than or equal to the number of columns. + (columnIndex + length) >= Columns. + If is not positive. + + + + Copies the requested row elements into a new Vector. + + The row to copy elements from. + The column to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Copies a column into a new Vector>. + + The column to copy. + A Vector containing the copied elements. + If is negative, + or greater than or equal to the number of columns. + + + + Copies a column into to the given Vector. + + The column to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If this.Rows != result.Count. + + + + Copies the requested column elements into a new Vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + A Vector containing the requested elements. + If: + is negative, + or greater than or equal to the number of columns. + is negative, + or greater than or equal to the number of rows. + (rowIndex + length) >= Rows. + + If is not positive. + + + + Copies the requested column elements into the given vector. + + The column to copy elements from. + The row to start copying from. + The number of elements to copy. + The Vector to copy the column into. + If the result Vector is . + If is negative, + or greater than or equal to the number of columns. + If is negative, + or greater than or equal to the number of rows. + If + + is greater than or equal to the number of rows. + If is not positive. + If result.Count < length. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Returns the elements of the diagonal in a Vector. + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a new matrix and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Copies the values of the given Vector to the specified column. + + The column to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + + + + Copies the values of the given array to the specified column. + + The column to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of columns. + If the size of does not + equal the number of rows of this Matrix. + If the size of does not + equal the number of rows of this Matrix. + + + + Creates a new matrix and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new matrix with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Copies the values of the given Vector to the specified row. + + The row to copy the values to. + The vector to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of the given array to the specified row. + + The row to copy the values to. + The array to copy the values from. + If is . + If is less than zero, + or greater than or equal to the number of rows. + If the size of does not + equal the number of columns of this Matrix. + + + + Copies the values of a given matrix into a region in this matrix. + + The row to start copying to. + The number of rows to copy. Must be positive. + The column to start copying to. + The number of columns to copy. Must be positive. + The sub-matrix to copy from. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If is + the size of is not at least x . + If or + is not positive. + + + + Copies the values of the given Vector to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + + + + Concatenates this matrix with the given matrix. + + The matrix to concatenate. + The combined matrix. + + + + Concatenates this matrix with the given matrix and places the result into the result matrix. + + The matrix to concatenate. + The combined matrix. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Stacks this matrix on top of the given matrix and places the result into the result matrix. + + The matrix to stack this matrix upon. + The combined matrix. + If lower is . + If upper.Columns != lower.Columns. + + + + Diagonally stacks his matrix on top of the given matrix. The new matrix is a M-by-N matrix, + where M = this.Rows + lower.Rows and N = this.Columns + lower.Columns. + The values of off the off diagonal matrices/blocks are set to zero. + + The lower, right matrix. + If lower is . + the combined matrix + + + + Diagonally stacks his matrix on top of the given matrix and places the combined matrix into the result matrix. + + The lower, right matrix. + The combined matrix + If lower is . + If the result matrix is . + If the result matrix's dimensions are not (this.Rows + lower.rows) x (this.Columns + lower.Columns). + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + For sparse matrices, the L2 norm is computed using a dense implementation of singular value decomposition. + In a later release, it will be replaced with a sparse implementation. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Returns an that enumerates over the matrix columns. + + An that enumerates over the matrix columns + + + + + Returns an that enumerates the requested matrix columns. + + The column to start enumerating over. + The number of columns to enumerating over. + An that enumerates over requested matrix columns. + + If: + is negative, + or greater than or equal to the number of columns. + (index + length) >= Columns. + + If is not positive. + + + + Returns an that enumerates the requested matrix rows. + + The row to start enumerating over. + The number of rows to enumerating over. + An that enumerates over requested matrix rows. + + If: + is negative, + or greater than or equal to the number of rows. + (index + length) >= Rows. + If is not positive. + + + + Returns an that enumerates over the matrix rows. + + An that enumerates over the matrix rows + + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Returns this matrix as a multidimensional array. + + A multidimensional containing the values of this matrix. + + + + Returns the matrix's elements as an array with the data laid out column-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 4, 7, 2, 5, 8, 3, 6, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Returns the matrix's elements as an array with the data laid row-wise. + +
+            1, 2, 3
+            4, 5, 6  will be returned as  1, 2, 3, 4, 5, 6, 7, 8, 9
+            7, 8, 9
+            
+ An array containing the matrix's elements. +
+ + + Applies a function to each value of this matrix and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Applies a function to each value of this matrix and replaces the value with its result. + The row and column indices of each value (zero-based) are passed as first arguments to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse matrices). + + + + + Gets the raw matrix data storage. + + + + + Gets the number of columns. + + The number of columns. + + + + Gets the number of rows. + + The number of rows. + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + Complex32 version of the class. + + + + + Defines the generic class for Vector classes. + + Supported data types are double, single, , and . + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a that describes the type, dimensions and shape of this vector. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that represents the content of this vector, row by row. + + + + + Returns a that summarizes this vector. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + + + + + Returns a that summarizes this vector. + The maximum number of cells can be configured in the class. + The format string is ignored. + + + + + Returns a that summarizes this vector. + + + + + The zero value for type T. + + + + + The value of 1.0 for type T. + + + + + Initializes a new instance of the Vector class. + + + + Gets the value at the given without range checking.. + The index of the value to get or set. + The value of the vector at the given . + + + Sets the at the given without range checking.. + The index of the value to get or set. + The value to set. + + + + Resets all values to zero. + + + + + Sets all values of a subvector to zero. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + The number of rows. + The number of columns. + A matrix with the given dimensions. + + + + Creates a Vector of the given size using the same storage type + as this vector. + + The size of the Vector to create. + The new Vector. + + + + Negates vector and save result to + + Target vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The result of the division. + + + + Adds a scalar to each element of the vector. + + The scalar to add. + A copy of the vector with the scalar added. + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + If the result vector is . + If this vector and are not the same size. + + + + Returns a copy of this vector. + + This vector. + + Added as an alternative to the unary addition operator. + + + + + Adds another vector to this vector. + + The vector to add to this one. + A new vector containing the sum of both vectors. + If the other vector is . + If this vector and are not the same size. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Subtracts a scalar from each element of the vector. + + The scalar to subtract. + A new vector containing the subtraction of this vector and the scalar. + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + If the result vector is . + If this vector and are not the same size. + + + + Returns a negated vector. + + The negated vector. + Added as an alternative to the unary negation operator. + + + + Negates vector and save result to + + Target vector + + + + Subtracts another vector from this vector. + + The vector to subtract from this one. + A new vector containing the subtraction of the the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Return vector with complex conjugate values of the source vector + + Conjugated vector + + + + Complex conjugates vector and save result to + + Target vector + + + + Multiplies a scalar to each element of the vector. + + The scalar to multiply. + A new vector that is the multiplication of the vector and the scalar. + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + If the result vector is . + If this vector and are not the same size. + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + The result of the addition. + If is not of the same size. + If is . + + + + Divides each element of the vector by a scalar. + + The scalar to divide with. + A new vector that is the division of the vector and the scalar. + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + The scalar to divide with. + The vector to store the result of the division. + If the result vector is . + If this vector and are not the same size. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector containing the result. + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Pointwise multiplies this vector with another vector. + + The vector to pointwise multiply with this one. + A new vector which is the pointwise multiplication of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector. + + The vector to pointwise divide this one by. + A new vector which is the pointwise division of the two vectors. + If the other vector is . + If this vector and are not the same size. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + If the other vector is . + If the result vector is . + If this vector and are not the same size. + If this vector and are not the same size. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Returns a Vector containing the same values of . + + This method is included for completeness. + The vector to get the values from. + A vector containing the same values as . + If is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Adds a scalar to each element of a vector. + + The vector to add to. + The scalar value to add. + The result of the addition. + If is . + + + + Adds a scalar to each element of a vector. + + The scalar value to add. + The vector to add to. + The result of the addition. + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of a vector. + + The vector to subtract from. + The scalar value to subtract. + The result of the subtraction. + If is . + + + + Substracts each element of a vector from a scalar. + + The scalar value to subtract from. + The vector to subtract. + The result of the subtraction. + If is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of maximum element. + + The value of maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the value of the minimum element. + + The value of the minimum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Returns a deep-copy clone of the vector. + + A deep-copy clone of the vector. + + + + Set the values of this vector to the given values. + + The array containing the values to use. + If is . + If is not the same size as this vector. + + + + Copies the values of this vector into the target vector. + + The vector to copy elements into. + If is . + If is not the same size as this vector. + + + + Creates a vector containing specified elements. + + The first element to begin copying from. + The number of elements to copy. + A vector containing a copy of the specified elements. + If is not positive or + greater than or equal to the size of the vector. + If + is greater than or equal to the size of the vector. + + If is not positive. + + + + Copies the values of a given vector into a region in this vector. + + The field to start copying to + The number of fields to cpy. Must be positive. + The sub-vector to copy from. + If is + + + + Copies the requested elements from this vector to another. + + The vector to copy the elements to. + The element to start copying from. + The element to start copying to. + The number of elements to copy. + + + + Returns the data contained in the vector as an array. + + + The vector's data as an array. + + + + + Create a matrix based on this vector in column form (one single column). + + + This vector as a column matrix. + + + + + Create a matrix based on this vector in row form (one single row). + + + This vector as a row matrix. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an that contains the position and value of the element, for all non-zero elements. + + + An over this vector that contains the position and value of each element. + + + The enumerator returns a + with the first value being the element index and the second value + being the value of the element at that index. + The enumerator will exclude all elements with a zero value. + + + + + Applies a function to each value of this vector and replaces the value with its result. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Applies a function to each value of this vector and replaces the value with its result. + The index of each value (zero-based) is passed as first argument to the function. + If forceMapZero is not set to true, zero values may or may not be skipped depending + on the actual data storage implementation (relevant mostly for sparse vectors). + + + + + Gets the raw vector data storage. + + + + + Gets the number of items. + + + + Gets or sets the value at the given . + The index of the value to get or set. + The value of the vector at the given . + If is negative or + greater than the size of the vector. + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex32 value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex32 value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex32 value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A Complex32 dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex32 dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + Supported data types are double, single, , and . + + + + Classes that solves a system of linear equations, AX = B. + + Supported data types are double, single, , and . + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, AX = B. + + The right hand side Matrix, B. + The left hand side Matrix, X. + + + + Solves a system of linear equations, Ax = b + + The right hand side vector, b. + The left hand side Vector, x. + + + + Solves a system of linear equations, Ax = b. + + The right hand side vector, b. + The left hand side Matrix>, x. + + + + Internal method which routes the call to perform the Cholesky factorization to the appropriate class. + + The matrix to factor. + A cholesky factorization object. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets the lower triangular form of the Cholesky matrix + + + + + Gets the lower triangular form of the Cholesky matrix. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + An EVD object. + + + Returns the eigen values as a . + The eigen values. + + + Returns the right eigen vectors as a . + The eigen vectors. + + + Returns the block diagonal eigenvalue matrix . + The block diagonal eigenvalue matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether matrix is symmetric or not + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Gets or sets the eigen values (λ) of matrix in ascending value. + + + + + Gets or sets eigenvectors. + + + + + Gets or sets the block diagonal eigenvalue matrix. + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + Supported data types are double, single, , and . + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + The type of QR factorization to perform. + A QR factorization object. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets orthogonal Q matrix + + + + + Gets or sets upper triangular factor R + + + + + The QR factorization method. + + + + + Gets orthogonal Q matrix + + + + + Gets the upper triangular factor R. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Internal method which routes the call to perform the QR factorization to the appropriate class. + + The matrix to factor. + A QR factorization object. + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + Supported data types are double, single, , and . + + + + Value of one for T. + + + + + Internal method which routes the call to perform the LU factorization to the appropriate class. + + The matrix to factor. + An LU factorization object. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + Gets or sets both the L and U factors in the same matrix. + + + + + Gets or sets the pivot indices of the LU factorization. + + + + + Gets the lower triangular factor. + + + + + Gets the upper triangular factor. + + + + + Gets the permutation applied to LU factorization. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + Supported data types are double, single, , and . + + + + Internal method which routes the call to perform the singular value decomposition to the appropriate class. + + The matrix to factor. + Compute the singular U and VT vectors or not. + An SVD object. + + + Returns the left singular vectors as a . + The left singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + + + Returns the right singular vectors as a . + The right singular vectors. The matrix will be null, if computeVectors in the constructor is set to false. + This is the transpose of the V matrix. + + + Returns the singular values as a diagonal . + The singular values as a diagonal . + + + Returns the singular values as a . + the singular values as a . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets a value indicating whether to compute U and VT matrices during SVD factorization or not + + + + + Gets or sets the singular values (Σ) of matrix in ascending value. + + + + + Gets or sets left singular vectors (U - m-by-m unitary matrix) + + + + + Gets or sets transpose right singular vectors (transpose of V, an n-by-n unitary matrix + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex32 value z1 + Complex32 value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + Complex version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + Complex version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a complex. + + The vector to scale. + The Complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The Complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The Complex value. + The result of the division. + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A Complex dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a Complex dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. + + + A Complex dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Conjugates vector and save result to + + Target vector + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Data array of matrix V (eigenvectors) + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of the eigenvectors + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a complex matrix. + + + If A is hermitan, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is hermitan. + I.e. A = V*D*V' and V*VH=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Reduces a complex hermitian matrix to a real symmetric tridiagonal matrix using unitary similarity transformations. + + Source matrix to reduce + Output: Arrays for internal storage of real parts of eigenvalues + Output: Arrays for internal storage of imaginary parts of eigenvalues + Output: Arrays that contains further information about the transformations. + Order of initial matrix + This is derived from the Algol procedures HTRIDI by + Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Determines eigenvectors by undoing the symmetric tridiagonalize transformation + + Previously tridiagonalized matrix by . + Contains further information about the transformations + Input matrix order + This is derived from the Algol procedures HTRIBK, by + by Smith, Boyle, Dongarra, Garbow, Ikebe, Klema, Moler, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any complex square matrix A may be decomposed as A = QR where Q is an unitary mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an unitary matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Complex value z1 + Complex value z2 + Result multiplication of signum function and absolute value + + + + Interchanges two vectors and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and conjugating the first vector. + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + scalar cos value + scalar sin value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the IIterator that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current IIterator. Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Conjugates vector and save result to + + Target vector + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a complex. + + The vector to scale. + The complex value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a complex. + + The complex value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a complex. + + The vector to divide. + The complex value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a complex vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + double version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + double version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector to this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to double-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is performed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The type of QR factorization to perform. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + It may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vecrors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was canceled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a double sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. + + + A double sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to double-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + A setup functions to help simplify the generic code. + + + + + Sets the value of 1.0 for type T. + + The type to return the value of 1.0 of. + The value of 1.0 for type T. + + + + Sets the value of 0.0 for type T. + + The type to return the value of 0.0 of. + The value of 0.0 for type T. + + + + The type of QR factorization go perform. + + + + + Compute the full QR factorization of a matrix. + + + + + Compute the thin QR factorixation of a matrix. + + + + + Indicates that a calculation was cancelled by the user. + + + + + Defines the base interface for calculation status objects. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has converged to the desired convergence levels. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation diverged. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that a calculation has failed for some reason. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the state of the calculation is indetermined, not started or stopped. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation is running and no results are yet known. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Indicates that the calculation has been stopped due to reaching the stopping + limits, but that convergence was not achieved. + + + + + Gets a value indicating whether current status warrants stopping the calculation. + + + + + Iteration stop criteria. + + + + + Monitor calculation failures in the iterative calculation. + + + + + Monitor the calculation for signs of divergence. + + + + + Guard the calculation against unlimited continuation + by monitoring user specified limits, e.g. the maximum number of iterations. + + + + + Monitor the calculation for convergence, usually + based on the residuals of the calculation. + + + + + A Matrix class with dense storage. The underlying storage is a one dimensional array in column-major order (column by column). + + + + + float version of the class. + + + + + Initializes a new instance of the Matrix class. + + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + + Returns the conjugate transpose of this matrix. + + The conjugate transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Divides each element of the matrix by a scalar and places results into the result matrix. + + The scalar to divide the matrix with. + The matrix to store the result of the division. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Complex conjugates each element of this matrix and place the results into the result matrix. + + The result of the conjugation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Number of rows. + + Using this instead of the RowCount property to speed up calculating + a matrix index in the data array. + + + + Number of columns. + + Using this instead of the ColumnCount property to speed up calculating + a matrix index in the data array. + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new dense matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to be in column-major order (column by column) and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable. + The enumerable is assumed to be in column-major order (column by column). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix and initialize each value using the provided init function. + + + + + Create a new dense matrix with values sampled from the provided random distribution. + + + + + Create a new dense matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new dense matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new dense matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DenseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DenseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A dense identity matrix. + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of add + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Computes the trace of this matrix. + + The trace of this matrix + If the matrix is not square + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the matrix's data. + + The matrix's data. + + + + Gets the matrix's data. + + The matrix's data. + + + + A vector using dense storage. + + + + + float version of the class. + + + + + Initializes a new instance of the Vector class. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Divides each element of the vector by a scalar and stores the result in the result vector. + + + The scalar to divide with. + + + The vector to store the result of the division. + + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Computes the p-Norm. + + + The p value. + + + Scalar ret = (sum(abs(At(i))^p))^(1/p) + + + + + Conjugates vector and save result to + + Target vector + + + + Negates vector and saves result to + + Target vector + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Normalizes this vector to a unit vector with respect to the p-norm. + + + The p value. + + + This vector normalized to a unit vector with respect to the p-norm. + + + + + Number of elements + + + + + Gets the vector's data. + + + + + Create a new dense vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector directly binding to a raw array. + The array is used directly without copying. + Very efficient, but changes to the array and the vector will affect each other. + + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector and initialize each value using the provided init function. + + + + + Create a new dense vector with values sampled from the provided random distribution. + + + + + Create a new dense vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new dense vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new dense vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Returns a reference to the internal data structure. + + The DenseVector whose internal data we are + returning. + + A reference to the internal date of the given vector. + + + + + Returns a vector bound directly to a reference of the provided array. + + The array to bind to the DenseVector object. + + A DenseVector whose values are bound to the given array. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + + The scalar to add. + The vector to store the result of the addition. + + + + Adds another vector to this vector and stores the result into the result vector. + + The vector to add to this one. + The vector to store the result of the addition. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + The scalar to subtract. + The vector to store the result of the subtraction. + + + + Subtracts another vector from this vector and stores the result into the result vector. + + The vector to subtract from this one. + The vector to store the result of the subtraction. + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + The scalar to multiply. + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + The other vector to add. + s + The result of the addition. + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the value of the absolute minimum element. + + The value of the absolute minimum element. + + + + Returns the value of the absolute maximum element. + + The value of the absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + Pointwise divide this vector with another vector and stores the result into the result vector. + + The vector to pointwise divide this one by. + The vector to store the result of the pointwise division. + + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float dense vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float dense vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real dense vector to float-precision dense vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the vector's data. + + The vector's data. + + + + A matrix type for diagonal matrices. + + + Diagonal matrices can be non-square matrices but the diagonal always starts + at element 0,0. A diagonal matrix will throw an exception if non diagonal + entries are set. The exception to this is when the off diagonal elements are + 0.0 or NaN; these settings will cause no change to the diagonal matrix. + + + + + Gets the matrix's data. + + The matrix's data. + + + + Create a new diagonal matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns. + All diagonal cells of the matrix will be initialized to the provided value, all non-diagonal ones to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new diagonal matrix with the given number of rows and columns directly binding to a raw array. + The array is assumed to contain the diagonal elements only and is used directly without copying. + Very efficient, but changes to the array and the matrix will affect each other. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value from the provided enumerable. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix and initialize each diagonal value using the provided init function. + + + + + Create a new diagonal matrix with diagonal values sampled from the provided random distribution. + + + + + Create a new diagonal matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + The array to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Create a new diagonal matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + The matrix to copy from must be diagonal as well. + A new memory block will be allocated for storing the matrix. + + + + + Creates a DiagonalMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A DiagonalMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract. + The matrix to store the result of the subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Copies the values of the given array to the diagonal. + + The array to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Copies the values of the given to the diagonal. + + The vector to copy the values from. The length of the vector should be + Min(Rows, Columns). + If is . + If the length of does not + equal Min(Rows, Columns). + For non-square matrices, the elements of are copied to + this[i,i]. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + If the result matrix is . + If the result matrix's dimensions are not the same as this matrix. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Multiplies this matrix with a vector and places the results into the result matrix. + + The vector to multiply with. + The result of the multiplication. + If is . + If is . + If result.Count != this.RowCount. + If this.ColumnCount != .Count. + + + + Left multiply a matrix with a vector ( = vector * matrix ) and place the result in the result vector. + + The vector to multiply with. + The result of the multiplication. + If is . + If the result matrix is . + If result.Count != this.ColumnCount. + If this.RowCount != .Count. + + + + Computes the determinant of this matrix. + + The determinant of this matrix. + + + + Returns the elements of the diagonal in a . + + The elements of the diagonal. + For non-square matrices, the method returns Min(Rows, Columns) elements where + i == j (i is the row index, and j is the column index). + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + If the other matrix is . + If the result matrix is . + If this.Columns != other.Rows. + If the result matrix's dimensions are not the this.Rows x other.Columns. + + + + Multiplies this matrix with transpose of another matrix and returns the result. + + The matrix to multiply with. + If this.Columns != other.Rows. + If the other matrix is . + The result of multiplication. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the L1 norm. + The L1 norm of the matrix. + + + Calculates the L2 norm. + The L2 norm of the matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + Calculates the condition number of this matrix. + The condition number of the matrix. + + + Computes the inverse of this matrix. + If is not a square matrix. + If is singular. + The inverse of this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Creates a matrix that contains the values from the requested sub-matrix. + + The row to start copying from. + The number of rows to copy. Must be positive. + The column to start copying from. + The number of columns to copy. Must be positive. + The requested sub-matrix. + If: is + negative, or greater than or equal to the number of rows. + is negative, or greater than or equal to the number + of columns. + (columnIndex + columnLength) >= Columns + (rowIndex + rowLength) >= Rows + If or + is not positive. + + + + Creates a new and inserts the given column at the given index. + + The index of where to insert the column. + The column to insert. + A new with the inserted column. + If is . + If is < zero or > the number of columns. + If the size of != the number of rows. + + + + Creates a new and inserts the given row at the given index. + + The index of where to insert the row. + The row to insert. + A new with the inserted column. + If is . + If is < zero or > the number of rows. + If the size of != the number of columns. + + + + Permute the columns of a matrix according to a permutation. + + The column permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Permute the rows of a matrix according to a permutation. + + The row permutation to apply to this matrix. + Always thrown + Permutation in diagonal matrix are senseless, because of matrix nature + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + A diagonal identity matrix. + + If is less than one. + + + + + Gets a value indicating whether this matrix is symmetric. + + + + + Extension methods which return factorizations for the various matrix classes. + + + + + Computes the Cholesky decomposition for a matrix. + + The matrix to factor. + The Cholesky decomposition object. + + + + Computes the LU decomposition for a matrix. + + The matrix to factor. + The LU decomposition object. + + + + Computes the QR decomposition for a matrix. + + The matrix to factor. + The type of QR factorization to perform. + The QR decomposition object. + + + + Computes the QR decomposition for a matrix using Modified Gram-Schmidt Orthogonalization. + + The matrix to factor. + The QR decomposition object. + + + + Computes the SVD decomposition for a matrix. + + The matrix to factor. + Compute the singular U and VT vectors or not. + The SVD decomposition object. + + + + Computes the EVD decomposition for a matrix. + + The matrix to factor. + The EVD decomposition object. + + + + A class which encapsulates the functionality of a Cholesky factorization. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Gets the determinant of the matrix for which the Cholesky matrix was computed. + + + + + Gets the log determinant of the matrix for which the Cholesky matrix was computed. + + + + + A class which encapsulates the functionality of a Cholesky factorization for dense matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Gets the absolute value of determinant of the square matrix for which the EVD was computed. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Data array of matrix V (eigenvectors) + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Data array of matrix V (eigenvectors) + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + used for QR solve + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Factorize matrix using the modified Gram-Schmidt method. + + Initial matrix. On exit is replaced by Q. + Number of rows in Q. + Number of columns in Q. + On exit is filled by R. + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + In the Math.Net implementation we also store a set of pivot elements for increased + numerical stability. The pivot elements encode a permutation matrix P such that P*A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Gets the determinant of the matrix for which the LU factorization was computed. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A (m x n) may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + If a factorization is peformed, the resulting Q matrix is an m x m matrix + and the R matrix is an m x n matrix. If a factorization is performed, the + resulting Q matrix is an m x n matrix and the R matrix is an n x n matrix. + + + + + Gets the absolute determinant value of the matrix for which the QR matrix was computed. + + + + + Gets a value indicating whether the matrix is full rank or not. + + true if the matrix is full rank; otherwise false. + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + If row count is less then column count + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Gets or sets Tau vector. Contains additional information on Q - used for native solver. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + A class which encapsulates the functionality of the singular value decomposition (SVD). + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Gets the effective numerical matrix rank. + + The number of non-negligible singular values. + + + + Gets the two norm of the . + + The 2-norm of the . + + + + Gets the condition number max(S) / min(S) + + The condition number. + + + + Gets the determinant of the square matrix for which the SVD was computed. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of a Cholesky factorization for user matrices. + For a symmetric, positive definite matrix A, the Cholesky factorization + is an lower triangular matrix L so that A = L*L'. + + + The computation of the Cholesky factorization is done at construction time. If the matrix is not symmetric + or positive definite, the constructor will throw an exception. + + + + + Initializes a new instance of the class. This object will compute the + Cholesky factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + If is not positive definite. + + + + Calculate Cholesky step + + Factor matrix + Number of rows + Column start + Total columns + Multipliers calculated previously + Number of available processors + + + + Solves a system of linear equations, AX = B, with A Cholesky factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A Cholesky factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Eigenvalues and eigenvectors of a real matrix. + + + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. + I.e. A = V*D*V' and V*VT=I. + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + columns of V represent the eigenvectors in the sense that A*V = V*D, + i.e. A.Multiply(V) equals V.Multiply(D). The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*Inverse(V) depends upon V.Condition(). + + + + + Initializes a new instance of the class. This object will compute the + the eigenvalue decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + If is null. + If EVD algorithm failed to converge with matrix . + + + + Symmetric Householder reduction to tridiagonal form. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tred2 by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Symmetric tridiagonal QL algorithm. + + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedures tql2, by + Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Nonsymmetric reduction to Hessenberg form. + + Array for internal storage of nonsymmetric Hessenberg form. + Order of initial matrix + This is derived from the Algol procedures orthes and ortran, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutines in EISPACK. + + + + Nonsymmetric reduction from Hessenberg to real Schur form. + + Array for internal storage of nonsymmetric Hessenberg form. + Arrays for internal storage of real parts of eigenvalues + Arrays for internal storage of imaginary parts of eigenvalues + Order of initial matrix + This is derived from the Algol procedure hqr2, + by Martin and Wilkinson, Handbook for Auto. Comp., + Vol.ii-Linear Algebra, and the corresponding + Fortran subroutine in EISPACK. + + + + Complex scalar division X/Y. + + Real part of X + Imaginary part of X + Real part of Y + Imaginary part of Y + Division result as a number. + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A EVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the QR decomposition Modified Gram-Schmidt Orthogonalization. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal mxn matrix and R is an nxn upper triangular matrix. + + + The computation of the QR decomposition is done at construction time by modified Gram-Schmidt Orthogonalization. + + + + + Initializes a new instance of the class. This object creates an orthogonal matrix + using the modified Gram-Schmidt method. + + The matrix to factor. + If is null. + If row count is less then column count + If is rank deficient + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of an LU factorization. + For a matrix A, the LU factorization is a pair of lower triangular matrix L and + upper triangular matrix U so that A = L*U. + + + The computation of the LU factorization is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + LU factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + If is null. + If is not a square matrix. + + + + Solves a system of linear equations, AX = B, with A LU factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A LU factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Returns the inverse of this matrix. The inverse is calculated using LU decomposition. + + The inverse of this matrix. + + + + A class which encapsulates the functionality of the QR decomposition. + Any real square matrix A may be decomposed as A = QR where Q is an orthogonal matrix + (its columns are orthogonal unit vectors meaning QTQ = I) and R is an upper triangular matrix + (also called right triangular matrix). + + + The computation of the QR decomposition is done at construction time by Householder transformation. + + + + + Initializes a new instance of the class. This object will compute the + QR factorization when the constructor is called and cache it's factorization. + + The matrix to factor. + The QR factorization method to use. + If is null. + + + + Generate column from initial matrix to work array + + Initial matrix + The first row + Column index + Generated vector + + + + Perform calculation of Q or R + + Work array + Q or R matrices + The first row + The last row + The first column + The last column + Number of available CPUs + + + + Solves a system of linear equations, AX = B, with A QR factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A QR factorized. + + The right hand side vector, b. + The left hand side , x. + + + + A class which encapsulates the functionality of the singular value decomposition (SVD) for . + Suppose M is an m-by-n matrix whose entries are real numbers. + Then there exists a factorization of the form M = UΣVT where: + - U is an m-by-m unitary matrix; + - Σ is m-by-n diagonal matrix with nonnegative real numbers on the diagonal; + - VT denotes transpose of V, an n-by-n unitary matrix; + Such a factorization is called a singular-value decomposition of M. A common convention is to order the diagonal + entries Σ(i,i) in descending order. In this case, the diagonal matrix Σ is uniquely determined + by M (though the matrices U and V are not). The diagonal entries of Σ are known as the singular values of M. + + + The computation of the singular value decomposition is done at construction time. + + + + + Initializes a new instance of the class. This object will compute the + the singular value decomposition when the constructor is called and cache it's decomposition. + + The matrix to factor. + Compute the singular U and VT vectors or not. + If is null. + If SVD algorithm failed to converge with matrix . + + + + Calculates absolute value of multiplied on signum function of + + Double value z1 + Double value z2 + Result multiplication of signum function and absolute value + + + + Swap column and + + Source matrix + The number of rows in + Column A index to swap + Column B index to swap + + + + Scale column by starting from row + + Source matrix + The number of rows in + Column to scale + Row to scale from + Scale value + + + + Scale vector by starting from index + + Source vector + Row to scale from + Scale value + + + + Given the Cartesian coordinates (da, db) of a point p, these fucntion return the parameters da, db, c, and s + associated with the Givens rotation that zeros the y-coordinate of the point. + + Provides the x-coordinate of the point p. On exit contains the parameter r associated with the Givens rotation + Provides the y-coordinate of the point p. On exit contains the parameter z associated with the Givens rotation + Contains the parameter c associated with the Givens rotation + Contains the parameter s associated with the Givens rotation + This is equivalent to the DROTG LAPACK routine. + + + + Calculate Norm 2 of the column in matrix starting from row + + Source matrix + The number of rows in + Column index + Start row index + Norm2 (Euclidean norm) of the column + + + + Calculate Norm 2 of the vector starting from index + + Source vector + Start index + Norm2 (Euclidean norm) of the vector + + + + Calculate dot product of and + + Source matrix + The number of rows in + Index of column A + Index of column B + Starting row index + Dot product value + + + + Performs rotation of points in the plane. Given two vectors x and y , + each vector element of these vectors is replaced as follows: x(i) = c*x(i) + s*y(i); y(i) = c*y(i) - s*x(i) + + Source matrix + The number of rows in + Index of column A + Index of column B + Scalar "c" value + Scalar "s" value + + + + Solves a system of linear equations, AX = B, with A SVD factorized. + + The right hand side , B. + The left hand side , X. + + + + Solves a system of linear equations, Ax = b, with A SVD factorized. + + The right hand side vector, b. + The left hand side , x. + + + + Defines the interface for classes that solve the matrix equation Ax = b in + an iterative manner. + + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + Defines the interface for objects that can create an iterative solver with + specific settings. This interface is used to pass iterative solver creation + setup information around. + + + + + Creates a fully functional iterative solver with the default settings + given by this setup. + + A new . + + + + Gets the type of the solver that will be created by this setup object. + + + + + Gets type of preconditioner, if any, that will be created by this setup object. + + + + + Gets the relative speed of the solver. + + Returns a value between 0 and 1, inclusive. + + + + Gets the relative reliability of the solver. + + Returns a value between 0 and 1 inclusive. + + + + Defines the base interface for iterators that help control an iterative calculation. + + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + Thrown if is of the same type as an already stored criterium. + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + Does not reset the stop-criteria. + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + Note to implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation.. + + + + A Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Bi-Conjugate Gradient Stabilized (BiCGStab) solver is an 'improvement' + of the standard Conjugate Gradient (CG) solver. Unlike the CG solver the + BiCGStab can be used on non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The Bi-CGSTAB algorithm was taken from:
+ Templates for the solution of linear systems: Building blocks + for iterative methods +
+ Richard Barrett, Michael Berry, Tony F. Chan, James Demmel, + June M. Donato, Jack Dongarra, Victor Eijkhout, Roldan Pozo, + Charles Romine and Henk van der Vorst +
+ Url: http://www.netlib.org/templates/Templates.html +
+ Algorithm is described in Chapter 2, section 2.3.8, page 27 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient , A. + The solution , b. + The result , x. + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient , A. + The solution , B. + The result , X + + + + Gets the status of the iteration once the calculation is finished. + + + + + A composite matrix solver. The actual solver is made by a sequence of + matrix solvers. + + + + Solver based on:
+ Faster PDE-based simulations using robust composite linear solvers
+ S. Bhowmicka, P. Raghavan a,*, L. McInnes b, B. Norris
+ Future Generation Computer Systems, Vol 20, 2004, pp 373–387
+
+ + Note that if an iterator is passed to this solver it will be used for all the sub-solvers. + +
+
+ + + The default status used if the solver is not running. + + + + + The default status used if the solver is running. + + + + + Loads all the available objects from the MathNet.Numerics assembly. + + + + + Loads the available objects from the MathNet.Numerics assembly. + + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the assembly name. + + The of the assembly that should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + + + + Loads the available objects from the assembly specified by the type. + + The type in the assembly which should be searched for setup objects. + The types that should not be loaded. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + + + + Loads the available objects from the specified assembly. + + The assembly which will be searched for setup objects. + The types that should not be loaded. + + + + The collection of solvers that will be used to + + + + + The status of the calculation. + + + + + The iterator that is used to control the iteration process. + + + + + A flag indicating if the solver has been stopped or not. + + + + + The solver that is currently running. Reference is used to be able to stop the + solver if the user cancels the solve process. + + + + + Initializes a new instance of the class with the default iterator. + + + + + Initializes a new instance of the class with the specified iterator. + + The iterator that will be used to control the iteration process. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Load solvers + + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An IComparer used to compare double precision floating points. + + NOTE: The instance of this class is used only in . If C# suppports interface inheritence + NOTE: and methods in anonymous types, then this class should be deleted and anonymous type implemented with IComaprer support + NOTE: in constructor + + + + Compares two double values based on the selected comparison method. + + The first double to compare. + The second double to compare. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return + value has the following meanings: + Value Meaning Less than zero This object is less than the other parameter. + Zero This object is equal to other. + Greater than zero This object is greater than other. + + + + + A Generalized Product Bi-Conjugate Gradient iterative matrix solver. + + + + The Generalized Product Bi-Conjugate Gradient (GPBiCG) solver is an + alternative version of the Bi-Conjugate Gradient stabilized (CG) solver. + Unlike the CG solver the GPBiCG solver can be used on + non-symmetric matrices.
+ Note that much of the success of the solver depends on the selection of the + proper preconditioner. +
+ + The GPBiCG algorithm was taken from:
+ GPBiCG(m,l): A hybrid of BiCGSTAB and GPBiCG methods with + efficiency and robustness +
+ S. Fujino +
+ Applied Numerical Mathematics, Volume 41, 2002, pp 107 - 117 +
+
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to null, in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates the number of BiCGStab steps should be taken + before switching. + + + + + Indicates the number of GPBiCG steps should be taken + before switching. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually + stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Decide if to do steps with BiCgStab + + Number of iteration + true if yes, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of steps taken with the BiCgStab algorithm + before switching over to the GPBiCG algorithm. + + + + + Gets or sets the number of steps taken with the GPBiCG algorithm + before switching over to the BiCgStab algorithm. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Multiple-Lanczos Bi-Conjugate Gradient stabilized iterative matrix solver. + + + + The Multiple-Lanczos Bi-Conjugate Gradient stabilized (ML(k)-BiCGStab) solver is an 'improvement' + of the standard BiCgStab solver. + + + The algorithm was taken from:
+ ML(k)BiCGSTAB: A BiCGSTAB variant based on multiple Lanczos starting vectors +
+ Man-chung Yeung and Tony F. Chan +
+ SIAM Journal of Scientific Computing +
+ Volume 21, Number 4, pp. 1263 - 1290 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The default number of starting vectors. + + + + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + The collection of starting vectors which are used as the basis for the Krylov sub-space. + + + + + The number of starting vectors used by the algorithm + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Resets the number of starting vectors to the default value. + + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Gets the number of starting vectors to create + + Maximum number + Number of variables + Number of starting vectors to create + + + + Returns an array of starting vectors. + + The maximum number of starting vectors that should be created. + The number of variables. + + An array with starting vectors. The array will never be larger than the + but it may be smaller if + the is smaller than + the . + + + + + Create random vectors array + + Number of vectors + Size of each vector + Array of random vectors + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Source A. + Residual data. + x data. + b data. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets or sets the number of starting vectors. + + + Must be larger than 1 and smaller than the number of variables in the matrix that + for which this solver will be used. + + + + + Gets or sets a series of orthonormal vectors which will be used as basis for the + Krylov sub-space. + + + + + Gets the status of the iteration once the calculation is finished. + + + + + A Transpose Free Quasi-Minimal Residual (TFQMR) iterative matrix solver. + + + + The TFQMR algorithm was taken from:
+ Iterative methods for sparse linear systems. +
+ Yousef Saad +
+ Algorithm is described in Chapter 7, section 7.4.3, page 219 +
+ + The example code below provides an indication of the possible use of the + solver. + +
+
+ + + The status used if there is no status, i.e. the solver hasn't run yet and there is no + iterator. + + + + + The preconditioner that will be used. Can be set to , in which case the default + pre-conditioner will be used. + + + + + The iterative process controller. + + + + + Indicates if the user has stopped the solver. + + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings and a default preconditioner. + + + + + Initializes a new instance of the class. + + + + When using this constructor the solver will use a default preconditioner. + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to monitor the iterative process. + + + + Initializes a new instance of the class. + + + When using this constructor the solver will use the with + the standard settings. + + The that will be used to precondition the matrix equation. + + + + Initializes a new instance of the class. + + + + The main advantages of using a user defined are: + + It is possible to set the desired convergence limits. + + It is possible to check the reason for which the solver finished + the iterative procedure by calling the property. + + + + + The that will be used to precondition the matrix equation. + The that will be used to monitor the iterative process. + + + + Sets the that will be used to precondition the iterative process. + + The preconditioner. + + + + Sets the that will be used to track the iterative process. + + The iterator. + + + + Stops the solve process. + + + Note that it may take an indetermined amount of time for the solver to actually stop the process. + + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b. + The result vector, x. + + + + Solves the matrix equation Ax = b, where A is the coefficient matrix, b is the + solution vector and x is the unknown vector. + + The coefficient matrix, A. + The solution vector, b + The result vector, x + + + + Calculates the true residual of the matrix equation Ax = b according to: residual = b - Ax + + Instance of the A. + Residual values in . + Instance of the x. + Instance of the b. + + + + Determine if calculation should continue + + Number of iterations passed + Result . + Source . + Residual . + true if continue, otherwise false + + + + Is even? + + Number to check + true if even, otherwise false + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X. + + + + Solves the matrix equation AX = B, where A is the coefficient matrix, B is the + solution matrix and X is the unknown matrix. + + The coefficient matrix, A. + The solution matrix, B. + The result matrix, X + + + + Gets the status of the iteration once the calculation is finished. + + + + + An iterator that is used to check if an iterative calculation should continue or stop. + + + + + The default status for the iterator. + + + + + Creates a default iterator with all the objects. + + A new object. + + + + The collection that holds all the stop criteria and the flag indicating if they should be added + to the child iterators. + + + + + The status of the iterator. + + + + + Indicates if the iteration was cancelled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified stop criteria. + + + The specified stop criteria. Only one stop criterium of each type can be passed in. None + of the stop criteria will be passed on to child iterators. + + Thrown if contains multiple stop criteria of the same type. + + + + Adds an to the internal collection of stop-criteria. Only a + single stop criterium of each type can be stored. + + The stop criterium to add. + Thrown if is . + + Thrown if is of the same type as an already + stored criterium. + + + + + Removes the from the internal collection. + + The stop criterium that must be removed. + + + + Indicates if the specific stop criterium is stored by the . + + The stop criterium. + true if the contains the stop criterium; otherwise false. + + + + Indicates to the iterator that the iterative process has been cancelled. + + + Does not reset the stop-criteria. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual iterators may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + + + + Creates a deep clone of the current iterator. + + The deep clone of the current iterator. + + + + Gets the number of stored stop criteria. + + Used for testing only. + + + + Gets an IEnumerator that enumerates over all the stored stop criteria. + + Used for testing only. + + + + Gets the current calculation status. + + + + + A diagonal preconditioner. The preconditioner uses the inverse + of the matrix diagonal as preconditioning values. + + + + + The base interface for preconditioner classes. + + + + Preconditioners are used by iterative solvers to improve the convergence + speed of the solving process. Increase in convergence speed + is related to the number of iterations necessary to get a converged solution. + So while in general the use of a preconditioner means that the iterative + solver will perform fewer iterations it does not guarantee that the actual + solution time decreases given that some preconditioners can be expensive to + setup and run. + + + Note that in general changes to the matrix will invalidate the preconditioner + if the changes occur after creating the preconditioner. + + + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix on which the preconditioner is based. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Mx = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + The inverse of the matrix diagonal. + + + + + Returns the decomposed matrix diagonal. + + The matrix diagonal. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + This class performs an Incomplete LU factorization with drop tolerance + and partial pivoting. The drop tolerance indicates which additional entries + will be dropped from the factorized LU matrices. + + + The ILUTP-Mem algorithm was taken from:
+ ILUTP_Mem: a Space-Efficient Incomplete LU Preconditioner +
+ Tzu-Yi Chen, Department of Mathematics and Computer Science,
+ Pomona College, Claremont CA 91711, USA
+ Published in:
+ Lecture Notes in Computer Science
+ Volume 3046 / 2004
+ pp. 20 - 28
+ Algorithm is described in Section 2, page 22 +
+
+ + + The default fill level. + + + + + The default drop tolerance. + + + + + The decomposed upper triangular matrix. + + + + + The decomposed lower triangular matrix. + + + + + The array containing the pivot values. + + + + + The fill level. + + + + + The drop tolerance. + + + + + The pivot tolerance. + + + + + Initializes a new instance of the class with the default settings. + + + + + Initializes a new instance of the class with the specified settings. + + + The amount of fill that is allowed in the matrix. The value is a fraction of + the number of non-zero entries in the original matrix. Values should be positive. + + + The absolute drop tolerance which indicates below what absolute value an entry + will be dropped from the matrix. A drop tolerance of 0.0 means that no values + will be dropped. Values should always be positive. + + + The pivot tolerance which indicates at what level pivoting will take place. A + value of 0.0 means that no pivoting will take place. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + + This method is used for debugging purposes only and should normally not be used. + + A new matrix containing the lower triagonal elements. + + + + Returns the pivot array. This array is not needed for normal use because + the preconditioner will return the solution vector values in the proper order. + + + This method is used for debugging purposes only and should normally not be used. + + The pivot array. + + + + Initializes the preconditioner and loads the internal data structures. + + + The upon which this preconditioner is based. Note that the + method takes a general matrix type. However internally the data is stored + as a sparse matrix. Therefore it is not recommended to pass a dense matrix. + + If is . + If is not a square matrix. + + + + Pivot elements in the according to internal pivot array + + Row to pivot in + + + + Was pivoting already performed + + Pivots already done + Current item to pivot + true if performed, otherwise false + + + + Swap columns in the + + Source . + First column index to swap + Second column index to swap + + + + Sort vector descending, not changing vector but placing sorted indicies to + + Start sort form + Sort till upper bound + Array with sorted vector indicies + Source + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + Pivot elements in according to internal pivot array + + Source . + Result after pivoting. + + + + Gets or sets the amount of fill that is allowed in the matrix. The + value is a fraction of the number of non-zero entries in the original + matrix. The standard value is 200. + + + + Values should always be positive and can be higher than 1.0. A value lower + than 1.0 means that the eventual preconditioner matrix will have fewer + non-zero entries as the original matrix. A value higher than 1.0 means that + the eventual preconditioner can have more non-zero values than the original + matrix. + + + Note that any changes to the FillLevel after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the absolute drop tolerance which indicates below what absolute value + an entry will be dropped from the matrix. The standard value is 0.0001. + + + + The values should always be positive and can be larger than 1.0. A low value will + keep more small numbers in the preconditioner matrix. A high value will remove + more small numbers from the preconditioner matrix. + + + Note that any changes to the DropTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + Gets or sets the pivot tolerance which indicates at what level pivoting will + take place. The standard value is 0.0 which means pivoting will never take place. + + + + The pivot tolerance is used to calculate if pivoting is necessary. Pivoting + will take place if any of the values in a row is bigger than the + diagonal value of that row divided by the pivot tolerance, i.e. pivoting + will take place if row(i,j) > row(i,i) / PivotTolerance for + any j that is not equal to i. + + + Note that any changes to the PivotTolerance after creating the preconditioner + will invalidate the created preconditioner and will require a re-initialization of + the preconditioner. + + + Thrown if a negative value is provided. + + + + An element sort algorithm for the class. + + + This sort algorithm is used to sort the columns in a sparse matrix based on + the value of the element on the diagonal of the matrix. + + + + + Sorts the elements of the vector in decreasing + fashion. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Sorts the elements of the vector in decreasing + fashion using heap sort algorithm. The vector itself is not affected. + + The starting index. + The stopping index. + An array that will contain the sorted indices once the algorithm finishes. + The that contains the values that need to be sorted. + + + + Build heap for double indicies + + Root position + Length of + Indicies of + Target + + + + Sift double indicies + + Indicies of + Target + Root position + Length of + + + + Sorts the given integers in a decreasing fashion. + + The values. + + + + Sort the given integers in a decreasing fashion using heapsort algorithm + + Array of values to sort + Length of + + + + Build heap + + Target values array + Root position + Length of + + + + Sift values + + Target value array + Root position + Length of + + + + Exchange values in array + + Target values array + First value to exchange + Second value to exchange + + + + An incomplete, level 0, LU factorization preconditioner. + + + The ILU(0) algorithm was taken from:
+ Iterative methods for sparse linear systems
+ Yousef Saad
+ Algorithm is described in Chapter 10, section 10.3.2, page 275
+
+
+ + + The matrix holding the lower (L) and upper (U) matrices. The + decomposition matrices are combined to reduce storage. + + + + + Returns the upper triagonal matrix that was created during the LU decomposition. + + A new matrix containing the upper triagonal elements. + + + + Returns the lower triagonal matrix that was created during the LU decomposition. + + A new matrix containing the lower triagonal elements. + + + + Initializes the preconditioner and loads the internal data structures. + + The matrix upon which the preconditioner is based. + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + + + + A unit preconditioner. This preconditioner does not actually do anything + it is only used when running an without + a preconditioner. + + + + + The coefficient matrix on which this preconditioner operates. + Is used to check dimensions on the different vectors that are processed. + + + + + Initializes the preconditioner and loads the internal data structures. + + + The matrix upon which the preconditioner is based. + + If is . + If is not a square matrix. + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. Also known as the result vector. + If is . + If is . + + + If and do not have the same size. + + + - or - + + + If the size of is different the number of rows of the coefficient matrix. + + + + + + Approximates the solution to the matrix equation Ax = b. + + The right hand side vector. + The left hand side vector. + If is . + + If the size of is different the number of rows of the coefficient matrix. + + + + + Monitors an iterative calculation for signs of divergence. + + + + + The base interface for classes that provide stop criteria for iterative calculations. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Status is set to Status field of current object. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Resets the to the pre-calculation state. + + To implementers: Invoking this method should not clear the user defined + property values, only the state that is used to track the progress of the + calculation. + + + + Gets the current calculation status. + + is not a legal value. Status should be set in implementation. + + + + Gets the which indicates what sort of stop criterium this + monitors. + + + + + Default value for the maximum relative increase that the + residual may experience before a divergence warning is issued. + + + + + Default value for the minimum number of iterations over which + the residual must grow before a divergence warning is issued. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The maximum relative increase the residual may experience without triggering a divergence warning. + + + + + The number of iterations over which a residual increase should be tracked before issuing a divergence warning. + + + + + The status of the calculation + + + + + The array that holds the tracking information. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + relative increase and the default minimum number of tracking iterations. + + + + + Initializes a new instance of the class with the specified maximum + relative increase and the default minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + + + + Initializes a new instance of the class with the default maximum + relative increase and the specified minimum number of tracking iterations. + + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Initializes a new instance of the class with the specified maximum + relative increase and the specified minimum number of tracking iterations. + + The maximum relative increase that the residual may experience before a divergence warning is issued. + The minimum number of iterations over which the residual must grow before a divergence warning is issued. + + + + Returns the maximum relative increase to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Detect if solution is diverging + + true if diverging, otherwise false + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum relative increase that the residual may experience before a divergence warning is issued. + + Thrown if the Maximum is set to zero or below. + + + + Gets or sets the minimum number of iterations over which the residual must grow before + issuing a divergence warning. + + Thrown if the value is set to less than one. + + + + Gets required history Length + + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals for NaN's. + + + + + Defines the default last iteration number. Set to -1 because iterations normally + start at 0. + + + + + The default status. + + + + + The status of the calculation + + + + + The iteration number of the last iteration. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors the numbers of iteration + steps as stop criterium. + + + + + The default value for the maximum number of iterations the process is allowed + to perform. + + + + + The default status. + + + + + The maximum number of iterations the calculation is allowed to perform. + + + + + The status of the calculation + + + + + Initializes a new instance of the class with the default maximum + number of iterations. + + + + + Initializes a new instance of the class with the specified maximum + number of iterations. + + The maximum number of iterations the calculation is allowed to perform. + + + + Returns the maximum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum number of iterations the calculation is allowed to perform. + + Thrown if the Maximum is set to a negative value. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + Defines an that monitors residuals as stop criterium. + + + + + The default value for the maximum value of the residual. + + + + + The default value for the minimum number of iterations. + + + + + Defines the default last iteration number. Set to -1 because iterations normally start at 0. + + + + + The default status. + + + + + The maximum value for the residual below which the calculation is considered converged. + + + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + The status of the calculation + + + + + The number of iterations since the residuals got below the maximum. + + + + + The iteration number of the last iteration. + + + + + Initializes a new instance of the class with the default maximum + residual and the default minimum number of iterations. + + + + + Initializes a new instance of the class with the specified + maximum residual and the default minimum number of iterations. + + The maximum value for the residual below which the calculation is considered converged. + + + + Initializes a new instance of the class with the default maximum residual + and specified minimum number of iterations. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Initializes a new instance of the class with the specified + maximum residual and minimum number of iterations. + + + The maximum value for the residual below which the calculation is considered converged. + + + The minimum number of iterations for which the residual has to be below the maximum before + the calculation is considered converged. + + + + + Returns the maximum residual to the default. + + + + + Returns the minimum number of iterations to the default. + + + + + Determines the status of the iterative calculation based on the stop criteria stored + by the current . Result is set into Status field. + + The number of iterations that have passed so far. + The vector containing the current solution values. + The right hand side vector. + The vector containing the current residual vectors. + + The individual stop criteria may internally track the progress of the calculation based + on the invocation of this method. Therefore this method should only be called if the + calculation has moved forwards at least one step. + + + + + Calculate stop criterium + + Solution vector norm + Criterium value + + + + Set status to + + + + + Set status to + + + + + Set status to + + + + + Resets the to the pre-calculation state. + + + + + Clones the current and its settings. + + A new instance of the class. + + + + Gets or sets the maximum value for the residual below which the calculation is considered + converged. + + Thrown if the Maximum is set to a negative value. + + + + Gets or sets the minimum number of iterations for which the residual has to be + below the maximum before the calculation is considered converged. + + Thrown if the BelowMaximumFor is set to a value less than 1. + + + + Gets the current calculation status. + + + + + Gets the which indicates what sort of stop criterium this + monitors. + + Returns . + + + + A Matrix with sparse storage, intended for very large matrices where most of the cells are zero. + The underlying storage scheme is 3-array compressed-sparse-row (CSR) Format. + Wikipedia - CSR. + + + + + Create a new sparse matrix straight from an initialized matrix storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new square sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the order is less than one. + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to zero. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable. + The enumerable is assumed to be in row-major order (row by row). + This new matrix will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable columns. + Each enumerable in the master enumerable specifies a column. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given enumerable of enumerable rows. + Each enumerable in the master enumerable specifies a row. + This new matrix will be independent from the enumerables. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix and initialize each value using the provided init function. + + + + + Create a new sparse matrix with the given number of rows and columns. + All cells of the matrix will be initialized to the provided value. + Zero-length matrices are not supported. + + If the row or column count is less than one. + + + + Create a new sparse matrix with the given number of rows and columns as a copy of the given array. + The array is assumed to be in column-major order (column by column). + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + + Create a new sparse matrix as a copy of the given two-dimensional array. + This new matrix will be independent from the provided array. + A new memory block will be allocated for storing the matrix. + + + + + Create a new sparse matrix as a copy of the given other matrix. + This new matrix will be independent from the other matrix. + A new memory block will be allocated for storing the matrix. + + + + + Creates a SparseMatrix for the given number of rows and columns. + + The number of rows. + The number of columns. + True if all fields must be mutable (e.g. not a diagonal matrix). + + A SparseMatrix with the given dimensions. + + + + + Creates a with a the given dimension. + + The size of the vector. + True if all fields must be mutable. + + A with the given dimension. + + + + + Returns a new matrix containing the lower triangle of this matrix. + + The lower triangle of this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. + + The upper triangle of this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the lower triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The lower triangle of this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly lower triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns a new matrix containing the upper triangle of this matrix. The new matrix + does not contain the diagonal elements of this matrix. + + The upper triangle of this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + If is . + If the result matrix's dimensions are not the same as this matrix. + + + + Puts the strictly upper triangle of this matrix into the result matrix. + + Where to store the lower triangle. + + + + Returns the transpose of this matrix. + + The transpose of this matrix. + + + Calculates the Frobenius norm of this matrix. + The Frobenius norm of this matrix. + + + Calculates the infinity norm of this matrix. + The infinity norm of this matrix. + + + + Initializes a square with all zero's except for ones on the diagonal. + + the size of the square matrix. + Identity SparseMatrix + + If is less than one. + + + + + Adds another matrix to this matrix. + + The matrix to add to this matrix. + The matrix to store the result of the addition. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Subtracts another matrix from this matrix. + + The matrix to subtract to this matrix. + The matrix to store the result of subtraction. + If the other matrix is . + If the two matrices don't have the same dimensions. + + + + Multiplies each element of the matrix by a scalar and places results into the result matrix. + + The scalar to multiply the matrix with. + The matrix to store the result of the multiplication. + + + + Multiplies this matrix with another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with a vector and places the results into the result vector. + + The vector to multiply with. + The result of the multiplication. + + + + Multiplies this matrix with transpose of another matrix and places the results into the result matrix. + + The matrix to multiply with. + The result of the multiplication. + + + + Negate each element of this matrix and place the results into the result matrix. + + The result of the negation. + + + + Pointwise multiplies this matrix with another matrix and stores the result into the result matrix. + + The matrix to pointwise multiply with this one. + The matrix to store the result of the pointwise multiplication. + + + + Pointwise divide this matrix by another matrix and stores the result into the result matrix. + + The matrix to pointwise divide this one by. + The matrix to store the result of the pointwise division. + + + + Computes the modulus for each element of the matrix. + + The divisor to use. + Matrix to store the results in. + + + + Iterates throw each element in the matrix (row-wise). + + The value at the current iteration along with its position (row, column, value). + + + + Checks if opposites in a range are equal. + + The start of the range. + The end of the range. + The row the row to check. + If the values are equal or not. + + + + Adds two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to add. + The right matrix to add. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Returns a Matrix containing the same values of . + + The matrix to get the values from. + A matrix containing a the same values as . + If is . + + + + Subtracts two matrices together and returns the results. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to subtract. + The right matrix to subtract. + The result of the addition. + If and don't have the same dimensions. + If or is . + + + + Negates each element of the matrix. + + The matrix to negate. + A matrix containing the negated values. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Multiplies two matrices. + + This operator will allocate new memory for the result. It will + choose the representation of either or depending on which + is denser. + The left matrix to multiply. + The right matrix to multiply. + The result of multiplication. + If or is . + If the dimensions of or don't conform. + + + + Multiplies a Matrix and a Vector. + + The matrix to multiply. + The vector to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Vector and a Matrix. + + The vector to multiply. + The matrix to multiply. + The result of multiplication. + If or is . + + + + Multiplies a Matrix by a constant and returns the result. + + The matrix to multiply. + The constant to multiply the matrix by. + The result of the multiplication. + If is . + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Gets a value indicating whether this matrix is symmetric. + + + + + A vector with sparse storage, intended for very large vectors where most of the cells are zero. + + The sparse vector is not thread safe. + + + + Create a new sparse vector straight from an initialized vector storage instance. + The storage is used directly without copying. + Intended for advanced scenarios where you're working directly with + storage for performance or interop reasons. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized to zero. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given indexed enumerable. + Keys must be provided at most once, zero is assumed if a key is omitted. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector and initialize each value using the provided init function. + + + + + Create a new sparse vector with the given length. + All cells of the vector will be initialized with the provided value. + Zero-length vectors are not supported. + + If length is less than one. + + + + Create a new sparse vector as a copy of the given other vector. + This new vector will be independent from the other vector. + A new memory block will be allocated for storing the vector. + + + + + Create a new sparse vector as a copy of the given enumerable. + This new vector will be independent from the enumerable. + A new memory block will be allocated for storing the vector. + + + + + Creates a matrix with the given dimensions using the same storage type + as this vector. + + + The number of rows. + + + The number of columns. + + + A matrix with the given dimensions. + + + + + Creates a Vector of the given size using the same storage type + as this vector. + + + The size of the Vector to create. + + + The new Vector. + + + + + Adds a scalar to each element of the vector and stores the result in the result vector. + Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled + sparse vector and very inefficient. Would be better to work with a dense vector instead. + + + The scalar to add. + + + The vector to store the result of the addition. + + + + + Adds another vector to this vector and stores the result into the result vector. + + + The vector to add to this one. + + + The vector to store the result of the addition. + + + + + Subtracts a scalar from each element of the vector and stores the result in the result vector. + + + The scalar to subtract. + + + The vector to store the result of the subtraction. + + + + + Subtracts another vector to this vector and stores the result into the result vector. + + + The vector to subtract from this one. + + + The vector to store the result of the subtraction. + + + + + Negates vector and saves result to + + Target vector + + + + Multiplies a scalar to each element of the vector and stores the result in the result vector. + + + The scalar to multiply. + + + The vector to store the result of the multiplication. + + + + + Computes the dot product between this vector and another vector. + + + The other vector to add. + + s + The result of the addition. + + + + + Computes the modulus for each element of the vector for the given divisor. + + The divisor to use. + A vector to store the results in. + + + + Adds two Vectors together and returns the results. + + One of the vectors to add. + The other vector to add. + The result of the addition. + If and are not the same size. + If or is . + + + + Returns a Vector containing the negated values of . + + The vector to get the values from. + A vector containing the negated values as . + If is . + + + + Subtracts two Vectors and returns the results. + + The vector to subtract from. + The vector to subtract. + The result of the subtraction. + If and are not the same size. + If or is . + + + + Multiplies a vector with a scalar. + + The vector to scale. + The scalar value. + The result of the multiplication. + If is . + + + + Multiplies a vector with a scalar. + + The scalar value. + The vector to scale. + The result of the multiplication. + If is . + + + + Computes the dot product between two Vectors. + + The left row vector. + The right column vector. + The dot product between the two vectors. + If and are not the same size. + If or is . + + + + Divides a vector with a scalar. + + The vector to divide. + The scalar value. + The result of the division. + If is . + + + + Computes the modulus of each element of the vector of the given divisor. + + The vector whose elements we want to compute the modulus of. + The divisor to use, + The result of the calculation + If is . + + + + Returns the index of the absolute minimum element. + + The index of absolute minimum element. + + + + Returns the index of the absolute maximum element. + + The index of absolute maximum element. + + + + Returns the index of the minimum element. + + The index of minimum element. + + + + Computes the sum of the vector's elements. + + The sum of the vector's elements. + + + + Computes the sum of the absolute value of the vector's elements. + + The sum of the absolute value of the vector's elements. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Pointwise multiplies this vector with another vector and stores the result into the result vector. + + The vector to pointwise multiply with this one. + The vector to store the result of the pointwise multiplication. + + + + Outer product of two vectors + + First vector + Second vector + Matrix M[i,j] = u[i]*v[j] + If the u vector is . + If the v vector is . + + + + Outer product of this and another vector. + + The vector to operate on. + + Matrix M[i,j] = this[i] * v[j]. + + + + + Computes the p-Norm. + + The p value. + Scalar ret = (sum(abs(this[i])^p))^(1/p) + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + The string to parse. + + + + + Creates a float sparse vector based on a string. The string can be in the following formats (without the + quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. + + + A float sparse vector containing the values specified by the given string. + + + the string to parse. + + + An that supplies culture-specific formatting information. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Converts the string representation of a real sparse vector to float-precision sparse vector equivalent. + A return value indicates whether the conversion succeeded or failed. + + + A string containing a real vector to convert. + + + An that supplies culture-specific formatting information about value. + + + The parsed value. + + + If the conversion succeeds, the result will contain a complex number equivalent to value. + Otherwise the result will be null. + + + + + Gets the number of non zero elements in the vector. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed, like an off-diagonal field on a diagonal matrix. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given row and column, with range checking. + + + The row of the element. + + + The column of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this matrix can be set to any value. + False if some fields are fixed, like on a diagonal matrix. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Retrieves the requested element without range checking. + + The index of the element. + The requested element. + Not range-checked. + + + + Sets the element without range checking. + + The index of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + True if the specified field can be set to any value. + False if the field is fixed. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets or sets the value at the given index, with range checking. + + + The index of the element. + + The value to get or set. + This method is ranged checked. and + to get and set values without range checking. + + + + True if all fields of this vector can be set to any value. + False if some fields are fixed. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + The array containing the row indices of the existing rows. Element "j" of the array gives the index of the + element in the array that is first non-zero element in a row "j" + + + + + An array containing the column indices of the non-zero values. Element "I" of the array + is the number of the column in matrix that contains the I-th value in the array. + + + + + Array that contains the non-zero elements of matrix. Values of the non-zero elements of matrix are mapped into the values + array using the row-major storage mapping described in a compressed sparse row (CSR) format. + + + + + Gets the number of non zero elements in the matrix. + + The number of non zero elements. + + + + Retrieves the requested element without range checking. + + + The row of the element. + + + The column of the element. + + + The requested element. + + Not range-checked. + + + + Sets the element without range checking. + + The row of the element. + The column of the element. + The value to set the element to. + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. + + + + Delete value from internal storage + + Index of value in nonZeroValues array + Row number of matrix + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Find item Index in nonZeroValues array + + Matrix row index + Matrix column index + Item index + WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Indicates whether the current object is equal to another object of the same type. + + + An object to compare with this object. + + + true if the current object is equal to the parameter; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Array that contains the indices of the non-zero values. + + + + + Array that contains the non-zero elements of the vector. + + + + + Gets the number of non-zero elements in the vector. + + + + + Retrieves the requested element without range checking. + + + + + Sets the element without range checking. + + + + + Calculates the amount with which to grow the storage array's if they need to be + increased in size. + + The amount grown. + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Number theory utility functions for integers. + + + Number theory utility functions for integers. + + + + + Find out whether the provided 32 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 64 bit integer is an even number. + + The number to very whether it's even. + True if and only if it is an even number. + + + + Find out whether the provided 32 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 64 bit integer is an odd number. + + The number to very whether it's odd. + True if and only if it is an odd number. + + + + Find out whether the provided 32 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find out whether the provided 64 bit integer is a perfect power of two. + + The number to very whether it's a power of two. + True if and only if it is a power of two. + + + + Find the closest perfect power of two that is larger or equal to the provided + 32 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Find the closest perfect power of two that is larger or equal to the provided + 64 bit integer. + + The number of which to find the closest upper power of two. + A power of two. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 31). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Raises 2 to the provided integer exponent (0 <= exponent < 63). + + The exponent to raise 2 up to. + 2 ^ exponent. + + + + + Find out whether the provided 32 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Find out whether the provided 64 bit integer is a perfect square, i.e. a square of an integer. + + The number to very whether it's a perfect square. + True if and only if it is a perfect square. + + + + Returns the greatest common divisor (gcd) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Greatest common divisor gcd(a,b) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's + algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Returns the greatest common divisor (gcd) of a set of integers using Euclid's algorithm. + + List of Integers. + Greatest common divisor gcd(list of integers) + + + + Computes the extended greatest common divisor, such that a*x + b*y = gcd(a,b). + + First Integer: a. + Second Integer: b. + Resulting x, such that a*x + b*y = gcd(a,b). + Resulting y, such that a*x + b*y = gcd(a,b) + Greatest common divisor gcd(a,b) + + + long x,y,d; + d = Fn.GreatestCommonDivisor(45,18,out x, out y); + -> d == 9 && x == 1 && y == -2 + + The gcd of 45 and 18 is 9: 18 = 2*9, 45 = 5*9. 9 = 1*45 -2*18, therefore x=1 and y=-2. + + + + + Returns the least common multiple (lcm) of two integers using Euclid's algorithm. + + First Integer: a. + Second Integer: b. + Least common multiple lcm(a,b) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Returns the least common multiple (lcm) of a set of integers using Euclid's algorithm. + + List of Integers. + Least common multiple lcm(list of integers) + + + + Class to represent a permutation for a subset of the natural numbers. + + + + + Entry _indices[i] represents the location to which i is permuted to. + + + + + Initializes a new instance of the Permutation class. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + + + + Computes the inverse of the permutation. + + The inverse of the permutation. + + + + Construct an array from a sequence of inversions. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + The set of inversions to construct the permutation from. + A permutation generated from a sequence of inversions. + + + + Construct a sequence of inversions from the permutation. + + + From wikipedia: the permutation 12043 has the inversions (0,2), (1,2) and (3,4). This would be + encoded using the array [22244]. + + A sequence of inversions. + + + + Checks whether the array represents a proper permutation. + + An array which represents where each integer is permuted too: indices[i] represents that integer i + is permuted to location indices[i]. + True if represents a proper permutation, false otherwise. + + + + Gets the number of elements this permutation is over. + + + + + Computes where permutes too. + + The index to permute from. + The index which is permuted to. + + + + Utilities for working with floating point numbers. + + + + Useful links: + + + http://docs.sun.com/source/806-3568/ncg_goldberg.html#689 - What every computer scientist should know about floating-point arithmetic + + + http://en.wikipedia.org/wiki/Machine_epsilon - Gives the definition of machine epsilon + + + + + + + + The base number for binary values + + + + + The number of binary digits used to represent the binary number for a double precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The number of binary digits used to represent the binary number for a single precision floating + point value. i.e. there are this many digits used to represent the + actual number, where in a number as: 0.134556 * 10^5 the digits are 0.134556 and the exponent is 5. + + + + + The maximum relative precision of a double + + + + + The maximum relative precision of a single + + + + + The number of significant figures that a double-precision floating point has. + + + + + The number of significant figures that a single-precision floating point has. + + + + Value representing 10 * 2^(-52) + + + Value representing 10 * 2^(-52) + + + + Initializes static members of the Precision class. + + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the magnitude of the number. + + The value. + The magnitude of the number. + + + + Returns the number divided by it's magnitude, effectively returning a number between -10 and 10. + + The value. + The value of the number. + + + + Gets the equivalent long value for the given double value. + + The double value which should be turned into a long value. + + The resulting long value. + + + + + Returns a 'directional' long value. This is a long value which acts the same as a double, + e.g. a negative double value will return a negative double value starting at 0 and going + more negative as the double value gets more negative. + + The input double value. + A long value which is roughly the equivalent of the double value. + + + + Returns a 'directional' int value. This is a int value which acts the same as a float, + e.g. a negative float value will return a negative int value starting at 0 and going + more negative as the float value gets more negative. + + The input float value. + An int value which is roughly the equivalent of the double value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Increments a floating point number to the next bigger number representable by the data type. + + The value which needs to be incremented. + How many times the number should be incremented. + + The incrementation step length depends on the provided value. + Increment(double.MaxValue) will return positive infinity. + + The next larger floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Decrements a floating point number to the next smaller number representable by the data type. + + The value which should be decremented. + How many times the number should be decremented. + + The decrementation step length depends on the provided value. + Decrement(double.MinValue) will return negative infinity. + + The next smaller floating point value. + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The maximum count of numbers between the zero and the number . + + Zero if || is fewer than numbers from zero, otherwise. + + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero, according to the specified absolute accuracy. + + The real number to coerce to zero, if it is almost zero. + The absolute threshold for to consider it as zero. + Zero if || is smaller than , otherwise. + + Thrown if is smaller than zero. + + + + + Forces small numbers near zero to zero. + + The real number to coerce to zero, if it is almost zero. + Zero if || is smaller than 2^(-53) = 1.11e-16, otherwise. + + + + Determines the range of floating point numbers that will match the specified value with the given tolerance. + + The value. + The ulps difference. + The bottom range end. + The top range end. + + Thrown if is smaller than zero. + + + + + Returns the floating point number that will match the value with the tolerance on the maximum size (i.e. the result is + always bigger than the value) + + The value. + The ulps difference. + The maximum floating point number which is larger than the given . + + + + Returns the floating point number that will match the value with the tolerance on the minimum size (i.e. the result is + always smaller than the value) + + The value. + The ulps difference. + The minimum floating point number which is smaller than the given . + + + + Determines the range of ulps that will match the specified value with the given tolerance. + + The value. + The relative difference. + The number of ULPS between the value and the value - relativeDifference. + The number of ULPS between the value and the value + relativeDifference. + + Thrown if is smaller than zero. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Evaluates the count of numbers between two double numbers + + The first parameter. + The second parameter. + The second number is included in the number, thus two equal numbers evaluate to zero and two neighbor numbers evaluate to one. Therefore, what is returned is actually the count of numbers between plus 1. + The number of floating point values between and . + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + Thrown if is double.PositiveInfinity or double.NegativeInfinity. + + + Thrown if is double.NaN. + + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two real numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two Compex numbers are almost equal. + + The first number + The second number + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Checks whether two structures with precision support are almost equal. + + The type of the structures. Must implement . + The first structure + The second structure + true if the two values differ by no more than 10 * 2^(-52); false otherwise. + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two complex and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both complex are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within + the specified maximum error. + + The first value. + The second value. + The accuracy required for being almost equal. + + if both doubles are almost equal up to the + specified maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two lists of doubles and determines if they are equal within the + specified maximum error. + + The first value list. + The second value list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two structure with precision support and determines if they are equal + within the specified maximum relative error. + + + The type of the structures. Must implement . + + The first structure. + The second structure. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two lists of structures with precision support and determines if they + are equal within the specified maximum error. + + + The type of the structures. Must implement . + + The first structure list. + The second structure list. + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum absolute error. + + The first value. + The second value. + + The difference of the two values (according to some norm). + + + The absolute accuracy required for being almost equal. + + + if both doubles are almost equal up to the specified + maximum absolute error, otherwise. + + + + + Compares two doubles and determines if they are equal within the specified + maximum relative error. + + The first value. + The second value. + The difference of the two values (according to some norm). + + The relative accuracy required for being + almost equal. + + if both doubles are almost equal up to the specified + maximum relative error, otherwise. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. If the numbers + are very close to zero an absolute difference is compared, otherwise the relative difference is compared. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + Thrown if is smaller than zero. + + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both doubles are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two floats and determines if they are equal to within the specified number of decimal places or not, using the + number of decimal places as an absolute measure. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + if both floats are equal to each other within the specified number of decimal places; otherwise . + + + + Compares two doubles and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + + + Determines the 'number' of floating point numbers between two values (i.e. the number of discrete steps + between the two numbers) and then checks if that is within the specified tolerance. So if a tolerance + of 1 is passed then the result will be true only if the two numbers have the same binary representation + OR if they are two adjacent numbers that only differ by one step. + + + The comparison method used is explained in http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm . The article + at http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx explains how to transform the C code to + .NET enabled code without using pointers and unsafe code. + + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both doubles are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two floats and determines if they are equal to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values between the two values. Must be 1 or larger. + if both floats are equal to each other within the specified tolerance; otherwise . + + Thrown if is smaller than one. + + + + + Compares two doubles and determines if the first value is larger than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is larger than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of the numbers, e.g. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is larger than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the tolerance or not. Equality comparison is based on the binary representation. + + The first value. + The second value. + The maximum number of floating point values for which the two values are considered equal. Must be 1 or larger. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two floats and determines if the first value is smaller than the second + value to within the specified number of decimal places or not. + + + + The values are equal if the difference between the two numbers is smaller than 10^(-numberOfDecimalPlaces). We divide by + two so that we have half the range on each side of thg. if == 2, then 0.01 will equal between + 0.005 and 0.015, but not 0.02 and not 0.00 + + + The first value. + The second value. + The number of decimal places. + true if the first value is smaller than the second value; otherwise false. + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The maximum error in terms of Units in Last Place (ulps), i.e. the maximum number of decimals that may be different. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than the tolerance. + + + 0 + is equal to within the tolerance. + + + 1 + is bigger than by more than the tolerance. + + + + + + + Compares two doubles and determines which double is bigger. + + The first value. + The second value. + The number of decimal places on which the values must be compared. Must be 1 or larger. + + + + Return value + Meaning + + + -1 + is smaller than by more than a magnitude equal to . + + + 0 + is equal to within a magnitude equal to . + + + 1 + is bigger than by more than a magnitude equal to . + + + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + + Relative Epsilon (positive double or NaN). + + Evaluates the negative epsilon. The more common positive epsilon is equal to two times this negative epsilon. + + + + + Evaluates the minimum distance to the next distinguishable number near the argument value. + + The value used to determine the minimum distance. + Relative Epsilon (positive double or NaN) + Evaluates the positive epsilon. See also + + + + + Converts a float valut to a bit array stored in an int. + + The value to convert. + The bit array. + + + + Gets the maximum relative precision of a double. + + The maximum relative precision of a double. + + + + Gets the maximum relative precision of a single. + + The maximum relative precision of a single. + + + + Gets the number of decimal places for floats. + + The number of decimal places for floats. + + + + Gets the number of decimal places for doubles. + + The number of decimal places for doubles. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The array arguments must have the same length.. + + + + + Looks up a localized string similar to The given array is the wrong length. Should be {0}.. + + + + + Looks up a localized string similar to The argument must be between 0 and 1.. + + + + + Looks up a localized string similar to Value cannot be in the range -1 < x < 1.. + + + + + Looks up a localized string similar to Value must be even.. + + + + + Looks up a localized string similar to The histogram does not contains the value.. + + + + + Looks up a localized string similar to Value is expected to be between {0} and {1} (including {0} and {1}).. + + + + + Looks up a localized string similar to At least one item of {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be greater than or equal to one.. + + + + + Looks up a localized string similar to han the given upper bound.. + + + + + Looks up a localized string similar to Matrix dimensions must agree.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: {0}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}.. + + + + + Looks up a localized string similar to Matrix dimensions must agree: op1 is {0}, op2 is {1}, op3 is {2}.. + + + + + Looks up a localized string similar to The requested matrix does not exist.. + + + + + Looks up a localized string similar to The matrix indices must not be out of range of the given matrix.. + + + + + Looks up a localized string similar to Matrix must not be rank deficient.. + + + + + Looks up a localized string similar to Matrix must not be singular.. + + + + + Looks up a localized string similar to Matrix must be positive definite.. + + + + + Looks up a localized string similar to Matrix column dimensions must agree.. + + + + + Looks up a localized string similar to Matrix row dimensions must agree.. + + + + + Looks up a localized string similar to Matrix must have exactly one column.. + + + + + Looks up a localized string similar to Matrix must have exactly one column and row, thus have only one cell.. + + + + + Looks up a localized string similar to Matrix must have exactly one row.. + + + + + Looks up a localized string similar to Matrix must be square.. + + + + + Looks up a localized string similar to Matrix must be symmetric.. + + + + + Looks up a localized string similar to Matrix must be symmetric positive definite.. + + + + + Looks up a localized string similar to In the specified range, the minimum is greater than maximum.. + + + + + Looks up a localized string similar to Value must be positive.. + + + + + Looks up a localized string similar to Value must neither be infinite nor NaN.. + + + + + Looks up a localized string similar to Value must not be negative (zero is ok).. + + + + + Looks up a localized string similar to {0} is a null reference (Nothing in Visual Basic).. + + + + + Looks up a localized string similar to Value must be odd.. + + + + + Looks up a localized string similar to {0} must be greater than {1}.. + + + + + Looks up a localized string similar to {0} must be greater than or equal to {1}.. + + + + + Looks up a localized string similar to The chosen parameter set is invalid (probably some value is out of range).. + + + + + Looks up a localized string similar to The given expression does not represent a complex number.. + + + + + Looks up a localized string similar to Value must be positive (and not zero).. + + + + + Looks up a localized string similar to Size must be a Power of Two.. + + + + + Looks up a localized string similar to Size must be a Power of Two in every dimension.. + + + + + Looks up a localized string similar to The range between {0} and {1} must be less than or equal to {2}.. + + + + + Looks up a localized string similar to Arguments must be different objects.. + + + + + Looks up a localized string similar to Array must have exactly one dimension (and not be null).. + + + + + Looks up a localized string similar to Value is too large.. + + + + + Looks up a localized string similar to Value is too large for the current iteration limit.. + + + + + Looks up a localized string similar to Type mismatch.. + + + + + Looks up a localized string similar to Array length must be a multiple of {0}.. + + + + + Looks up a localized string similar to All vectors must have the same dimensionality.. + + + + + Looks up a localized string similar to The vector must have 3 dimensions.. + + + + + Looks up a localized string similar to The given array is too small. It must be at least {0} long.. + + + + + Looks up a localized string similar to Big endian files are not supported.. + + + + + Looks up a localized string similar to The supplied collection is empty.. + + + + + Looks up a localized string similar to Complex matrices are not supported.. + + + + + Looks up a localized string similar to An algorithm failed to converge.. + + + + + Looks up a localized string similar to This feature is not implemented yet (but is planned).. + + + + + Looks up a localized string similar to The given file doesn't exist.. + + + + + Looks up a localized string similar to Sample points should be sorted in strictly ascending order. + + + + + Looks up a localized string similar to All sample points should be unique.. + + + + + Looks up a localized string similar to Invalid parameterization for the distribution.. + + + + + Looks up a localized string similar to Invalid Left Boundary Condition.. + + + + + Looks up a localized string similar to The operation could not be performed because the accumulator is empty.. + + + + + Looks up a localized string similar to The operation could not be performed because the histogram is empty.. + + + + + Looks up a localized string similar to Not enough points in the distribution.. + + + + + Looks up a localized string similar to No Samples Provided. Preparation Required.. + + + + + Looks up a localized string similar to Invalid Right Boundary Condition.. + + + + + Looks up a localized string similar to ddd MMM dd HH:mm:ss yyyy. + + + + + Looks up a localized string similar to The number of columns of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows of a matrix must be positive.. + + + + + Looks up a localized string similar to The number of rows or columns of a matrix must be positive.. + + + + + Looks up a localized string similar to Only 1 and 2 dimensional arrays are supported.. + + + + + Looks up a localized string similar to Data must contain at least {0} values.. + + + + + Looks up a localized string similar to Name cannot contain a space. name: {0}. + + + + + Looks up a localized string similar to {0} is not a supported type.. + + + + + Looks up a localized string similar to The two arguments can't be compared (maybe they are part of a partial ordering?). + + + + + Looks up a localized string similar to The integer array does not represent a valid permutation.. + + + + + Looks up a localized string similar to The sampler's proposal distribution is not upper bounding the target density.. + + + + + Looks up a localized string similar to The number of rows must greater than or equal to the number of columns.. + + + + + Looks up a localized string similar to The singular vectors were not computed.. + + + + + Looks up a localized string similar to This special case is not supported yet (but is planned).. + + + + + Looks up a localized string similar to The given stop criterium already exist in the collection.. + + + + + Looks up a localized string similar to There is no stop criterium in the collection.. + + + + + Looks up a localized string similar to String parameter cannot be empty or null.. + + + + + Looks up a localized string similar to We only support sparse matrix with less than int.MaxValue elements.. + + + + + Looks up a localized string similar to The moment of the distribution is undefined.. + + + + + Looks up a localized string similar to A user defined provider has not been specified.. + + + + + Looks up a localized string similar to The given work array is too small. Check work[0] for the corret size.. + + + + + Abstract class for random number generators. This class introduces a layer between + and the Math.Net Numerics random number generators to provide thread safety. + + + + + The method that actually generates samples. + + + + + The object that will be locked for thread safety. + + + + + Initializes a new instance of the class using + the value of to set whether + the instance is thread safe or not. + + + + + Initializes a new instance of the class. + + if set to true , the class is thread safe. + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns an array of uniformly distributed random doubles in the interval [0.0,1.0]. + + The size of the array. + + An array of uniformly distributed random doubles in the interval [0.0,1.0]. + + if n is not greater than 0. + + + + Returns a nonnegative random number. + + + A 32-bit signed integer greater than or equal to zero and less than . + + + + + Returns a random number less then a specified maximum. + + The exclusive upper bound of the random number returned. + A 32-bit signed integer less than . + is negative. + + + + Returns a random number within a specified range. + + The inclusive lower bound of the random number returned. + The exclusive upper bound of the random number returned. must be greater than or equal to . + + A 32-bit signed integer greater than or equal to and less than ; that is, the range of return values includes but not . If equals , is returned. + + is greater than . + + + + Fills the elements of a specified array of bytes with random numbers. + + An array of bytes to contain random numbers. + is null. + + + + Returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + Thread safe version of which returns a random number between 0.0 and 1.0. + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0 + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + A delegate type that represents a method that generates random numbers. + + Randomly distributed numbers. + + + + Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13. + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Random number generator using Mersenne Twister 19937 algorithm. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Mersenne twister constant. + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + Uses the value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + A 32-bit combined multiple recursive generator with 2 components of order 3. + + Based off of P. L'Ecuyer, "Combined Multiple Recursive Random Number Generators," Operations Research, 44, 5 (1996), 816--822. + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Represents a Parallel Additive Lagged Fibonacci pseudo-random number generator. + + + The type bases upon the implementation in the + Boost Random Number Library. + It uses the modulus 232 and by default the "lags" 418 and 1279. Some popular pairs are presented on + Wikipedia - Lagged Fibonacci generator. + + + + + Default value for the ShortLag + + + + + Default value for the LongLag + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The ShortLag value + TheLongLag value + + + + Stores an array of random numbers + + + + + Stores an index for the random number array element that will be accessed next. + + + + + Fills the array with new unsigned random numbers. + + + Generated random numbers are 32-bit unsigned integers greater than or equal to 0 + and less than or equal to . + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Gets the short lag of the Lagged Fibonacci pseudo-random number generator. + + + + + Gets the long lag of the Lagged Fibonacci pseudo-random number generator. + + + + + This class implements extension methods for the System.Random class. The extension methods generate + pseudo-random distributed numbers for types other than double and int32. + + + + + Returns a nonnegative random number less than . + + + The random object to extend. + + + A 64-bit signed integer greater than or equal to 0, and less than ; that is, + the range of return values includes 0 but not . + + + + + + Returns a random number of the full Int32 range. + + + The random object to extend. + + + A 32-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a random number of the full Int64 range. + + + The random object to extend. + + + A 64-bit signed integer of the full range, including 0, negative numbers, + and . + + + + + + Returns a nonnegative decimal floating point random number less than 1.0. + + + The random object to extend. + + + A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, + the range of return values includes 0.0 but not 1.0. + + + + + Wichmann-Hill’s 1982 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (1982), "Algorithm AS 183: + An efficient and portable pseudo-random number generator". Applied Statistics 31 (1982) 188-190 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Wichmann-Hill’s 2006 combined multiplicative congruential generator. + + See: Wichmann, B. A. & Hill, I. D. (2006), "Generating good pseudo-random numbers". + Computational Statistics & Data Analysis 51:3 (2006) 1614-1622 + + + + + Initializes a new instance of the class using + the current time as the seed. + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + + + + Initializes a new instance of the class. + + The seed value. + The seed is set to 1, if the zero is used as the seed. + if set to true , the class is thread safe. + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Implements a multiply-with-carry Xorshift pseudo random number generator (RNG) specified in Marsaglia, George. (2003). Xorshift RNGs. + Xn = a * Xn−3 + c mod 2^32 + http://www.jstatsoft.org/v08/i14/paper + + + + + The default value for X1. + + + + + The default value for X2. + + + + + The default value for the multiplier. + + + + + The default value for the carry over. + + + + + The multiplier to compute a double-precision floating point number [0, 1) + + + + + Initializes a new instance of the class using + the current time as the seed. + + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Note: must be less than . + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class using + the current time as the seed. + + if set to true , the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + If the seed value is zero, it is set to one. Uses the + value of to + set whether the instance is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + + Uses the default values of: + + a = 916905990 + c = 13579 + X1 = 77465321 + X2 = 362436069 + + + + + Initializes a new instance of the class. + + The seed value. + if set to true, the class is thread safe. + The multiply value + The initial carry value. + The initial value if X1. + The initial value if X2. + must be less than . + + + + Seed or last but three unsigned random number. + + + + + Last but two unsigned random number. + + + + + Last but one unsigned random number. + + + + + The value of the carry over. + + + + + The multiplier. + + + + + Returns a random number between 0.0 and 1.0. + + + A double-precision floating point number greater than or equal to 0.0, and less than 1.0. + + + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + Generic Function Sampling and Quantization Provider + + + + + Samples a function at the roots of the Chebyshev polynomial of the first kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*(2i-1)/(2n)) + + + + + + Samples a function at the roots of the Chebyshev polynomial of the second kind. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + Vector of the function sampled in [a,b] at (b+a)/2+(b-1)/2*cos(pi*i/(n-1)) + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant within the provided interval. + + The real-domain function to sample. + The real domain interval begin where to start sampling. + The real domain interval end where to stop sampling. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a periodic function equidistant within one period, but omits the last sample such that the sequence + can be concatenated together. + + The real-domain function to sample. + The real domain full period length. + The real domain offset where to start the sampling period. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function equidistant continuously starting from the provided location with a fixed step length. + + The real-domain function to sample. + The real domain location offset where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated sample enumerator. + + + + + Samples a function equidistant with the provided start and step length to an integer-domain function + + The real-domain function to sample. + The real domain location where to start sampling. + The real domain step length between the equidistant samples. + The value type of the function to sample. + The generated samples integer-domain function. + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The real domain points where the samples are taken at. + The value type of the function to sample. + The generated sample vector. + + + + + + Samples a two-domain function randomly with the provided distribution. + + The real-domain function to sample. + Random distribution of the real domain sample points. + The number of samples to generate. + The value type of the function to sample. + The generated sample vector. + + + + + + Sorting algorithms for single, tuple and triple lists. + + + + + Sort a list of keys, in place using the quick sort algorithm. + + The type of elements stored in the list. + List to sort. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the item list. + List to sort. + List to permute the same way as the key list. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements stored in the key list. + The type of elements stored in the first item list. + The type of elements stored in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + + + + Sort a list of keys, in place using the quick sort algorithm using the quick sort algorithm. + + The type of elements in the key list. + List to sort. + Comparison, defining the sort order. + + + + Sort a list of keys and items with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the item list. + List to sort. + List to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a list of keys, items1 and items2 with respect to the keys, in place using the quick sort algorithm. + + The type of elements in the key list. + The type of elements in the first item list. + The type of elements in the second item list. + List to sort. + First list to permute the same way as the key list. + Second list to permute the same way as the key list. + Comparison, defining the sort order. + + + + Sort a range of a list of keys, in place using the quick sort algorithm. + + The type of element in the list. + List to sort. + The zero-based starting index of the range to sort. + The length of the range to sort. + Comparison, defining the sort order. + + + + Recursive implementation for an in place quick sort on a list. + + The type of the list on which the quick sort is performed. + The list which is sorted using quick sort. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on a list while reordering one other list accordingly. + + The type of the list on which the quick sort is performed. + The type of the list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Recursive implementation for an in place quick sort on one list while reordering two other lists accordingly. + + The type of the list on which the quick sort is performed. + The type of the first list which is automatically reordered accordingly. + The type of the second list which is automatically reordered accordingly. + The list which is sorted using quick sort. + The first list which is automatically reordered accordingly. + The second list which is automatically reordered accordingly. + The method with which to compare two elements of the quick sort. + The left boundary of the quick sort. + The right boundary of the quick sort. + + + + Performs an in place swap of two elements in a list. + + The type of elements stored in the list. + The list in which the elements are stored. + The index of the first element of the swap. + The index of the second element of the swap. + + + + This partial implementation of the SpecialFunctions class contains all methods related to the error function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the harmonic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the logistic function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + This partial implementation of the SpecialFunctions class contains all methods related to the modified bessel function. + + + + + The order of the approximation. + + + + + Auxiliary variable when evaluating the function. + + + + + Computes the logarithm of the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The logarithm of the Euler Beta function evaluated at z,w. + If or are not positive. + + + + Computes the Euler Beta function. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The Euler Beta function evaluated at z,w. + If or are not positive. + + + + Returns the lower incomplete (unregularized) beta function + I_x(a,b) = int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The lower incomplete (unregularized) beta function. + + + + Returns the regularized lower incomplete beta function + I_x(a,b) = 1/Beta(a,b) * int(t^(a-1)*(1-t)^(b-1),t=0..x) for real a > 0, b > 0, 1 >= x >= 0. + + The first Beta parameter, a positive real number. + The second Beta parameter, a positive real number. + The upper limit of the integral. + The regularized lower incomplete beta function. + + + Calculates the error function. + The value to evaluate. + the error function evaluated at given value. + + + returns 1 if x == Double.PositiveInfinity. + returns -1 if x == Double.NegativeInfinity. + + + + + Calculates the complementary error function. + The value to evaluate. + the complementary error function evaluated at given value. + + + returns 0 if x == Double.PositiveInfinity. + returns 2 if x == Double.NegativeInfinity. + + + + + Calculates the inverse error function evaluated at z. + The inverse error function evaluated at given value. + + + returns Double.PositiveInfinity if z >= 1.0. + returns Double.NegativeInfinity if z <= -1.0. + + + Calculates the inverse error function evaluated at z. + value to evaluate. + the inverse error function evaluated at Z. + + + + Implementation of the error function. + + Where to evaluate the error function. + Whether to compute 1 - the error function. + the error function. + + + Calculates the complementary inverse error function evaluated at z. + The complementary inverse error function evaluated at given value. + We have tested this implementation against the arbitrary precision mpmath library + and found cases where we can only guarantee 9 significant figures correct. + + returns Double.PositiveInfinity if z <= 0.0. + returns Double.NegativeInfinity if z >= 2.0. + + + calculates the complementary inverse error function evaluated at z. + value to evaluate. + the complementary inverse error function evaluated at Z. + + + + The implementation of the inverse error function. + + First intermediate parameter. + Second intermediate parameter. + Third intermediate parameter. + the inverse error function. + + + + Initializes static members of the SpecialFunctions class. + + + + + Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up + to 22! exactly, all numbers up to 170! using a double representation. All larger values will overflow. + + A value value! for value > 0 + + If you need to multiply or divide various such factorials, consider using the logarithmic version + instead so you can add instead of multiply and subtract instead of divide, and + then exponentiate the result using . This will also circumvent the problem that + factorials become very large even for small parameters. + + + + + + Computes the logarithmic factorial function x -> ln(x!) of an integer number > 0. + + A value value! for value > 0 + + + + Computes the binomial coefficient: n choose k. + + A nonnegative value n. + A nonnegative value h. + The binomial coefficient: n choose k. + + + + Computes the natural logarithm of the binomial coefficient: ln(n choose k). + + A nonnegative value n. + A nonnegative value h. + The logarithmic binomial coefficient: ln(n choose k). + + + + Computes the multinomial coefficient: n choose n1, n2, n3, ... + + A nonnegative value n. + An array of nonnegative values that sum to . + The multinomial coefficient. + if is . + If or any of the are negative. + If the sum of all is not equal to . + + + + Polynomial coefficients for the approximation. + + + + + Computes the logarithm of the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which achieves an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + Our unit tests suggest that the accuracy of the Gamma function is correct up to 14 floating point digits. + + + + + Computes the Gamma function. + + The argument of the gamma function. + The logarithm of the gamma function. + + + This implementation of the computation of the gamma and logarithm of the gamma function follows the derivation in + "An Analysis Of The Lanczos Gamma Approximation", Glendon Ralph Pugh, 2004. + We use the implementation listed on p. 116 which should achieve an accuracy of 16 floating point digits. Although 16 digit accuracy + should be sufficient for double values, improving accuracy is possible (see p. 126 in Pugh). + + Our unit tests suggest that the accuracy of the Gamma function is correct up to 13 floating point digits. + + + + + Returns the upper incomplete regularized gamma function + Q(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete regularized gamma function. + + + + Returns the upper incomplete gamma function + Gamma(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The lower integral limit. + The upper incomplete gamma function. + + + + Returns the lower incomplete gamma function + gamma(a,x) = int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Returns the lower incomplete regularized gamma function + P(a,x) = 1/Gamma(a) * int(exp(-t)t^(a-1),t=0..x) for real a > 0, x > 0. + + The argument for the gamma function. + The upper integral limit. + The lower incomplete gamma function. + + + + Computes the Digamma function which is mathematically defined as the derivative of the logarithm of the gamma function. + This implementation is based on + Jose Bernardo + Algorithm AS 103: + Psi ( Digamma ) Function, + Applied Statistics, + Volume 25, Number 3, 1976, pages 315-317. + Using the modifications as in Tom Minka's lightspeed toolbox. + + The argument of the digamma function. + The value of the DiGamma function at . + + + + Computes the inverse Digamma function: this is the inverse of the logarithm of the gamma function. This function will + only return solutions that are positive. + This implementation is based on the bisection method. + + The argument of the inverse digamma function. + The positive solution to the inverse DiGamma function at . + + + + Computes the 'th Harmonic number. + + The Harmonic number which needs to be computed. + The t'th Harmonic number. + + + + Compute the generalized harmonic number of order n of m. (1 + 1/2^m + 1/3^m + ... + 1/n^m) + + The order parameter. + The power parameter. + General Harmonic number. + + + + Computes the logistic function. see: http://en.wikipedia.org/wiki/Logistic + + The parameter for which to compute the logistic function. + The logistic function of . + + + + Computes the logit function, the inverse of the sigmoid logistic function. see: http://en.wikipedia.org/wiki/Logit + + The parameter for which to compute the logit function. This number should be + between 0 and 1. + The logarithm of divided by 1.0 - . + + + + ************************************** + COEFFICIENTS FOR METHODS bessi0 * + ************************************** + + Chebyshev coefficients for exp(-x) I0(x) + in the interval [0, 8]. + + lim(x->0){ exp(-x) I0(x) } = 1. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I0(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessi1 * + ************************************** + + Chebyshev coefficients for exp(-x) I1(x) / x + in the interval [0, 8]. + + lim(x->0){ exp(-x) I1(x) / x } = 1/2. + + + + Chebyshev coefficients for exp(-x) sqrt(x) I1(x) + in the inverted interval [8, infinity]. + + lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk0, bessk0e * + ************************************** + + Chebyshev coefficients for K0(x) + log(x/2) I0(x) + in the interval [0, 2]. The odd order coefficients are all + zero; only the even order coefficients are listed. + + lim(x->0){ K0(x) + log(x/2) I0(x) } = -EUL. + + + + Chebyshev coefficients for exp(x) sqrt(x) K0(x) + in the inverted interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K0(x) } = sqrt(pi/2). + + + + + ************************************** + COEFFICIENTS FOR METHODS bessk1, bessk1e * + ************************************** + + Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) + in the interval [0, 2]. + + lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. + + + + Chebyshev coefficients for exp(x) sqrt(x) K1(x) + in the interval [2, infinity]. + + lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). + + + + Returns the modified Bessel function of first kind, order 0 of the argument. +

+ The function is defined as i0(x) = j0( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of first kind, + order 1 of the argument. +

+ The function is defined as i1(x) = -i j1( ix ). +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the modified Bessel function of the second kind + of order 0 of the argument. +

+ The range is partitioned into the two intervals [0, 8] and + (8, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 0 of the argument. + + The value to compute the bessel function of. + + + + Returns the modified Bessel function of the second kind + of order 1 of the argument. +

+ The range is partitioned into the two intervals [0, 2] and + (2, infinity). Chebyshev polynomial expansions are employed + in each interval. +

+ The value to compute the bessel function of. + +
+ + Returns the exponentially scaled modified Bessel function + of the second kind of order 1 of the argument. +

+ k1e(x) = exp(x) * k1(x). +

+ The value to compute the bessel function of. + +
+ + + Returns the modified Struve function of order 0. + + The value to compute the function of. + + + + + Returns the modified Struve function of order 1. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I0 and Struve L0 functions. + + The value to compute the function of. + + + + + Returns the difference between the Bessel I1 and Struve L1 functions. + + The value to compute the function of. + + + + + Numerically stable exponential minus one, i.e. x -> exp(x)-1 + + A number specifying a power. + Returns exp(power)-1. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Numerically stable hypotenuse of a right angle triangle, i.e. (a,b) -> sqrt(a^2 + b^2) + + The length of side a of the triangle. + The length of side b of the triangle. + Returns sqrt(a2 + b2) without underflow/overflow. + + + + Evaluation functions, useful for function approximation. + + + + + Evaluate polynomials. + + The coefficients of the polynomial. + The location where to evaluate the polynomial at. + the evaluation of the polynomial. + + + + Numerically stable series summation + + provides the summands sequentially + Sum + + + Evaluates the series of Chebyshev polynomials Ti at argument x/2. + The series is given by +
+                  N-1
+                   - '
+            y  =   >   coef[i] T (x/2)
+                   -            i
+                  i=0
+            
+ Coefficients are stored in reverse order, i.e. the zero + order term is last in the array. Note N is the number of + coefficients, not the order. +

+ If coefficients are for the interval a to b, x must + have been transformed to x -> 2(2x - b - a)/(b-a) before + entering the routine. This maps x from (a, b) to (-1, 1), + over which the Chebyshev polynomials are defined. +

+ If the coefficients are for the inverted interval, in + which (a, b) is mapped to (1/b, 1/a), the transformation + required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity, + this becomes x -> 4a/x - 1. +

+ SPEED: +

+ Taking advantage of the recurrence properties of the + Chebyshev polynomials, the routine requires one more + addition per loop than evaluating a nested polynomial of + the same degree. +

+ The coefficients of the polynomial. + Argument to the polynomial. + + Reference: https://bpm2.svn.codeplex.com/svn/Common.Numeric/Arithmetic.cs +

+ Marked as Deprecated in + http://people.apache.org/~isabel/mahout_site/mahout-matrix/apidocs/org/apache/mahout/jet/math/Arithmetic.html + + + +

+ Summation of Chebyshev polynomials, using the Clenshaw method with Reinsch modification. + + The no. of terms in the sequence. + The coefficients of the Chebyshev series, length n+1. + The value at which the series is to be evaluated. + + ORIGINAL AUTHOR: + Dr. Allan J. MacLeod; Dept. of Mathematics and Statistics, University of Paisley; High St., PAISLEY, SCOTLAND + REFERENCES: + "An error analysis of the modified Clenshaw method for evaluating Chebyshev and Fourier series" + J. Oliver, J.I.M.A., vol. 20, 1977, pp379-391 + +
+ + + Statistics operating on arrays assumed to be unsorted. + WARNING: Methods with the Inplace-suffix may modify the data array by reordering its entries. + + + + + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the smallest value from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the unsorted data array. + Returns NaN if data is empty or any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as unsorted array. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as unsorted array. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample array, no sorting is assumed. + + + + Returns the order statistic (order 1..N) from the unsorted data array. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the p-Percentile value from the unsorted data array. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the third quartile value from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the inter-quartile range from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the unsorted data array. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + + + + Estimates the tau-th quantile from the unsorted data array. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + WARNING: Works inplace and can thus causes the data array to be reordered. + + Sample array, no sorting is assumed. Will be reordered. + Quantile selector, between 0.0 and 1.0 (inclusive) + Quantile definition, to choose what product/definition it should be consistent with + + + + A class with correlation measures between two datasets. + + + + + Computes the Pearson product-moment correlation coefficient. + + Sample data A. + Sample data B. + The Pearson product-moment correlation coefficient. + + + + Computes the basic statistics of data set. The class meets the + NIST standard of accuracy for mean, variance, and standard deviation + (the only statistics they provide exact values for) and exceeds them + in increased accuracy mode. + + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Initializes a new instance of the class. + + The sample data. + + If set to true, increased accuracy mode used. + Increased accuracy mode uses types for internal calculations. + + + Don't use increased accuracy for data sets containing large values (in absolute value). + This may cause the calculations to overflow. + + + + + Computes descriptive statistics from a stream of data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of data values using high accuracy. + + A sequence of datapoints. + + + + Computes descriptive statistics from a stream of nullable data values using high accuracy. + + A sequence of datapoints. + + + + Internal use. Method use for setting the statistics. + + For setting Mean. + For setting Variance. + For setting Skewness. + For setting Kurtosis. + For setting Minimum. + For setting Maximum. + For setting Count. + + + + Gets the size of the sample. + + The size of the sample. + + + + Gets the sample mean. + + The sample mean. + + + + Gets the unbiased population variance estimator (on a dataset of size N will use an N-1 normalizer). + + The sample variance. + + + + Gets the unbiased population standard deviation (on a dataset of size N will use an N-1 normalizer). + + The sample standard deviation. + + + + Gets the sample skewness. + + The sample skewness. + Returns zero if is less than three. + + + + Gets the sample median. + + The sample median. + + + + Gets the sample kurtosis. + + The sample kurtosis. + Returns zero if is less than four. + + + + Gets the maximum sample value. + + The maximum sample value. + + + + Gets the minimum sample value. + + The minimum sample value. + + + + A consists of a series of s, + each representing a region limited by a lower bound (exclusive) and an upper bound (inclusive). + + + + + Initializes a new instance of the Bucket class. + + + + + Initializes a new instance of the Bucket class. + + + + + Creates a copy of the Bucket with the lowerbound, upperbound and counts exactly equal. + + A cloned Bucket object. + + + + This method check whether a point is contained within this bucket. + + The point to check. + 0 if the point falls within the bucket boundaries; -1 if the point is + smaller than the bucket, +1 if the point is larger than the bucket. + + + + Comparison of two disjoint buckets. The buckets cannot be overlapping. + + + + + Checks whether two Buckets are equal; this method tolerates a difference in lowerbound, upperbound + and count given by . + + + + + Provides a hash code for this bucket. + + + + + Formats a human-readable string for this bucket. + + + + + + Lower Bound of the Bucket. + + + + + Upper Bound of the Bucket. + + + + + The number of datapoints in the bucket. + + + + + Width of the Bucket. + + + + + Default comparer. + + + + + This IComparer performs comparisons between a point and a bucket. + + + + + Compares a point and a bucket. The point will be encapsulated in a bucket with width 0. + + The first bucket to compare. + The second bucket to compare. + -1 when the point is less than this bucket, 0 when it is in this bucket and 1 otherwise. + + + + A class which computes histograms of data. + + + + + Contains all the Buckets of the Histogram. + + + + + Indicates whether the elements of buckets are currently sorted. + + + + + Initializes a new instance of the Histogram class. + + + + + Constructs a Histogram with a specific number of equally sized buckets. The upper and lower bound of the histogram + will be set to the smallest and largest datapoint. + + The datasequence to build a histogram on. + The number of buckets to use. + + + + Constructs a Histogram with a specific number of equally sized buckets. + + The datasequence to build a histogram on. + The number of buckets to use. + The histogram lower bound. + The histogram upper bound. + + + + Add one data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The datapoint which we want to add. + + + + Add a sequence of data point to the histogram. If the datapoint falls outside the range of the histogram, + the lowerbound or upperbound will automatically adapt. + + The sequence of datapoints which we want to add. + + + + Adds a Bucket to the Histogram. + + + + + Sort the buckets if needed. + + + + + Returns the Bucket that contains the value v. + + The point to search the bucket for. + A copy of the bucket containing point . + + + + Returns the index in the Histogram of the Bucket + that contains the value v. + + The point to search the bucket index for. + The index of the bucket containing the point. + + + + Prints the buckets contained in the . + + + + + Returns the lower bound of the histogram. + + + + + Returns the upper bound of the histogram. + + + + + Gets the n'th bucket. + + The index of the bucket to be returned. + A copy of the n'th bucket. + + + + Gets the number of buckets. + + + + + Gets the total number of datapoints in the histogram. + + + + + A hybrid Monte Carlo sampler for multivariate distributions. + + + + + The Hybrid (also called Hamiltonian) Monte Carlo produces samples from distribition P using a set + of Hamiltonian equations to guide the sampling process. It uses the negative of the log density as + a potential energy, and a randomly generated momentum to set up a Hamiltonian system, which is then used + to sample the distribution. This can result in a faster convergence than the random walk Metropolis sampler + (). + + The type of samples this sampler produces. + + + + The interface which every sampler must implement. + + The type of samples this sampler produces. + + + + The random number generator for this class. + + + + + Keeps track of the number of accepted samples. + + + + + Keeps track of the number of calls to the proposal sampler. + + + + + Initializes a new instance of the class. + + Thread safe instances are two and half times slower than non-thread + safe classes. + + + + Returns one sample. + + + + + Returns a number of samples. + + The number of samples we want. + An array of samples. + + + + Gets or sets the random number generator. + + When the random number generator is null. + + + + Gets the acceptance rate of the sampler. + + + + + Evaluates the energy function of the target distribution. + + + + + The current location of the sampler. + + + + + The number of burn iterations between two samples. + + + + + The size of each step in the Hamiltonian equation. + + + + + The number of iterations in the Hamiltonian equation. + + + + + The algorithm used for differentiation. + + + + + Constructs a new Hybrid Monte Carlo sampler. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + Random number generator used for sampling the momentum. + The method used for differentiation. + When the number of burnInterval iteration is negative. + When either x0, pdfLnP or diff is null. + + + + Returns a sample from the distribution P. + + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Method used to update the sample location. Used in the end of the loop. + + The old energy. + The old gradient/derivative of the energy. + The new sample. + The new gradient/derivative of the energy. + The new energy. + The difference between the old Hamiltonian and new Hamiltonian. Use to determine + if an update should take place. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Method for doing dot product. + + First vector/scalar in the product. + Second vector/scalar in the product. + + + + + Method for adding, multiply the second vector/scalar by factor and then + add it to the first vector/scalar. + + First vector/scalar. + Scalar factor multiplying by the second vector/scalar. + Second vector/scalar. + + + + Multiplying the second vector/scalar by factor and then subtract it from + the first vector/scalar. + + First vector/scalar. + Scalar factor to be multiplied to the second vector/scalar. + Second vector/scalar. + + + + Method for sampling a random momentum. + + Momentum to be randomized. + + + + The Hamiltonian equations that is used to produce the new sample. + + + + + Method to compute the Hamiltonian used in the method. + + The momentum. + The energy. + Hamiltonian=E+p.p/2 + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than or equal to zero. + Throws when value is negative. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than to zero. + Throws when value is negative or zero. + + + + Method to check and set a quantity to a non-negative value. + + Proposed value to be checked. + Returns value if it is greater than zero. + Throws when value is negative or zero. + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the number of iterations in the Hamiltonian equation. + + When frogleap steps is negative or zero. + + + + Gets or sets the size of each step in the Hamiltonian equation. + + When step size is negative or zero. + + + + The delegate type that defines a derivative evaluated at a certain point. + + Function to be differentiated. + Value where the derivative is computed. + + + + + Number of parameters in the density function. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of different components of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The burn interval will be set to 0. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the a random number generator provided by the user. + A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The components of the momentum will be sampled from a normal distribution with standard deviations + given by pSdv. This constructor will set the burn interval, the method used for + numerical differentiation and the random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviations of the normal distributions that are used to sample + the components of the momentum. + Random number generator used for sampling the momentum. + The method used for numerical differentiation. + When the number of burnInterval iteration is negative. + When the length of pSdv is not the same as x0. + + + + Initialize parameters. + + The current location of the sampler. + + + + Checking that the location and the momentum are of the same dimension and that each component is positive. + + The standard deviations used for sampling the momentum. + When the length of pSdv is not the same as Length or if any + component is negative. + When pSdv is null. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the gradient. Uses a simple three point estimation. + + Function which the gradient is to be evaluated. + The location where the gradient is to be evaluated. + The gradient of the function at the point x. + + + + Gets or sets the standard deviations used in the sampling of different components of the + momentum. + + When the length of pSdv is not the same as Length. + + + + Provides utilities to analysis the convergence of a set of samples from + a . + + + + + Computes the auto correlations of a series evaluated by a function f. + + The series for computing the auto correlation. + The lag in the series + The function used to evaluate the series. + The auto correlation. + Throws if lag is zero or if lag is + greater than or equal to the length of Series. + + + + Computes the effective size of the sample when evaluated by a function f. + + The samples. + The function use for evaluating the series. + The effective size when auto correlation is taken into account. + + + + A method which samples datapoints from a proposal distribution. The implementation of this sampler + is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it doesn't take any parameters; it samples random + variables from the whole domain. + + The type of the datapoints. + A sample from the proposal distribution. + + + + A method which samples datapoints from a proposal distribution given an initial sample. The implementation + of this sampler is stateless: no variables are saved between two calls to Sample. This proposal is different from + in that it samples locally around an initial point. In other words, it + makes a small local move rather than producing a global sample from the proposal. + + The type of the datapoints. + The initial sample. + A sample from the proposal distribution. + + + + A function which evaluates a density. + + The type of data the distribution is over. + The sample we want to evaluate the density for. + + + + A function which evaluates a log density. + + The type of data the distribution is over. + The sample we want to evaluate the log density for. + + + + A function which evaluates the log of a transition kernel probability. + + The type for the space over which this transition kernel is defined. + The new state in the transition. + The previous state in the transition. + The log probability of the transition. + + + + Metropolis-Hastings sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis-Hastings sampling doesn't require that the + proposal distribution Q is symmetric in comparison to . It does need to + be able to evaluate the proposal sampler's log density though. All densities are required to be in log space. + + The Metropolis-Hastings sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the target distribution. + + + + + Evaluates the log transition probability for the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis-Hastings sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + + + + Constructs a new Metropolis-Hastings sampler using the default random number generator. This + constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + The log transition probability for the proposal distribution. + A method that samples from the proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Metropolis sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P. Metropolis sampling requires that the proposal + distribution Q is symmetric. All densities are required to be in log space. + + The Metropolis sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + The type of samples this sampler produces. + + + + Evaluates the log density function of the sampling distribution. + + + + + A function which samples from a proposal distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + Constructs a new Metropolis sampler using the default random + number generator. The burnInterval interval will be set to 0. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + + + + Constructs a new Metropolis sampler using the default random number generator. + + The initial sample. + The log density of the distribution we want to sample from. + A method that samples from the symmetric proposal distribution. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Rejection sampling produces samples from distribition P by sampling from a proposal distribution Q + and accepting/rejecting based on the density of P and Q. The density of P and Q don't need to + to be normalized, but we do need that for each x, P(x) < Q(x). + + The type of samples this sampler produces. + + + + Evaluates the density function of the sampling distribution. + + + + + Evaluates the density function of the proposal distribution. + + + + + A function which samples from a proposal distribution. + + + + + Constructs a new rejection sampler using the default random number generator. + + The density of the distribution we want to sample from. + The density of the proposal distribution. + A method that samples from the proposal distribution. + + + + Returns a sample from the distribution P. + + When the algorithms detects that the proposal + distribution doesn't upper bound the target distribution. + + + + A hybrid Monte Carlo sampler for univariate distributions. + + + + + Distribution to sample momentum from. + + + + + Standard deviations used in the sampling of the + momentum. + + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The burn interval will be set to 0. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + 1 using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using the default random + number generator. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a univariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + specified by pSdv using a random + number generator provided by the user. A three point estimation will be used for differentiation. + This constructor will set the burn interval. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + Random number generator used to sample the momentum. + When the number of burnInterval iteration is negative. + + + + Constructs a new Hybrid Monte Carlo sampler for a multivariate probability distribution. + The momentum will be sampled from a normal distribution with standard deviation + given by pSdv using a random + number generator provided by the user. This constructor will set both the burn interval and the method used for + numerical differentiation. + + The initial sample. + The log density of the distribution we want to sample from. + Number frogleap simulation steps. + Size of the frogleap simulation steps. + The number of iterations in between returning samples. + The standard deviation of the normal distribution that is used to sample + the momentum. + The method used for numerical differentiation. + Random number generator used for sampling the momentum. + When the number of burnInterval iteration is negative. + + + + Use for copying objects in the Burn method. + + The source of copying. + A copy of the source object. + + + + Use for creating temporary objects in the Burn method. + + An object of type T. + + + + + + + + + + + + + Samples the momentum from a normal distribution. + + The momentum to be randomized. + + + + The default method used for computing the derivative. Uses a simple three point estimation. + + Function for which the derivative is to be evaluated. + The location where the derivative is to be evaluated. + The derivative of the function at the point x. + + + + Gets or sets the standard deviation used in the sampling of the + momentum. + + When standard deviation is negative. + + + + Slice sampling produces samples from distribition P by uniformly sampling from under the pdf of P using + a technique described in "Slice Sampling", R. Neal, 2003. All densities are required to be in log space. + + The slice sampler is a stateful sampler. It keeps track of where it currently is in the domain + of the distribution P. + + + + + Evaluates the log density function of the target distribution. + + + + + The current location of the sampler. + + + + + The log density at the current location. + + + + + The number of burn iterations between two samples. + + + + + The scale of the slice sampler. + + + + + Constructs a new Slice sampler using the default random + number generator. The burn interval will be set to 0. + + The initial sample. + The density of the distribution we want to sample from. + The scale factor of the slice sampler. + When the scale of the slice sampler is not positive. + + + + Constructs a new slice sampler using the default random number generator. It + will set the number of burnInterval iterations and run a burnInterval phase. + + The initial sample. + The density of the distribution we want to sample from. + The number of iterations in between returning samples. + The scale factor of the slice sampler. + When the number of burnInterval iteration is negative. + When the scale of the slice sampler is not positive. + + + + This method runs the sampler for a number of iterations without returning a sample + + + + + Returns a sample from the distribution P. + + + + + Gets or sets the number of iterations in between returning samples. + + When burn interval is negative. + + + + Gets or sets the scale of the slice sampler. + + + + + Methods to calculate the percentiles. + + + + + Using the method recommened my NIST, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Using the nearest rank, http://en.wikipedia.org/wiki/Percentile#Nearest_Rank + + + + + Using the same method as Excel does, + http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm + + + + + Use linear interpolation between the two nearest ranks, + http://en.wikipedia.org/wiki/Percentile#Linear_Interpolation_Between_Closest_Ranks + + + + + Class to calculate percentiles. + + + + + Holds the data. + + + + + Initializes a new instance of the class. + + The data to calculate the percentiles of. + + + + Computes the percentile. + + The percentile, must be between 0.0 and 1.0 (inclusive). + the requested percentile. + + + + Computes the percentiles for the given list. + + The percentiles, must be between 0.0 and 1.0 (inclusive) + the values that correspond to the given percentiles. + + + + Gets or sets the method used to calculate the percentiles. + + The calculation method. + defaults to . + + + + Statistics operating on an array already sorted ascendingly. + + + + + + + + Returns the smallest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the largest value from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + + + + Returns the order statistic (order 1..N) from the sorted data array (ascending). + + Sample array, must be sorted ascendingly. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Estimates the median value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the p-Percentile value from the sorted data array (ascending). + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the first quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the third quartile value from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the inter-quartile range from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the sorted data array (ascending). + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + R-8, SciPy-(1/3,1/3): + Linear interpolation of the approximate medians for order statistics. + When tau < (2/3) / (N + 1/3), use x1. When tau >= (N - 1/3) / (N + 1/3), use xN. + + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile defintion can be specified + by 4 parameters a, b, c and d, consistent with Mathematica. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the sorted data array (ascending). + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + Sample array, must be sorted ascendingly. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + Extension methods to return basic statistics on set of data. + + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The minimum value in the sample data. + + + + Returns the minimum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The minimum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + + The sample data. + The maximum value in the sample data. + + + + Returns the maximum value in the sample data. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The sample data. + The maximum value in the sample data. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the sample mean. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The data to calculate the mean of. + The mean of the sample. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population variance from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population variance from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + A subset of samples, sampled from the full population. + + + + Estimates the unbiased population standard deviation from the provided samples. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + Null-entries are ignored. + + A subset of samples, sampled from the full population. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + The full population data. + + + + Evaluates the biased population standard deviation from the provided full population. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + Null-entries are ignored. + + The full population data. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the sample median from the provided samples (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + Estimates the empirical inverse CDF at tau from the provided samples. + + The data sample sequence. + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile selector, between 0.0 and 1.0 (inclusive). + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + stimates the tau-th quantile from the provided samples. + The tau-th quantile is the data value where the cumulative distribution + function crosses tau. The quantile definition can be specificed to be compatible + with an existing system. + + The data sample sequence. + Quantile definition, to choose what product/definition it should be consistent with + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + Percentile selector, between 0 and 100 (inclusive). + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the p-Percentile value from the provided samples. + If a non-integer Percentile is needed, use Quantile instead. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the first quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the third quartile value from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates the inter-quartile range from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Estimates {min, lower-quantile, median, upper-quantile, max} from the provided samples. + Approximately median-unbiased regardless of the sample distribution (R8). + + The data sample sequence. + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + One-based order of the statistic, must be between 1 and N (inclusive). + + + + Returns the order statistic (order 1..N) from the provided samples. + + The data sample sequence. + + + + Statistics operating on an IEnumerable in a single pass, without keeping the full data in memory. + Can be used in a streaming way, e.g. on large datasets not fitting into memory. + + + + + + + + Returns the smallest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Returns the largest value from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the arithmetic sample mean from the enumerable, in a single pass without memoization. + Returns NaN if data is empty or any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population variance from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Estimates the unbiased population standard deviation from the provided samples as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N-1 normalizer. + Returns NaN if data has less than two entries or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population variance from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Evaluates the biased population standard deviation from the provided full population as enumerable sequence, in a single pass without memoization. + On a dataset of size N will use an N normalizer. + Returns NaN if data is empty or if any entry is NaN. + + Sample stream, no sorting is assumed. + + + + Used to simplify parallel code, particularly between the .NET 4.0 and Silverlight Code. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The body to be invoked for each iteration range. + + + + Executes a for loop in which iterations may run in parallel. + + The array to iterate over. + The body to be invoked for each iteration. + The argument is null. + At least one invocation of the body threw an exception. + + + + Executes each of the provided actions inside a discrete, asynchronous task. + + An array of actions to execute. + The actions array contains a null element. + At least one invocation of the actions threw an exception. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + The selected value. + + + + Selects an item (such as Max or Min). + + Starting index of the loop. + Ending index of the loop + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Selects an item (such as Max or Min). + + The array to iterate over. + The function to select items over a subset. + The function to select the item of selection from the subsets. + Default result of the reduce function on an empty set. + The selected value. + + + + Double-precision trigonometry toolkit. + + + + + Constant to convert a degree to grad. + + + + + Trigonometric Cosecant of an angle in radian. + + + The angle in radian. + + + Cosecant of an angle in radian. + + + + + Trigonometric Cosecant of a Complex number. + + + The complex value. + + + The cosecant of a complex number. + + + + + Trigonometric Cosine of an angle in radian. + + + The angle in radian. + + + The cosine of an angle in radian. + + + + + Trigonometric Cosine of a Complex number. + + + The complex value. + + + The cosine of a complex number. + + + + + Trigonometric Cotangent of an angle in radian. + + + The angle in radian. + + + The cotangent of an angle in radian. + + + + + Trigonometric Cotangent of a Complex number. + + + The complex value. + + + The cotangent of the complex number. + + + + + Converts a degree (360-periodic) angle to a grad (400-periodic) angle. + + + The degree to convert. + + + The converted grad angle. + + + + + Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + + + The degree to convert. + + + The converted radian angle. + + + + + Converts a grad (400-periodic) angle to a degree (360-periodic) angle. + + + The grad to convert. + + + The converted degree. + + + + + Converts a grad (400-periodic) angle to a radian (2*Pi-periodic) angle. + + + The grad to convert. + + + The converted radian. + + + + + Trigonometric Hyperbolic Cosecant + + + The angle in radian. + + + The hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Cosecant of a Complex number. + + + The complex value. + + + The hyperbolic cosecant of a complex number. + + + + + Trigonometric Hyperbolic Cosine + + + The angle in radian. + + + The hyperbolic Cosine of the radian angle. + + + + + Trigonometric Hyperbolic Cosine of a Complex number. + + + The complex value. + + + The hyperbolic cosine of a complex number. + + + + + Trigonometric Hyperbolic Cotangent + + + The angle in radian angle. + + + The hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Cotangent of a Complex number. + + + The complex value. + + + The hyperbolic cotangent of a complex number. + + + + + Trigonometric Hyperbolic Secant + + + The angle in radian angle. + + + The hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Secant of a Complex number. + + + The complex value. + + + The hyperbolic secant of a complex number. + + + + + Trigonometric Hyperbolic Sine + + + The angle in radian angle. + + + The hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Sine of a Complex number. + + + The complex value. + + + The hyperbolic sine of a complex number. + + + + + Trigonometric Hyperbolic Tangent in radian + + + The angle in radian angle. + + + The hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Tangent of a Complex number. + + + The complex value. + + + The hyperbolic tangent of a complex number. + + + + + Trigonometric Arc Cosecant in radian + + + The angle in radian angle. + + + The inverse cosecant of the radian angle. + + + if -1 < < 1. + + + + + Trigonometric Arc Cosecant of this Complex number. + + + The complex value. + + + The arc cosecant of a complex number. + + + + + Trigonometric Arc Cosine in radian + + + The angle in radian angle. + + + The inverse cosine of the radian angle. + + + if 1 < or < -1. + + + + + Trigonometric Arc Cosine of this Complex number. + + + The complex value. + + + The arc cosine of a complex number. + + + + + Trigonometric Arc Cotangent in radian + + + The angle in radian angle. + + + The inverse cotangent of the radian angle. + + + + + Trigonometric Arc Cotangent of this Complex number. + + + The complex value. + + + The arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Arc Cosecant + + + The angle in radian angle. + + + The inverse hyperbolic cosecant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosecant of this Complex number. + + + The complex value. + + + The hyperbolic arc cosecant of a complex number. + + + + + Trigonometric Hyperbolic Area Cosine + + + The angle in radian angle. + + + The inverse hyperbolic cosine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cosine of this Complex number. + + + The complex value. + + + The hyperbolic arc cosine of a complex number. + + + + + Trigonometric Hyperbolic Arc Cotangent + + + The angle in radian angle. + + + The inverse hyperbolic cotangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Cotangent of this Complex number. + + + The complex value. + + + The hyperbolic arc cotangent of a complex number. + + + + + Trigonometric Hyperbolic Area Secant + + + The angle in radian angle. + + + The inverse hyperbolic secant of the radian angle. + + + + + Trigonometric Hyperbolic Arc Secant of this Complex number. + + + The complex value. + + + The hyperbolic arc secant of a complex number. + + + + + Trigonometric Hyperbolic Area Sine + + + The angle in radian angle. + + + The inverse hyperbolic sine of the radian angle. + + + + + Trigonometric Hyperbolic Arc Sine of this Complex number. + + + The complex value. + + + The hyperbolic arc sine of a complex number. + + + + + Trigonometric Hyperbolic Area Tangent + + + The angle in radian angle. + + + The inverse hyperbolic tangent of the radian angle. + + + + + Trigonometric Hyperbolic Arc Tangent of this Complex number. + + + The complex value. + + + The hyperbolic arc tangent of a complex number. + + + + + Trigonometric Arc Secant in radian + + + The angle in radian angle. + + + The inverse secant of the radian angle. + + + + + Trigonometric Arc Secant of this Complex number. + + + The complex value. + + + The arc secant of a complex number. + + + + + Trigonometric Arc Sine in radian + + + The angle in radian angle. + + + The inverse sine of the radian angle. + + + + + Trigonometric Arc Sine of this Complex number. + + + The complex value. + + + The arc sine of a complex number. + + + + + Trigonometric Arc Tangent in radian + + + The angle in radian angle. + + + The inverse tangent of the radian angle. + + + + + Trigonometric Arc Tangent of this Complex number. + + + The complex value. + + + The arc tangent of a complex number. + + + + + Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + + + The radian to convert. + + + The converted degree. + + + + + Converts a radian (2*Pi-periodic) angle to a grad (400-periodic) angle. + + + The radian to convert. + + + The converted grad. + + + + + Trigonometric Secant of an angle in radian + + + The angle in radian. + + + The secant of the radian angle. + + + + + Trigonometric Secant of a Complex number. + + + The complex value. + + + The secant of the complex number. + + + + + Trigonometric Sine of an angle in radian + + + The angle in radian. + + + The sine of the radian angle. + + + + + Trigonometric Sine of a Complex number. + + + The complex value. + + + The sine of the complex number. + + + + + Trigonometric Tangent of an angle in radian + + + The angle in radian. + + + The tangent of the radian angle. + + + + + Trigonometric Tangent of a Complex number. + + + The complex value. + + + The tangent of the complex number. + + +
+
diff --git a/packages/MathNet.Numerics.2.5.0/license.txt b/packages/MathNet.Numerics.2.5.0/license.txt new file mode 100644 index 0000000..8ee4a87 --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/license.txt @@ -0,0 +1,94 @@ +Math.NET Numerics License (MIT/X11) +=================================== + +Copyright (c) 2002-2013 Math.NET + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Other Copyrights +================ + +Portions of code are inspired by or derived from code +covered by the following copyrights: + +ALGLIB +------ + +Any code from ALGLIB is from version 2.0.1 which is distributed +under the license below. + +Copyright (c) 2007, Sergey Bochkanov (ALGLIB project). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer listed + in this license in the documentation and/or other materials + provided with the distribution. + +- Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +BOOST +----- + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/packages/MathNet.Numerics.2.5.0/readme.txt b/packages/MathNet.Numerics.2.5.0/readme.txt new file mode 100644 index 0000000..dba3757 --- /dev/null +++ b/packages/MathNet.Numerics.2.5.0/readme.txt @@ -0,0 +1,116 @@ +Math.NET Numerics Release Notes +=============================== + +- **Website: [numerics.mathdotnet.com](http://numerics.mathdotnet.com)** +- GitHub/Mainline: [github.com/mathnet/mathnet-numerics](https://github.com/mathnet/mathnet-numerics) +- CodePlex: [mathnetnumerics.codeplex.com](http://mathnetnumerics.codeplex.com) +- License: MIT/X11 Open Source + +NuGet Packages, available in the [NuGet Gallery](https://nuget.org/profiles/mathnet/): + +- `MathNet.Numerics` - core package, including both .Net 4 and portable builds +- `MathNet.Numerics.FSharp` - optional extensions for a better F# experience +- `MathNet.Numerics.MKL.Win-x86` - optional Linear Algebra MKL native provider +- `MathNet.Numerics.MKL.Win-x64` - optional Linear Algebra MKL native provider +- `MathNet.Numerics.Signed` - strong-named version of the core package (not recommended) +- `MathNet.Numerics.Samples` - code samples in C# +- `MathNet.Numerics.FSharp.Samples` - code samples in F# + +Zip Packages, available on [CodePlex](http://mathnetnumerics.codeplex.com/releases): + +- Binaries - core package and F# extensions, including both .Net 4 and portable builds +- Signed Binaries - strong-named version of the core package (not recommended) + +Over time some members and classes have been replaced with more suitable alternatives. In order to maintain compatibility, such parts are not removed immediately but instead marked with the **Obsolete**-attribute. We strongly recommend to follow the instructions in the attribute text whenever you find any code calling an obsolete member, since we *do* intend to remove them at the next *major* release, v3.0. + +v2.5.0 - April 14, 2013 +----------------------- + +### *Potentially Breaking Changes:* + +Despite semver this release contains two changes that may break code but without triggering a major version number change. The changes fix semantic bugs and a major usability issue without changing the formal API itself. Most users are not expected to be affected negatively. Nevertheless, this is an exceptional case and we try hard to avoid such changes in the future. + +- Statistics: Empty statistics now return NaN instead of either 0 or throwing an exception. *This may break code in case you relied upon the previous unusual and inconsistent behavior.* + +- Linear Algebra: More reasonable ToString behavior for matrices and vectors. *This may break code if you relied upon ToString to export your full data to text form intended to be parsed again later. Note that the classes in the MathNet.Numerics.IO library are more appropriate for storing and loading data.* + +### Statistics: + +- More consistent behavior for empty and single-element data sets: Min, Max, Mean, Variance, Standard Deviation etc. no longer throw exceptions if the data set is empty but instead return NaN. Variance and Standard Deviation will also return NaN if the set contains only a single entry. Population Variance and Population Standard Deviation will return 0 in this case. +- Reworked order statistics (Quantile, Quartile, Percentile, IQR, Fivenum, etc.), now much easier to use and supporting compatibility with all 9 R-types, Excel and Mathematica. The obsolete Percentile class now leverages the new order statistics, fixing a range check bug as side effect. +- New Hybrid Monte Carlo sampler for multivariate distributions. +- New financial statistics: absolute risk and return measures. +- Explicit statistics for sorted arrays, unsorted arrays and sequences/streams. Faster algorithms on sorted data, also avoids multiple enumerations. +- Some statistics like Quantile or empirical inverse CDF can optionally return a parametric function when multiple evaluations are needed, like for plotting. + +### Linear Algebra: + +- More reasonable ToString behavior for matrices and vectors: `ToString` methods no longer render the whole structure to a string for large data, among others because they used to wreak havoc in debugging and interactive scenarios like F# FSI. Instead, ToString now only renders an excerpt of the data, together with a line about dimension, type and in case of sparse data a sparseness indicator. The intention is to give a good idea about the data in a visually useful way. How much data is shown can be adjusted in the Control class. See also ToTypeString and ToVector/MatrixString. +- Performance: reworked and tuned common parallelization. Some operations are up to 3 magnitudes faster in some extreme cases. Replaced copy loops with native routines. More algorithms are storage-aware (and should thus perform better especially on sparse data). +- Fixed range checks in the Thin-QR decomposition. +- Fixed bug in Gram Schmidt for solving tall matrices. +- Vectors now implement the BCL IList interfaces (fixed-length) for better integration with existing .Net code. +- Matrix/Vector parsing has been updated to be able to parse the new visual format as well (see ToMatrixString). +- DebuggerDisplay attributes for matrices and vectors. +- Map/IndexedMap combinators with storage-aware and partially parallelized implementations for both dense and sparse data. +- Reworked Matrix/Vector construction from arrays, enumerables, indexed enumerables, nested enumerables or by providing an init function/lambda. Non-obsolete constructors now always use the raw data array directly without copying, while static functions always return a matrix/vector independent of the provided data source. +- F#: Improved extensions for matrix and vector construction: create, zeroCreate, randomCreate, init, ofArray2, ofRows/ofRowsList, ofColumns/ofSolumnsList, ofSeqi/Listi (indexed). Storage-aware for performance. +- F#: Updated map/mapi and other combinators to leverage core implementation, added -nz variants where zero-values may be skipped (relevant mostly for sparse matrices). +- F#: Idiomatic slice setters for sub-matrices and sub-vectors +- F#: More examples for matrix/vector creation and linear regression in the F# Sample-package. + +### Misc: + +- Control: Simpler usage with new static ConfigureAuto and ConfigureSingleThread methods. Resolved misleading configuration logic and naming around disabling parallelization. +- Control: New settings for linear algebra ToString behavior. +- Fixed range check in the Xor-shift pseudo-RNG. +- Parallelization: Reworked our common logic to avoid expensive lambda calls in inner loops. Tunable. +- F#: Examples (and thus the NuGet Sample package) are now F# scripts prepared for experimenting interactively in FSI, instead of normal F# files. Tries to get the assembly references right for most users, both within the Math.NET Numerics solution and the NuGet package. +- Various minor improvements on consistency, performance, tests, xml docs, obsolete attributes, redundant code, argument checks, resources, cleanup, nuget, etc. + + +v2.4.0 - February 3, 2013 +------------------------- + +- Drops the dependency on the zlib library. We thus no longer have any dependencies on other packages. +- Adds Modified Bessel & Struve special functions +- Fixes a bug in our iterative kurtosis statistics formula + +### Linear Algebra: + +- Performance work, this time mostly around accessing matrix rows/columns as vectors. Opting out from targeted patching in our matrix and vector indexers to allow inlining. +- Fixes an issue around Thin-QR solve +- Simplifications around using native linear algebra providers (see Math.NET Numerics With Native Linear Algebra) + +### F#: + +- Adds the BigRational module from the F# PowerPack, now to be maintained here instead. +- Better support for our Complex types (close to the F# PowerPack Complex type) + + +v2.3.0 - November 25, 2012 +-------------------------- + +### Portable Library Build: + +- Adds support for WP8 (.Net 4.0 and higher, SL5, WP8 and .NET for Windows Store apps) +- New: portable build also for F# extensions (.Net 4.5, SL5 and .NET for Windows Store apps) +- NuGet: portable builds are now included in the main packages, no more need for special portable packages + +### Linear Algebra: + +- Continued major storage rework, in this release focusing on vectors (previous release was on matrices) +- Thin QR decomposition (in addition to existing full QR) +- Static CreateRandom for all dense matrix and vector types +- F#: slicing support for matrices and vectors + +### Random and Probability Distributions: + +- Consistent static Sample methods for all continuous and discrete distributions (was previously missing on a few) +- F#: better usability for random numbers and distributions. + +### Misc: + +- F# extensions are now using F# 3.0 +- Updated Intel MKL references for our native linear algebra providers +- Various bug, performance and usability fixes diff --git a/packages/repositories.config b/packages/repositories.config new file mode 100644 index 0000000..0dec135 --- /dev/null +++ b/packages/repositories.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file